Categorygithub.com/peteim/go-sdk
module
0.12.3
Repository: https://github.com/peteim/go-sdk.git
Documentation: pkg.go.dev

# README

go-sdk

Golang SDK For FISCO BCOS 2.2.0+

CodeFactor Codacy Badge codecov Code Lines version

FISCO-BCOS Go-SDK GitHub Actions Build Status


FISCO BCOS Go语言版本的SDK,主要实现的功能有:

go-sdk的使用可以当做是一个package进行使用,亦可对项目代码进行编译,直接使用控制台通过配置文件来进行访问FISCO BCOS。

环境准备

配置文件说明(config.toml)

[Network]
#type rpc or channel
Type="channel"
CAFile="ca.crt"
Cert="sdk.crt"
Key="sdk.key"
[[Network.Connection]]
NodeURL="127.0.0.1:20200"
GroupID=1
# [[Network.Connection]]
# NodeURL="127.0.0.1:20200"
# GroupID=2

[Account]
# only support PEM format for now
KeyFile=".ci/0x83309d045a19c44dc3722d15a6abd472f95866ac.pem"

[Chain]
ChainID=1
SMCrypto=false

Network

注意:go-sdk暂不支持国密SSL,请注意在使用国密模式时,将节点的config.ini中chain.sm_crypto_channel设置为false,详情请参考这里

  • Type:支持channel和rpc两种模式,其中channel使用ssl链接,需要提供证书。rpc使用http访问节点。
  • CAFile:链根证书
  • Cert:SDK建立SSL链接时使用的证书
  • Key:SDK建立SSL链接时使用的证书对应的私钥
  • Network.Connection数组,配置节点信息,可配置多个。

Account

  • KeyFile:节点签发交易时所使用的私钥,PEM格式,支持国密和非国密。

请使用get_account.shget_gm_account.sh脚本生成。使用方式参考这里

如果想使用Go-SDK代码生成,请参考这里

Chain

  • ChainID:链ID,与节点config.ini中chain.id保持一致。
  • SMCrypto:链使用的签名算法,ture表示使用国密SM2,false表示使用普通ECDSA。

控制台使用

在使用控制台需要先拉取代码或下载代码,然后对配置文件config.toml进行更改:

  1. 拉取代码并编译
git clone https://github.com/peteim/go-sdk.git
cd go-sdk
go build cmd/console.go
  1. 搭建FISCO BCOS 2.2以上版本节点,请参考这里

  2. config.toml默认使用channel模式,请拷贝对应的SDK证书。

  3. 最后,运行控制台查看可用指令:

./console help

Package功能使用

以下的示例是通过import的方式来使用go-sdk,如引入RPC控制台库:

import "github.com/peteim/go-sdk/client"

Solidity合约编译为Go文件

在利用SDK进行项目开发时,对智能合约进行操作时需要将Solidity智能合约利用go-sdk的abigen工具转换为Go文件代码。整体上主要包含了五个流程:

  • 准备需要编译的智能合约
  • 配置好相应版本的solc编译器
  • 构建go-sdk的合约编译工具abigen
  • 编译生成go文件
  • 使用生成的go文件进行合约调用

下面的内容作为一个示例进行使用介绍。

1.提供一份简单的样例智能合约Store.sol如下:

pragma solidity ^0.4.25;

contract Store {
  event ItemSet(bytes32 key, bytes32 value);

  string public version;
  mapping (bytes32 => bytes32) public items;

  constructor(string _version) public {
    version = _version;
  }

  function setItem(bytes32 key, bytes32 value) external {
    items[key] = value;
    emit ItemSet(key, value);
  }
}

2.安装对应版本的solc编译器,目前FISCO BCOS默认的solc编译器版本为0.4.25。

# 如果是国密则添加-g选项
bash tools/download_solc.sh -v 0.4.25

3.构建go-sdk的代码生成工具abigen

# 下面指令在go-sdk目录下操作,编译生成abigen工具
go build ./cmd/abigen

执行命令后,检查根目录下是否存在abigen,并将准备的智能合约Store.sol放置在一个新的目录下:

mkdir ./store
mv Store.sol ./store

4.编译生成go文件,先利用solc将合约文件生成abibin文件,以前面所提供的Store.sol为例:

# 国密请使用 ./solc-0.4.25-gm --bin --abi -o ./store ./store/Store.sol
./solc-0.4.25 --bin --abi -o ./store ./store/Store.sol

Store.sol目录下会生成Store.binStore.abi。此时利用abigen工具将Store.binStore.abi转换成Store.go

# 国密请使用 ./abigen --bin ./store/Store.bin --abi ./store/Store.abi --pkg store --type Store --out ./store/Store.go --smcrypto=true
./abigen --bin ./store/Store.bin --abi ./store/Store.abi --pkg store --type Store --out ./store/Store.go

最后store目录下面存在以下文件:

Store.abi  Store.bin  Store.go  Store.sol

5.调用生成的Store.go文件进行合约调用

至此,合约已成功转换为go文件,用户可根据此文件在项目中利用SDK进行合约操作。具体的使用可参阅下一节。

部署智能合约

创建main函数,调用Store合约,

touch store_main.go

下面的例子先部署合约,在部署过程中设置的Store.sol合约中有一个公开的名为version的全局变量,这种公开的成员将自动创建getter函数,然后调用Version()来获取version的值。

写入智能合约需要我们用私钥来对交易事务进行签名,我们创建的智能合约有一个名为SetItem的外部方法,它接受soliditybytes32类型的两个参数(key,value)。 这意味着在Go文件中需要传递一个长度为32个字节的字节数组。

package main

import (
    "fmt"
    "log"

    "github.com/peteim/go-sdk/client"
    "github.com/peteim/go-sdk/conf"
    "github.com/peteim/go-sdk/store" // import store
)

func main(){
	configs, err := conf.ParseConfigFile("config.toml")
	if err != nil {
		log.Fatalf("ParseConfigFile failed, err: %v", err)
	}
	client, err := client.Dial(&configs[0])
	if err != nil {
		log.Fatal(err)
	}
	input := "Store deployment 1.0"
	address, tx, instance, err := store.DeployStore(client.GetTransactOpts(), client, input)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("contract address: ", address.Hex()) // the address should be saved, will use in next example
	fmt.Println("transaction hash: ", tx.Hash().Hex())

	// load the contract
	// contractAddress := common.HexToAddress("contract address in hex String")
	// instance, err := store.NewStore(contractAddress, client)
	// if err != nil {
	// 	log.Fatal(err)
	// }

	fmt.Println("================================")
	storeSession := &store.StoreSession{Contract: instance, CallOpts: *client.GetCallOpts(), TransactOpts: *client.GetTransactOpts()}

	version, err := storeSession.Version()
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("version :", version) // "Store deployment 1.0"

	// contract write interface demo
	fmt.Println("================================")
	key := [32]byte{}
	value := [32]byte{}
	copy(key[:], []byte("foo"))
	copy(value[:], []byte("bar"))

	tx, receipt, err := storeSession.SetItem(key, 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())

	// read the result
	result, err := storeSession.Items(key)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("get item: " + string(result[:])) // "bar"
}

# Packages

No description provided by the author
Package client provides a client for the FISCO BCOS RPC API.
No description provided by the author
Package conf parse config to configuration.
No description provided by the author
No description provided by the author
Package event deals with subscriptions to real-time events.
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author