FISCO BCOS GO SDK 使用教程 - 详细教程

文章 , 技术分享
423 0

FISCO BCOS GO SDK 使用教程

go控制台使用

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

拉取代码并编译
git clone https://github.com/FISCO-BCOS/go-sdk.git
//git clone https://gitee.com/FISCO-BCOS/go-sdk.git
cd go-sdk
go mod tidy
go build cmd/console.go

配置密钥地址

配置密钥地址)

成功

2023-11-02T13:50:16.png

2023-11-02T13:50:30.png

Package功能使用

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

import "github.com/FISCO-BCOS/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/FISCO-BCOS/go-sdk/client"
    "github.com/FISCO-BCOS/go-sdk/conf"
    "github.com/FISCO-BCOS/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"
}

使用go-sdk写项目:

可以进行新部署合约或者加载已经部署的 合约,方法一:部署合约

    // 部署新合约方法
    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())

方法二:加载合约 ,可以在控制台/webase-front中部署获取合约地址

// 加载这个合约
contractAddress := common.HexToAddress("0xe19fd49a363b7a2b61bc79f0b659b34623a4343f")
instance, err = store.NewStore(contractAddress, client)
if err != nil {
    log.Fatal(err)
}

进行加载合约(也可以说是实例化合约)

//加载合约
storeSession := &store.StoreSession{Contract: instance, CallOpts: *client.GetCallOpts(), TransactOpts: *client.GetTransactOpts()}
//调用合约功能
tx, receipt, err := storeSession.SetItem(key, value)
if err != nil {
    log.Fatal(err)
}

完整调用代码

package main

import (
    "fmt"
    "github.com/ethereum/go-ethereum/common"
    "log"

    "github.com/FISCO-BCOS/go-sdk/client"
    "github.com/FISCO-BCOS/go-sdk/conf"
    "github.com/FISCO-BCOS/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("0xe19fd49a363b7a2b61bc79f0b659b34623a4343f")
    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("bar66"))

    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())
    // fmt.Println(key)
    // read the result
    result, err := storeSession.Items(key)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("get item: " + string(result[:])) // "bar"
}
最后更新 2023-11-02
评论 ( 0 )
OωO
隐私评论