天天看點

【智能合約】Go語言調用智能合約 | geth

目錄

1. 擷取abi檔案

2. 安裝abigen工具

3. remix連接配接私有鍊

4. 合約部署

5. 初始化私有鍊節點創世塊

6. 合約部署

7. 調用

合約的接口

在remix工具中編譯合約後,會有一個abi,複制

【智能合約】Go語言調用智能合約 | geth
然後建立一個xx.abi檔案,把指派的粘貼到裡面
【智能合約】Go語言調用智能合約 | geth

注意:代碼變了,重新編譯後abi也會變,是以一定要用最新的abi

也可以通過solc生成abi:

solc --bin test.sol -o test.abi

用來生成go檔案,

下載下傳檔案:github位址

【智能合約】Go語言調用智能合約 | geth
找到這個main.go檔案,進行go build,生成abigen.exe檔案。
【智能合約】Go語言調用智能合約 | geth
然後放在bin目錄下的這裡
【智能合約】Go語言調用智能合約 | geth
然後就可以在這裡驗證了
【智能合約】Go語言調用智能合約 | geth
使用abigen工具生成go檔案

abigen --abi xx.abi --pkg packagename --type structname --out xx.go      

abi 檔案在 remix 部署時可以得到

pkg 指定輸出檔案的包名,也就是package 名稱

type 指定合約結構體名稱

out 指定輸出go檔案名稱

【智能合約】Go語言調用智能合約 | geth

geth啟動私鍊,要指定rpccorsdomain *,不然在remix中是連接配接不上的。

【智能合約】Go語言調用智能合約 | geth

選擇Web3 Provider方式,預設連接配接私有鍊8545端口

【智能合約】Go語言調用智能合約 | geth

但是可以看到我們這裡是沒有account的

【智能合約】Go語言調用智能合約 | geth

是以我們可以建立一個account

【智能合約】Go語言調用智能合約 | geth

建立了兩個之後

【智能合約】Go語言調用智能合約 | geth

就可以在這裡看見了。

1.連接配接私有鍊:選擇Web3 Provider,預設端口号時8545,如果geth啟動的rpc端口号不一緻,改成一緻

2.部署合約

可能會出現下面幾種錯誤,依此列出解決辦法

1 .Error: authentication needed: password or unlock:這種報錯解鎖下賬戶即可

賬戶解鎖:personal.unlockAccount(“賬戶位址”)

【智能合約】Go語言調用智能合約 | geth

unlock一下就行了

【智能合約】Go語言調用智能合約 | geth

2 .Returned error: exceeds block gas limit:出現這種錯誤就看塊号的gaslimit,部署時改成一直

擷取塊号:eth.blockNumber

根據塊号擷取詳細資訊:eth.getBlock(0) 會看到gasLimit的值,在部署時的gaslimit不能大于這個

【智能合約】Go語言調用智能合約 | geth

3 .Returned error: insufficient funds for gas * price + value:部署合約需要手續費,得賺取,通過挖礦

【智能合約】Go語言調用智能合約 | geth

沒錢, 要挖礦賺錢。

【智能合約】Go語言調用智能合約 | geth

開啟指定線程數挖礦:miner.start(1)

停止挖礦:miner.stop()

檢查是否在挖礦:eth.mining true:在挖礦,false:不在挖礦

擷取賬戶位址數組:eth.accounts

擷取挖礦位址:eth.coinbase 預設第一個建立的賬戶

檢視第一個賬戶餘額:eth.getBalance(eth.accounts[0])

擷取指定賬戶的餘額:eth.getBalance(“賬戶位址”)

【智能合約】Go語言調用智能合約 | geth

建立一個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      
【智能合約】Go語言調用智能合約 | geth

部署時候需要支付手續費

http://ethscan.hubwiz.com/

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)  // 沒什麼作用
}