go-bcos-sdk

module
v0.0.0-...-7c0078d Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 21, 2020 License: Apache-2.0

README

go-sdk

Golang SDK For FISCO BCOS 2.2.0+

CodeFactor Codacy Badge

FISCO-BCOS Go-SDK GitHub Actions Build Status codecov Code Lines


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

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

环境准备

配置文件说明

[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

  • 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/ningxin18/go-bcos-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/ningxin18/go-bcos-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
package main

import (
    "fmt"
    "log"

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

func main(){
    config := &conf.ParseConfig("config.toml")[0]

    client, err := client.Dial(config)
    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
    fmt.Println("transaction hash: ", tx.Hash().Hex())
    _ = instance
}

加载智能合约并调用查询接口

在部署过程中设置的Store.sol合约中有一个名为version的全局变量。 因为它是公开的,这意味着它们将成为我们自动创建的getter函数。 常量和view函数也接受bind.CallOpts作为第一个参数,新建contract_read.go文件以查询合约:

package main

import (
	"fmt"
	"log"

	"github.com/ningxin18/go-bcos-sdk/client"
	"github.com/ningxin18/go-bcos-sdk/conf"
	"github.com/ningxin18/go-bcos-sdk/store"
	"github.com/ethereum/go-ethereum/common"
)

func main() {
	config := &conf.ParseConfig("config.toml")[0]
	client, err := client.Dial(config)
	if err != nil {
		log.Fatal(err)
	}

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

	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"
}

调用智能合约写接口

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

package main

import (
	"fmt"
	"log"

	"github.com/ningxin18/go-bcos-sdk/client"
	"github.com/ningxin18/go-bcos-sdk/conf"
	"github.com/ningxin18/go-bcos-sdk/store"
	"github.com/ethereum/go-ethereum/common"
)

func main() {
	config := &conf.ParseConfig("config.toml")[0]
	client, err := client.Dial(config)
	if err != nil {
		log.Fatal(err)
	}

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

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

	key := [32]byte{}
	value := [32]byte{}
	copy(key[:], []byte("foo"))
	copy(value[:], []byte("bar"))

	tx, err := storeSession.SetItem(key, value)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("tx sent: %s\n", tx.Hash().Hex())

	// wait for the mining
	receipt, err := client.WaitMined(tx)
	if err != nil {
		log.Fatalf("tx mining error:%v\n", err)
	}
	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(string(result[:])) // "bar"
}

Directories

Path Synopsis
abi
bind
Package bind generates Ethereum contract Go bindings.
Package bind generates Ethereum contract Go bindings.
Package client provides a client for the FISCO BCOS RPC API.
Package client provides a client for the FISCO BCOS RPC API.
cmd
Package conf parse config to configuration
Package conf parse config to configuration
core
Package event deals with subscriptions to real-time events.
Package event deals with subscriptions to real-time events.
cns
sm3

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL