目錄
- 1. 獲取abi檔案
- 2. 安裝abigen工具
- 3. remix連接私有鏈
- 4. 合約部署
- 5. 初始化私有鏈節點創世塊
- 6. 合約部署
- 7. 呼叫
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) // 沒什么作用
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/292795.html
標籤:區塊鏈
上一篇:ZICC關聯科普知識:傳統APP和智能合約Dapp區別
下一篇:幣客BKEX是一家怎樣的機構?
