智能合約調(diào)用是實(shí)現(xiàn)一個 DApp 的關(guān)鍵,一個完整的 DApp 包括前端、后端、智能合約及區(qū)塊 鏈系統(tǒng),智能合約的調(diào)用是連接區(qū)塊鏈與前后端的關(guān)鍵。

撫遠(yuǎn)ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
我們先來了解一下智能合約調(diào)用的基礎(chǔ)原理。智能合約運(yùn)行在以太坊節(jié)點(diǎn)的 EVM 中。因此要 想調(diào)用合約必須要訪問某個節(jié)點(diǎn)。
以后端程序?yàn)槔蠖朔?wù)若想連接節(jié)點(diǎn)有兩種可能,一種是雙 方在同一主機(jī),此時后端連接節(jié)點(diǎn)可以采用 本地 IPC(Inter-Process Communication,進(jìn) 程間通信)機(jī)制,也可以采用 RPC(Remote Procedure Call,遠(yuǎn)程過程調(diào)用)機(jī)制;另 一種情況是雙方不在同一臺主機(jī),此時只能采用 RPC 機(jī)制進(jìn)行通信。
提到 RPC, 讀者應(yīng)該對 Geth 啟動參數(shù)有點(diǎn)印象,Geth 啟動時可以選擇開啟 RPC 服務(wù),對應(yīng)的 默認(rèn)服務(wù)端口是 8545。。
接著,我們來了解一下智能合約運(yùn)行的過程。
智能合約的運(yùn)行過程是后端服務(wù)連接某節(jié)點(diǎn),將 智能合約的調(diào)用(交易)發(fā)送給節(jié)點(diǎn),節(jié)點(diǎn)在驗(yàn)證了交易的合法性后進(jìn)行全網(wǎng)廣播,被礦工打包到 區(qū)塊中代表此交易得到確認(rèn),至此交易才算完成。
就像數(shù)據(jù)庫一樣,每個區(qū)塊鏈平臺都會提供主流 開發(fā)語言的 SDK(Software Development Kit,軟件開發(fā)工具包),由于 Geth 本身就是用 Go 語言 編寫的,因此若想使用 Go 語言連接節(jié)點(diǎn)、發(fā)交易,直接在工程內(nèi)導(dǎo)入 go-ethereum(Geth 源碼) 包就可以了,剩下的問題就是流程和 API 的事情了。
總結(jié)一下,智能合約被調(diào)用的兩個關(guān)鍵點(diǎn)是節(jié)點(diǎn)和 SDK。
由于 IPC 要求后端與節(jié)點(diǎn)必須在同一主機(jī),所以很多時候開發(fā)者都會采用 RPC 模式。除了 RPC,以太坊也為開發(fā)者提供了 json- rpc 接口,本文就不展開討論了。
接下來介紹如何使用 Go 語言,借助 go-ethereum 源碼庫來實(shí)現(xiàn)智能合約的調(diào)用。這是有固定 步驟的,我們先來說一下總體步驟,以下面的合約為例。
步驟 01:編譯合約,獲取合約 ABI(Application Binary Interface,應(yīng)用二進(jìn)制接口)。 單擊【ABI】按鈕拷貝合約 ABI 信息,將其粘貼到文件 calldemo.abi 中(可使用 Go 語言IDE 創(chuàng)建該文件,文件名可自定義,后綴最好使用 abi)。
最好能將 calldemo.abi 單獨(dú)保存在一個目錄下,輸入“l(fā)s”命令只能看到 calldemo.abi 文件,參 考效果如下:
步驟 02:獲得合約地址。注意要將合約部署到 Geth 節(jié)點(diǎn)。因此 Environment 選擇為 Web3 Provider。
在【Environment】選項(xiàng)框中選擇“Web3 Provider”,然后單擊【Deploy】按鈕。
部署后,獲得合約地址為:0xa09209c28AEf59a4653b905792a9a910E78E7407。
步驟 03:利用 abigen 工具(Geth 工具包內(nèi)的可執(zhí)行程序)編譯智能合約為 Go 代碼。abigen 工具的作用是將 abi 文件轉(zhuǎn)換為 Go 代碼,命令如下:
其中各參數(shù)的含義如下。 (1)abi:是指定傳入的 abi 文件。 (2)type:是指定輸出文件中的基本結(jié)構(gòu)類型。 (3)pkg:指定輸出文件 package 名稱。 (4)out:指定輸出文件名。 執(zhí)行后,將在代碼目錄下看到 funcdemo.go 文件,讀者可以打開該文件欣賞一下,注意不要修改它。
步驟 04:創(chuàng)建 main.go,填入如下代碼。 注意代碼中 HexToAddress 函數(shù)內(nèi)要傳入該合約部署后的地址,此地址在步驟 01 中獲得。
步驟 04:設(shè)置 go mod,以便工程自動識別。
前面有所提及,若要使用 Go 語言調(diào)用智能合約,需要下載 go-ethereum 工程,可以使用下面 的指令:
該指令會自動將 go-ethereum 下載到“$GOPATH/src/github.com/ethereum/go-ethereum”,這樣還算 不錯。不過,Go 語言自 1.11 版本后,增加了 module 管理工程的模式。只要設(shè)置好了 go mod,下載 依賴工程的事情就不必關(guān)心了。
接下來設(shè)置 module 生效和 GOPROXY,命令如下:
在項(xiàng)目工程內(nèi),執(zhí)行初始化,calldemo 可以自定義名稱。
步驟 05:運(yùn)行代碼。執(zhí)行代碼,將看到下面的效果,以及最終輸出的 2020。
上述輸出信息中,可以看到 Go 語言會自動下載依賴文件,這就是 go mod 的神奇之處。看到 2020,相信讀者也知道運(yùn)行結(jié)果是正確的了。
【格式化輸出】
// 格式化輸出:將 arg 列表中的 arg 轉(zhuǎn)換為字符串輸出
// 使用動詞 v 格式化 arg 列表,非字符串元素之間添加空格
Print(arg列表)
// 使用動詞 v 格式化 arg 列表,所有元素之間添加空格,結(jié)尾添加換行符
Println(arg列表)
// 使用格式字符串格式化 arg 列表
Printf(格式字符串, arg列表)
// Print 類函數(shù)會返回已處理的 arg 數(shù)量和遇到的錯誤信息。
【格式字符串】
格式字符串由普通字符和占位符組成,例如:
"abc%+ #8.3[3]vdef"
其中 abc 和 def 是普通字符,其它部分是占位符,占位符以 % 開頭(注:%% 將被轉(zhuǎn)義為一個普通的 % 符號,這個不算開頭),以動詞結(jié)尾,格式如下:
%[旗標(biāo)][寬度][.精度][arg索引]動詞
方括號中的內(nèi)容可以省略。
【旗標(biāo)】
旗標(biāo)有以下幾種:
空格:對于數(shù)值類型的正數(shù),保留一個空白的符號位(其它用法在動詞部分說明)。
0 :用 0 進(jìn)行寬度填充而不用空格,對于數(shù)值類型,符號將被移到所有 0 的前面。
其中 "0" 和 "-" 不能同時使用,優(yōu)先使用 "-" 而忽略 "0"。
【寬度和精度】
“寬度”和“精度”都可以寫成以下三種形式:
數(shù)值 | * | arg索引*
其中“數(shù)值”表示使用指定的數(shù)值作為寬度值或精度值,“ ”表示使用當(dāng)前正在處理的 arg 的值作為寬度值或精度值,如果這樣的話,要格式化的 arg 將自動跳轉(zhuǎn)到下一個。“arg索引 ”表示使用指定 arg 的值作為寬度值或精度值,如果這樣的話,要格式化的 arg 將自動跳轉(zhuǎn)到指定 arg 的下一個。
寬度值:用于設(shè)置最小寬度。
精度值:對于浮點(diǎn)型,用于控制小數(shù)位數(shù),對于字符串或字節(jié)數(shù)組,用于控制字符數(shù)量(不是字節(jié)數(shù)量)。
對于浮點(diǎn)型而言,動詞 g/G 的精度值比較特殊,在適當(dāng)?shù)那闆r下,g/G 會設(shè)置總有效數(shù)字,而不是小數(shù)位數(shù)。
【arg 索引】
“arg索引”由中括號和 arg 序號組成(就像上面示例中的 [3]),用于指定當(dāng)前要處理的 arg 的序號,序號從 1 開始:
'[' + arg序號 + ']'
【動詞】
“動詞”不能省略,不同的數(shù)據(jù)類型支持的動詞不一樣。
[通用動詞]
v:默認(rèn)格式,不同類型的默認(rèn)格式如下:
布爾型:t
整 型:d
浮點(diǎn)型:g
復(fù)數(shù)型:g
字符串:s
通 道:p
指 針:p
無符號整型:x
T:輸出 arg 的類型而不是值(使用 Go 語法格式)。
[布爾型]
t:輸出 true 或 false 字符串。
[整型]
b/o/d:輸出 2/8/10 進(jìn)制格式
x/X :輸出 16 進(jìn)制格式(小寫/大寫)
c :輸出數(shù)值所表示的 Unicode 字符
q :輸出數(shù)值所表示的 Unicode 字符(帶單引號)。對于無法顯示的字符,將輸出其轉(zhuǎn)義字符。
U :輸出 Unicode 碼點(diǎn)(例如 U+1234,等同于字符串 "U+%04X" 的顯示結(jié)果)
對于 o/x/X:
如果使用 "#" 旗標(biāo),則會添加前導(dǎo) 0 或 0x。
對于 U:
如果使用 "#" 旗標(biāo),則會在 Unicode 碼點(diǎn)后面添加相應(yīng)的 '字符'(前提是該字符必須可顯示)
[浮點(diǎn)型和復(fù)數(shù)型]
b :科學(xué)計(jì)數(shù)法(以 2 為底)
e/E:科學(xué)計(jì)數(shù)法(以 10 為底,小寫 e/大寫 E)
f/F:普通小數(shù)格式(兩者無區(qū)別)
g/G:大指數(shù)(指數(shù) = 6)使用 %e/%E,其它情況使用 %f/%F
[字符串或字節(jié)切片]
s :普通字符串
q :雙引號引起來的 Go 語法字符串
x/X:十六進(jìn)制編碼(小寫/大寫,以字節(jié)為元素進(jìn)行編碼,而不是字符)
對于 q:
如果使用了 "+" 旗標(biāo),則將所有非 ASCII 字符都進(jìn)行轉(zhuǎn)義處理。
如果使用了 "#" 旗標(biāo),則輸出反引號引起來的字符串(前提是
字符串中不包含任何制表符以外的控制字符,否則忽略 # 旗標(biāo))
對于 x/X:
如果使用了 " " 旗標(biāo),則在每個元素之間添加空格。
如果使用了 "#" 旗標(biāo),則在十六進(jìn)制格式之前添加 0x 前綴。
[指針類型]
p :帶 0x 前綴的十六進(jìn)制地址值。
[符合類型]
復(fù)合類型將使用不同的格式輸出,格式如下:
結(jié) 構(gòu) 體:{字段1 字段2 ...}
數(shù)組或切片:[元素0 元素1 ...]
映 射:map[鍵1:值1 鍵2:值2 ...]
指向符合元素的指針:{}, [], map[]
復(fù)合類型本身沒有動詞,動詞將應(yīng)用到復(fù)合類型的元素上。
結(jié)構(gòu)體可以使用 "+v" 同時輸出字段名。
【注意】
1、如果 arg 是一個反射值,則該 arg 將被它所持有的具體值所取代。
2、如果 arg 實(shí)現(xiàn)了 Formatter 接口,將調(diào)用它的 Format 方法完成格式化。
3、如果 v 動詞使用了 # 旗標(biāo)(%#v),并且 arg 實(shí)現(xiàn)了 GoStringer 接口,將調(diào)用它的 GoString 方法完成格式化。
如果格式化操作指定了字符串相關(guān)的動詞(比如 %s、%q、%v、%x、%X),接下來的兩條規(guī)則將適用:
4。如果 arg 實(shí)現(xiàn)了 error 接口,將調(diào)用它的 Error 方法完成格式化。
5。如果 arg 實(shí)現(xiàn)了 string 接口,將調(diào)用它的 String 方法完成格式化。
在實(shí)現(xiàn)格式化相關(guān)接口的時候,要避免無限遞歸的情況,比如:
type X string
func (x X) String() string {
return Sprintf("%s", x)
}
在格式化之前,要先轉(zhuǎn)換數(shù)據(jù)類型,這樣就可以避免無限遞歸:
func (x X) String() string {
return Sprintf("%s", string(x))
}
無限遞歸也可能發(fā)生在自引用數(shù)據(jù)類型上面,比如一個切片的元素引用了切片自身。這種情況比較罕見,比如:
a := make([]interface{}, 1)
a[0] = a
fmt.Println(a)
【格式化輸入】
// 格式化輸入:從輸入端讀取字符串(以空白分隔的值的序列),
// 并解析為具體的值存入相應(yīng)的 arg 中,arg 必須是變量地址。
// 字符串中的連續(xù)空白視為單個空白,換行符根據(jù)不同情況處理。
// \r\n 被當(dāng)做 \n 處理。
// 以動詞 v 解析字符串,換行視為空白
Scan(arg列表)
// 以動詞 v 解析字符串,換行結(jié)束解析
Scanln(arg列表)
// 根據(jù)格式字符串中指定的格式解析字符串
// 格式字符串中的換行符必須和輸入端的換行符相匹配。
Scanf(格式字符串, arg列表)
// Scan 類函數(shù)會返回已處理的 arg 數(shù)量和遇到的錯誤信息。
【格式字符串】
格式字符串類似于 Printf 中的格式字符串,但下面的動詞和旗標(biāo)例外:
p :無效
T :無效
e/E/f/F/g/G:功能相同,都是掃描浮點(diǎn)數(shù)或復(fù)數(shù)
s/v :對字符串而言,掃描一個被空白分隔的子串
對于整型 arg 而言,v 動詞可以掃描帶有前導(dǎo) 0 或 0x 的八進(jìn)制或十六進(jìn)制數(shù)值。
寬度被用來指定最大掃描寬度(不會跨越空格),精度不被支持。
如果 arg 實(shí)現(xiàn)了 Scanner 接口,將調(diào)用它的 Scan 方法掃描相應(yīng)數(shù)據(jù)。只有基礎(chǔ)類型和實(shí)現(xiàn)了 Scanner 接口的類型可以使用 Scan 類方法進(jìn)行掃描。
【注意】
連續(xù)調(diào)用 FScan 可能會丟失數(shù)據(jù),因?yàn)?FScan 中使用了 UnreadRune 對讀取的數(shù)據(jù)進(jìn)行撤銷,而參數(shù) io.Reader 只有 Read 方法,不支持撤銷。比如:
作為一個測試,作為一個測試開發(fā), 全棧化+管理 是我們未來的發(fā)展方向。已經(jīng)掌握了Java、Python、HTML的你,是不是也想了解下最近異常火爆的Go語言呢?來吧,讓我們一起了解下。
Go 是一個開源的編程語言 ,它能讓構(gòu)造簡單、可靠且高效的軟件變得容易。
Go是從2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持開發(fā),后來還加入了Ian Lance Taylor, Russ Cox等人,并最終于2009年11月開源,在2012年早些時候發(fā)布了Go 1穩(wěn)定版本。現(xiàn)在Go的開發(fā)已經(jīng)是完全開放的,并且擁有一個活躍的社區(qū)。這三個人都是計(jì)算機(jī)界的大神,有的參與了C語言的編寫,有的還是數(shù)學(xué)大神,有的還獲得了計(jì)算機(jī)最高榮譽(yù)-圖靈獎。
接下來說說 Go語言的特色 :
簡潔、快速、安全
并行、有趣、開源
內(nèi)存管理、數(shù)組安全、編譯迅速
Go語言的用途 :
Go 語言被設(shè)計(jì)成一門應(yīng)用于搭載 Web 服務(wù)器,存儲集群或類似用途的巨型中央服務(wù)器的系統(tǒng)編程語言。
對于高性能分布式系統(tǒng)領(lǐng)域而言,Go 語言無疑比大多數(shù)其它語言有著更高的開發(fā)效率。它提供了海量并行的支持,這對于 游戲 服務(wù)端的開發(fā)而言是再好不過了。
Go語言的環(huán)境安裝:
建議直接打開 官方地址因?yàn)閴Φ脑虼虿婚_
因?yàn)槲矣玫氖莣indows系統(tǒng),這里主要講下Windows系統(tǒng)上使用Go語言來編程。
Windows 下可以使用 .msi 后綴(在下載列表中可以找到該文件,如go1.17.2.windows-amd64.msi)的安裝包來安裝。
默認(rèn)情況下 .msi 文件會安裝在 c:Go 目錄下。你可以將 c:Gobin 目錄添加到 Path 環(huán)境變量中。添加后你需要重啟命令窗口才能生效。個人建議還是安裝到 Program Files文件夾中。
使用什么開發(fā)工具來對Go語言進(jìn)行編寫:
個人建議用VS code, 也可以用Sublime Text來編輯。如果你之前看了我講的HTML語言的學(xué)習(xí),肯定已經(jīng)下載了VS code. 那么這時你需要在VS code中下載Go語言的擴(kuò)展插件。
這里有一個巨大的坑,就是在下載Go的插件和依賴包時,會提示一些包沒有。主要是因?yàn)橄螺d的依賴包部分被墻了,只能想別的辦法去下載。
建議參考網(wǎng)頁:
解決vscode中g(shù)olang插件安裝失敗方法
在學(xué)習(xí)go的過程中,使用的是vscode,但是一直提示安裝相關(guān)插件失敗,然后上網(wǎng)查方法,基本上是叫你建立golang.org目錄什么的,結(jié)果全是錯的,而且都是抄襲,很煩。無意之中看到一位博主分享的方法,他也是飽受上述的垃圾博文困擾,然后找到了解決方法,這里向他致敬,秉著讓更多人看到正確解決方法的心,我寫下正確的解決方法,希望對你有所幫助,也可以點(diǎn)開原博主鏈接參考:
Go有一個全球模塊代理,設(shè)置代理再去安裝golang的插件,就可以安裝成功了。步驟有,首先Windows用戶打開Powershell,一個藍(lán)色的界面,注意不是cmd!不知道的直接打開window下面的搜索,然后輸入powershell,搜索出來就可以了。
$env:GO111MODULE=“on”
$env:GOPROXY=“”
go env -w GOPROXY=
go env -w GOPRIVATE=*.corp.example.com
然后我們打開VsCode界面,下面會提示安裝插件,我們選擇Install ALL,就會安裝成功
當(dāng)你在運(yùn)行Go語言程序時,提示所有的插件包都已經(jīng)安裝成功了時,就可以正常使用了,要不然一堆報錯會讓你非常心煩。
好了,今天先到這里,晚安、下班~
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Println(text)
這是讀取控制臺輸入的數(shù)據(jù),可以開協(xié)程的方式來執(zhí)行這個代碼,協(xié)程讀取,就可以在其他地方使用
網(wǎng)站欄目:go語言獲取輸入,go語言字符串操作
瀏覽地址:http://chinadenli.net/article40/dsijceo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、網(wǎng)站內(nèi)鏈、用戶體驗(yàn)、網(wǎng)站設(shè)計(jì)公司、微信公眾號、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)