go-sdk的安装

上一章,介绍了智能合约的编译和部署,这一章,介绍fisco-bcos go-sdk的用法,首先,先下载go-sdk源码到本地

  • Go开发环境

      • Golang >= 1.17
  • 基本开发组件

      • Git(Windows、Linux及MacOS需要)
      • Git bash(仅Windows需要)

下载go-sdk

如果用的是fisco-bcos2.x.使用以下命令

git clone -b master-FISCO-BCOS-v2 https://github.com/FISCO-BCOS/go-sdk.gitcd go-sdk/cmd/abigen/go build

如果是fisco-bcos3.x

git clonehttps://github.com/FISCO-BCOS/go-sdk.gitcd go-sdk/cmd/abigen/go build

如果缺少库,可以提示安装,编译得到的abigen可以留作以后使用。

go mod download github.com/FISCO-BCOS/cryptogo get github.com/FISCO-BCOS/go-sdk/core/typesgo get github.com/FISCO-BCOS/go-sdk/cmd/abigen

bcos-c-sdk动态库准备

go-sdk v3依赖bcos-c-sdk动态库,需要先下载bcos-c-sdk动态库,然后将动态库放到指定目录下。

下载bcos-c-sdk动态库
从这里下载对应平台的动态库。我们提供了一个脚本,默认下载到/usr/local/lib目录下,如果需要下载到其他目录,可以使用脚本的-o选项

./tools/download_csdk_lib.sh

请将动态库放在/usr/local/lib目录下,后续无特殊操作。如果本机编译后在其他机器使用时,动态库放置在自定义目录,例如./lib,则go build需要添加ldflags参数,例如

go build -v -ldflags="-r ${PWD}/lib" main.go也可以通过 export LD_LIBRARY_PATH=${PWD}/lib 设置动态库的搜索路径。

创建一个go工程

可以直接使用IDE编辑器,比如Goland
将webase里部署合约之后,生产的abi和bin分别保存到项目目录下
分别命名为:HelloWorld.abi, HelloWorld.bin
使用abigen编译abi和bin代码来得到go代码。

abigen -abi HelloWorld.abi -bin HelloWorld.bin -type hello -pkg bcos -out hello.go

这样,我们在项目下就能得到3个文件

HelloWorld.abiHelloWorld.binhello.go

到这里,我们就可以直接通过hello.go里的方法去调用合约内容了。

⚠️ 这里生成的hello.go文件,不能修改,生产好之后,可能存在有些方法找不到的bug, 我们需要在go.mod文件里加上一行来解决,将go-sdk指向本地的代码,

调用合约

package mainimport ("context""encoding/hex"facegateblock "fisco_bcso_demo/webs/fiscosdk""fmt""github.com/FISCO-BCOS/go-sdk/client""github.com/ethereum/go-ethereum/accounts/abi""github.com/ethereum/go-ethereum/common""strings")func main() {// 用户私钥,可以在webase私钥管理里获取privateKey, _ := hex.DecodeString("edab970c8c98fc5ecd3d6e8d46c96b30d1be924d4d88928d11fa5f29d1477fd9")config := &client.Config{IsSMCrypto: false, GroupID: "group0",PrivateKey: privateKey, Host: "192.168.1.135", Port: 20200, TLSCaFile: "conf/ca.crt", TLSKeyFile: "conf/sdk.key", TLSCertFile: "conf/sdk.crt"}client, err := client.DialContext(context.Background(), config)if err != nil {fmt.Println("DialContext err", err)}// 合约地址instance, err := facegateblock.NewHelloWorld(common.HexToAddress("0xa28ac30a792a59c3cd114a87a75193c6b8278d7e"), client)}// 调用合约:查询接口msg, err := instance.GetMsg(client.GetCallOpts())fmt.Println("NewMain GetMsg", err)// 往合约里写入数据,形成区块_, receipt, err := instance.SetMsg(client.GetTransactOpts(), "hello fisco")// 区块的高度fmt.Println("blockNumber:", receipt.BlockNumber)// 此次交易的hashfmt.Println("TransactionHash:", receipt.TransactionHash)// 区块的hashfmt.Println("Hash:", receipt.Hash)