使用Go語言與Ethereum智慧型合約進行互動

2022-07-07 04:54:07 字數 2344 閱讀 8255

儘管最近出現了麻煩,但ethereum仍然是區塊鏈空間中實現智慧型合約最重要的系統,而且這種情況似乎不太可能很快改變。

在我看來,技術本身具有很大的潛力,從學術的角度來看是非常有趣的,但正如前面提到的問題,之前展示出來了很多問題,區塊鏈技術,智慧型合約,特別是帶有solidity的ethereum生態系統是非常不成熟的,而且也沒有準備好的**時段/生產用例。

然而,這是學習和了解這種技術的乙個很好的機會,能夠在應用程式奔潰前提前做準備。

在我之前的一篇文章中,我建立了乙個小型應用程式,其中包含乙個簡單的winner-takes-all crowdfunding合約。在這篇文章中,我們將接受這份合約,並且去引用contract.sol這個合約,看看我們是否可以使用go語言進行部署和互動。

為什麼用go語言?其中乙個原因是,go語言的作用很強大。最廣泛使用的ethereum客戶端是用go語言寫的,這意味著有乙個很好的生態系統,可以與ethereum和智慧型契約進行互動,如從共享庫生成可重用的**。

在這個示例中,我們不會使用真正的區塊鏈作為部署目標,而是使用go - ethereum提供的模擬後端,這樣我們就可以安全地進行測試和實驗,而不用花任何錢。

智慧型合約本身很簡單(我不會詳細介紹紹它的功能或工作原理),只要解釋合約中部署了3個引數就夠了,3個引數如下:

然而,在這篇文章中,我們將關注:

我們會用70行**完成這些。讓我們開始吧!

為了能夠跟上,你需要一些東西。首先,最重要的是,您需要solc solidity編譯器。

然後,使用go - ethereum並建立它:

我們可以通過solc和geth devtools,然後從生成合約的go - version開始。我們的智慧型合同的sol檔案:

生成的**看起來像這樣。

如您所見,我們有部署和例項化合約的方法,以及所有公共合約方法的對映。

下一步是將合約部署到模擬後端。

為此,需要進行一些設定。 如上所述,為了簡單起見,我們將使用simulatedbackend作為我們的目標塊鏈,在這篇文章的最後,將有乙個關於如何使用testnet甚至是真實的etherey塊鏈結的簡短部分。

使用一些go - ethereum的依賴項,我們可以開始設定:板麵的做法和配料

我們只需建立乙個金鑰,建立乙個乙太網的genesis帳戶,並啟動模擬後端,該後端返回乙個bind.contractbackend。現在我們可以使用生成的deploywinnertakesall方法開始部署合約。

我們傳遞的是乙個auth物件,它代表我們的身份,引數包括the backend sim和 minimum entry fee,project deadline和 campaign deadline,這些引數每一項都使用乙個bigint。該方法返回合約將被部署到的位址,以及合約的控制代碼和乙個錯誤。還會返回乙個事務物件,但我們不會在這裡處理它。

既然已經部署了合約,我們就應該能夠與它互動。例如,我們可以檢查我們傳送的最後期限是否正確地設定在合約中:

但是,如果執行此操作,則返回< nil >。那是因為我們的合約還沒有真正開採。如果我們使用真實的網路作為後端,我們就必須等到它發生,但是在我們的模擬後端,我們可以這樣做:

我們回到我們部署的日期:

好了。這樣我們就可以閱讀合約公開的資料。現在我們想要和它互動。

在這種情況下,最簡單的方法是,通過傳送乙個專案的名稱和url來提議乙個新專案,該專案至少具有最低的輸入費用:

當然,我們需要再次開採:

但是我們得到以下輸出:

太棒了——這意味著我們的專案被建立了。這樣我們就可以部署、讀和寫合約。

但如果合約已經部署了,我們只是想和它互動呢?幸運的是,所生成的**包括乙個newwinnertakesall方法,它僅使用部署的契約的位址,讓我們例項化合約:

我們得到與我們部署的合約相同的返回值,並可以以與此版本相同的方式進行互動,這個版本是通過位址例項化實現的。

我們已經完成了所有的步驟,我們需要有意義地與乙個合約進行互動,但只需要在模擬的後端。為了使用testnet或real ethereum區塊鏈,我們只需要適應以下幾件事:

這將產生我們在上面建立的auth物件。當然,請不要在**中使用明文或密碼,而是以安全的方式載入它們。

如果已經部署了合約,我們不需要建立newipcclient,但是可以直接撥號到節點:

你可以在這裡找到**和完整的例子。

正如我在這篇文章的開頭所說的,在我看來,要依賴可靠的智慧型合同來處理應用程式奔潰還為時過早,但這和其他一些基於區塊的智慧型合同的方法的潛力是巨大的,因此了解它周圍的技術當然是值得的。

go語言適合於與基於ethereumbased的智慧型合約互動的任務,因為有很多來自geth的可重用**,甚至還有一些關於如何開始的文件。這當然可以用其他語言來實現。(使用web3),但如果你喜歡的話,這似乎是乙個可靠的選擇。

go語言cgo C與Go互調

見 foo.h void foo void callgo void hello void print x char str foo.c gcc c foo.c ar rv libfoo.a foo.o include foo.h include stdio.h include obj cgo exp...

go語言gorm使用

var jsondata map string inte ce 全域性變數 存放配置檔案的map物件 func initjson configstr string bytes reg regexp.mustcompile configstr reg.replaceallstring configst...

go語言使用redis redigo

redis的client有好多好多,go語言的client在redis官方有兩個推薦,radix和redigo。選擇哪乙個好呢?確實很糾結,後來擲硬幣決定選擇redigo了。redis go redigo的安裝就不需要提了,不能強行增加篇幅。redigo使用起來很人性化,api設計的符合直覺,我對r...