go語言區塊鏈學習調用智能合約
1. 獲取abi文件
合約的接口
在remix工具中編譯合約後,會有一個abi
,復制
然後新建一個xx.abi文件,把賦值的粘貼到裡面
註意:代碼變瞭,重新編譯後abi
也會變,所以一定要用最新的abi
也可以通過solc生成abi:
solc –bin test.sol -o test.abi
2. 安裝abigen工具
用來生成go文件,
下載文件:github地址
找到這個main.go文件,進行go build,生成abigen.exe文件。
然後放在bin目錄下的這裡
然後就可以在這裡驗證瞭
使用abigen工具生成go文件
abigen --abi xx.abi --pkg packagename --type structname --out xx.go
abi 文件在 remix 部署時可以得到pkg 指定輸出文件的包名,也就是package 名稱type 指定合約結構體名稱out 指定輸出go文件名稱
3. remix連接私有鏈
geth
啟動私鏈,要指定rpccorsdomain *,不然在remix中是連接不上的。
選擇Web3 Provider
方式,默認連接私有鏈8545端口
但是可以看到我們這裡是沒有account的
所以我們可以創建一個account
創建瞭兩個之後
就可以在這裡看見瞭。
4. 合約部署
1.連接私有鏈:選擇Web3 Provider
,默認端口號時8545
,如果geth
啟動的rpc
端口號不一致,改成一致
2.部署合約
可能會出現下面幾種錯誤,依此列出解決辦法
1 .Error: authentication needed: password or unlock:這種報錯解鎖下賬戶即可
賬戶解鎖:personal.unlockAccount(“賬戶地址”)
unlock一下就行瞭
2 .Returned error: exceeds block gas limit:出現這種錯誤就看塊號的gaslimit,部署時改成一直
獲取塊號:eth.blockNumber
根據塊號獲取詳細信息:eth.getBlock(0) 會看到gasLimit的值,在部署時的gaslimit不能大於這個
3 .Returned error: insufficient funds for gas * price + value:部署合約需要手續費,得賺取,通過挖礦
沒錢, 要挖礦賺錢。
開啟指定線程數挖礦:miner.start(1)
停止挖礦:miner.stop()
檢查是否在挖礦:eth.mining true:在挖礦,false:不在挖礦
獲取賬戶地址數組:eth.accounts
獲取挖礦地址:eth.coinbase 默認第一個創建的賬戶
查看第一個賬戶餘額:eth.getBalance(eth.accounts[0])
獲取指定賬戶的餘額:eth.getBalance(“賬戶地址”)
5. 初始化私有鏈節點創世塊
新建一個genesis.json文件,內容如下
{ "config":{ "chainId":15, "homesteadBlock":0, "eip155Block":0, "eip158Block":0 }, "coinbase":"0x0000000000000000000000000000000000000000", "difficulty":"0x40000", "extraData":"", "gasLimit":"0xffffffff", "nonce":"0x0000000000000042", "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000", "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000", "timestamp":"0x00", "alloc":{ } }
含義:
coinbase
:挖礦賬戶地址,隨便填,後面可以設置,一般默認第一個創建的用戶
difficulty
: 設置當前區塊的難度,如果難度過大,cpu挖礦就很難,這裡設置較小難度
gasLimit
: 該值設置對GAS的消耗總量限制,用來限制區塊能包含的交易信息總和,填最大即可。
nonce
: nonce就是一個64位隨機數,用於挖礦,註意他和mixhash的設置需要滿足以太坊的Yellow paper
mixhash
:與nonce配合用於挖礦,由上一個區塊的一部分生成的hash。
parentHash
: 上一個區塊的hash值,因為是創世塊,所以這個值是0extraData:
timestamp
: 設置創世塊的時間戳
alloc
: 用來預置賬號以及賬號的以太幣數量,因為私有鏈挖礦比較容易,所以我們不需要預置有幣的賬號,需要的時候自己創建即可以。
cmd進入到存放json文件的路徑
geth -datadir "fanone" init genesis.json
6. 合約部署
部署時候需要支付手續費
http://ethscan.hubwiz.com/
7. 調用
github.com/ethereum/go-ethereum v1.10.0
package main import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/common" "eth_block/utils/contract/abi" "fmt" "github.com/ethereum/go-ethereum/accounts/abi/bind" ) func main() { // 連接rpc client,err := ethclient.Dial("http://127.0.0.1:8545") // 定義要操作合約的賬戶地址 addr := "0x29794ab2ed6c47faff7ebdd6dcdd71a263e25460" // 將字符串地址轉為common.Address common_addr := common.HexToAddress(addr) if err != nil { panic("連接以太坊合約出錯") } // 創建合約對象 contract_obj,err11 := contract.NewTestAddress(common_addr,client) if err11 !=nil { panic("創建合約對象出錯") } fmt.Println(contract_obj.TestAddressCaller) // Caller訪問函數 fmt.Println(contract_obj.TestAddressTransactor) // Transactor 有函數 fmt.Println(contract_obj.TestAddressFilterer) // 沒什麼作用 }
以上就是go語言區塊鏈學習調用智能合約的詳細內容,更多關於go語言區塊鏈調用智能合約的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- 使用Python的開發框架Brownie部署以太坊智能合約
- python區塊鏈簡易版交易實現示例
- python區塊鏈實現簡版工作量證明
- python區塊鏈基本原型簡版實現示例
- 詳解python實現簡單區塊鏈結構