1. 程式人生 > >使用Go語言與Ethereum智能合約進行交互

使用Go語言與Ethereum智能合約進行交互

程序 nes ack 產生 back -a 可能 ner 進行

盡管最近出現了麻煩,但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語言與Ethereum智能合約進行交互