简化FISCOBCOS中的GoSDK合约调用-自定义GoSDK封装
文章目录
文档操作记录
内容 | 作者 | 时间 | 版本号 | 联系方式 |
---|---|---|---|---|
文档创建 | 凌零岭在哪,Flatsail,BugDog | 2024-11-27 | 1.0 | email:2040575063@qq.com |
背景:基于FISCOBCOS(2.9.1)提供的GoSDK进行二次开发,再次封装成了一个工具包,简化官方文档中的操作。
相关资源:
https://gitee.com/kkvb/fiscobcos-go
https://github.com/kkvbAugust/fiscobcos-go
参考文档:https://fisco-bcos-documentation.readthedocs.io/zh-cn/latest/docs/sdk/go_sdk/index.html
使用FiscoBcos官方工具库: https://github.com/FISCO-BCOS/go-sdk/tree/master-FISCO-BCOS-v2
一,GoWEB项目创建:
1.新建项目:
2.项目路径(随自己心意):
3.生成成功:
二,项目书写:
1.依赖导入
(1)在控制台执行:
go get -u github.com/kkvbAugust/fiscobcos-go
2.配置资源文件夹:
3.pem格式私钥生成:
4.拷贝节点证书文件:
(1)将下面的图片中的文件复制:
(2)粘贴:
5.网络配置文件书写(下面给出的配置需要修改):
[Network]
#type rpc or channel
Type="channel"
# 三个节点证书,使用相对路径
CAFile="resources/sdk/ca.crt"
Cert="resources/sdk/sdk.crt"
Key="resources/sdk/sdk.key"
# if the certificate context is not empty, use it, otherwise read from the certificate file
# multi lines use triple quotes
CAContext=''''''
KeyContext=''''''
CertContext=''''''
[[Network.Connection]]
NodeURL="192.168.81.128:20200" # 节点的地址
GroupID=1 # 群组id
# [[Network.Connection]]
# NodeURL="127.0.0.1:20200"
# GroupID=2
[Account]
# only support PEM format for now
KeyFile="resources/accounts/webase_admin.pem" #使用什么账户调用合约
DynamicKey=false #是否启用动态私钥(是:使用自己生成的私钥,发送交易要携带key。否:默认使用自己导入进来的私钥(就是KeyFile中配置的值))
[Chain]
ChainID=1 #链id
SMCrypto=false # 非国密
[log]
Path="./"
6.智能合约配置文件书写
(1)部署合约:
注意事项:
在WeBASE-Front上编译合约获得abi和bin,部署合约获得address。
pragma solidity >=0.4.24 <0.6.11;
contract HelloWorld {
string name;
constructor() public {
name = "Hello, World!";
}
function get() public view returns (string memory) {
return name;
}
function set(string memory n) public view returns(bool) {
name = n;
return true;
}
}
(2)这里的abi要将其中的 " 替换成 ",可以打开一个记事本,放入abi,使用快捷键ctrl+f, 全部替换。
(3)填写配置文件:
注意事项:(这里的设计只是一个键(“contract1”,或者"contract2"、“contract3”…)对应一个结构体(智能合约的name,address,abi,bin)的数据结构)
contracts:
contract1:
name:
address:
abi:
bin:
三,测试
(1)创建目录及文件:
(2)编写测试样例:
package main
import (
"fmt"
"github.com/kkvbAugust/fiscobcos-go/core"
"github.com/kkvbAugust/fiscobcos-go/tools"
)
const (
HelloWorld = "contract1"
)
func main() {
core.InitConf("resources/settings.yaml")
core.InitClient("resources/config.toml")
core.InitSession(HelloWorld)
s1 := new(string)
tools.SendCall(HelloWorld, "get", s1)
transaction := tools.SendTransaction(HelloWorld, "set", "Hello,FISCO-BCOS")
s2 := new(string)
tools.SendCall(HelloWorld, "get", s2)
fmt.Println("SendCall1==>", *s1)
fmt.Println("transaction2==>", transaction)
fmt.Println("SendCall2==>", *s2)
}
(3)运行:
(4)执行命令:go mod tidy
go mod tidy
查看go.mod:
(5)再次运行:
通过WeBASE导出的私钥发送交易
注意事项:
代码中不展示具体的调用函数过程,但会通过私钥计算出公钥和地址,与webase上导出的文件作对比
具体函数调用过程,只需要通过将各类型的私钥,转换成*ecdsa.PrivateKey类型的私钥,就可以调用SendCallByKey和SendTransactionByKey(将私钥作为参数传入就行)。
详细内容见FISCOBCOS中的GoSDK操作—(搭建项目版本) ,注意由于两个文档的目录结构不同,要注意函数在哪个包下。
FISCOBCOS中的GoSDK操作—(搭建项目版本):
文档:
https://blog.csdn.net/bjll123/article/details/143850759
代码:
https://gitee.com/kkvb/fisco-go-sdk-demo
四,小结:
1.发送交易的函数:
(1)在不使用动态私钥的情况:
SendTransaction (作用:往链上存储信息,注意:合约函数的返回值最好设定为bool值。)
SendCall (作用:获取链上信息,注意:合约函数的传入参数和返回值需要定义模型 )
(2)在使用动态私钥的情况:
SendTransactionByKey (需要传入私钥) (作用:往链上存储信息,注意:被调用合约函数的返回值最好设定为bool值。)
SendCallByKey (需要传入私钥) (作用:获取链上信息,注意:合约函数的传入参数和返回值需要定义模型。 )
2.合约类型和go语言中的类型对应
合约中传入和返回参数 | Go语言中使用对应类型 |
---|---|
string | string或者*string |
uint256 | *big.Int |
uint8 | *uint8 |
address | *common.address(用这个包:github.com/ethereum/go-ethereum/common) |
bool | *bool |
uint256[] | *[]big.Int |
string[] | *[]string |
结构体(例如:User) | *User |
结构体数组(例如:User[]) | *[]User |
注意事项:
go语言中声明传入、传出的参数的模型时,可以直接:new一个类型 赋值给 变量
例如:num:= new(big.Int)
五.参与贡献
凌零岭在哪,Flatsail,Bugdog