本文以Fisco提供的go-sdk工具包,调用Fisco网络中已安装的智能合约。
1、安装Go语言
good@good:~/fisco$ sudo tar -C /usr/local -xzf /media/good/share/go1.21.0.linux-amd64.tar.gz
2、配置Go语言,在/etc/profile最后添加如下代码
export DISPLAY=:0
export QT_X11_NO_MITSHM=1
export GOROOT=/usr/local/go
export GOARCH=amd64
export GOOS=linux
export GOPATH=/home/good/go
export GOBIN=$GOPATH/bin
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
xhost +
3、下载go-sdk、solc
good@good:~/fisco/nodes/127.0.0.1$ git clone https://gitee.com/FISCO-BCOS/go-sdk.git
good@good:~/fisco/nodes/127.0.0.1/go-sdk/tools$ ./download_solc.sh
good@good:~/fisco/nodes/127.0.0.1/go-sdk/tools$ mv solc-0.4.25 ../../helloworld/
4、编译abigen
good@good:~/fisco/nodes/127.0.0.1/go-sdk/cmd/abigen$ go mod init abigen
good@good:~/fisco/nodes/127.0.0.1/go-sdk/cmd/abigen$ go mod tidy
good@good:~/fisco/nodes/127.0.0.1/go-sdk/cmd/abigen$ go build .
good@good:~/fisco/nodes/127.0.0.1/go-sdk/cmd/abigen$ mv abigen ../../../helloworld/
5、编译智能合约
good@good:~/fisco/nodes/127.0.0.1/helloworld$ cp ../console/contracts/solidity/HelloWorld.sol .
good@good:~/fisco/nodes/127.0.0.1/helloworld$ ./solc-0.4.25 --abi --bin -o ./ ./HelloWorld.sol
good@good:~/fisco/nodes/127.0.0.1/helloworld$ ./abigen --bin ./HelloWorld.bin --abi ./HelloWorld.abi --pkg helloworld --type HelloWorld --out ./HelloWorld.go
6、准备配置文件和证书
good@good:~/fisco/nodes/127.0.0.1/helloworld$ mkdir conf
good@good:~/fisco/nodes/127.0.0.1/console/conf$ cp ca.crt ../../helloworld/conf/
good@good:~/fisco/nodes/127.0.0.1/console/conf$ cp sdk.crt ../../helloworld/conf/
good@good:~/fisco/nodes/127.0.0.1/console/conf$ cp sdk.key ../../helloworld/conf/
good@good:~/fisco/nodes/127.0.0.1/helloworld/conf$ gedit config.toml &
配置文件config.toml如下所示。
[Network]
Type="channel"
CAFile="conf/ca.crt"
Cert="conf/sdk.crt"
Key="conf/sdk.key"
[[Network.Connection]]
NodeURL="127.0.0.1:20200"
GroupID=1
[Account]
KeyFile="/home/good/fisco/nodes/127.0.0.1/console/account/ecdsa/0x2d2e77cb1849268e5859e733bfbe364f41ace095.pem"
[Chain]
ChainID=1
SMCrypto=false
重要的地方是4个文件的路径,尤其是最后1个。本文直接用console控制台默认的私钥文件。
7、编写并编译调用智能合约的Go程序call
good@good:~/fisco/nodes/127.0.0.1/helloworld$ gedit call.go &
good@good:~/fisco/nodes/127.0.0.1/helloworld$ go mod init call
good@good:~/fisco/nodes/127.0.0.1/helloworld$ go mod tidy
good@good:~/fisco/nodes/127.0.0.1/helloworld$ go build .
call.go代码如下。
package main
import (
"fmt"
"log"
"github.com/FISCO-BCOS/go-sdk/client"
"github.com/FISCO-BCOS/go-sdk/conf"
"github.com/ethereum/go-ethereum/common"
)
func main() {
configs, err := conf.ParseConfigFile("conf/config.toml")
if err != nil {
log.Fatal(err)
}
config := &configs[0]
client, err := client.Dial(config)
if err != nil {
log.Fatal(err)
}
contractAddress := common.HexToAddress("0x665c4d8bc52217ad9c884b857bcabf37fe464bf2")
instance, err := NewHelloWorld(contractAddress, client)
if err != nil {
log.Fatal(err)
}
helloworldSession := &HelloWorldSession{Contract: instance, CallOpts: *client.GetCallOpts(), TransactOpts: *client.GetTransactOpts()}
value, err := helloworldSession.Get()
if err != nil {
log.Fatal(err)
}
fmt.Println("value :", value)
value = "Hello, FISCO BCOS"
tx, receipt, err := helloworldSession.Set(value)
if err != nil {
log.Fatal(err)
}
fmt.Printf("tx sent: %s\n", tx.Hash().Hex())
fmt.Printf("transaction hash of receipt: %s\n", receipt.GetTransactionHash())
}
8、编译成功之后调用call
good@good:~/fisco/nodes/127.0.0.1/helloworld$ ./call
value : China
tx sent: 0x0667fcd754dc11a2879799b3e4a5ff7d7137dfddc17f1044bf159e8bbb97547b
transaction hash of receipt: 0x0667fcd754dc11a2879799b3e4a5ff7d7137dfddc17f1044bf159e8bbb97547b
good@good:~/fisco/nodes/127.0.0.1/helloworld$ ./call
value : Hello, FISCO BCOS
tx sent: 0xaada3383142c4d7c928c08a329e526e20112b6b9216068a6d0d72fb0b401fbb7
transaction hash of receipt: 0xaada3383142c4d7c928c08a329e526e20112b6b9216068a6d0d72fb0b401fbb7
good@good:~/fisco/nodes/127.0.0.1/helloworld$
每调用1次,产生1个区块,可以在控制台中观察到。

写在最后,上述过程的代码主要来自Fisco技术文档,本文对源程序作了少量修改,使之能够编译、运行。上述过程不是一帆风顺的,中间经历了许多失败。最后把案例打包成1个压缩文件放在网盘中供下载。调整其中的一些路径,合约地址等参数,就可以使用。
实验环境如下
虚拟机文件:ubuntu20.04-Fisco
获取地址:https://pan.baidu.com/s/1RlrSy_OuT3B7TMT5AJEGmA?pwd=oava