FISCOBCOS中的GoSDK操作—(引入github上的工具包版本)
文章目录
文档操作记录
内容作者时间版本号联系方式文档创建凌零岭在哪,Flatsail,BugDog2024-11-271.0email: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")funcmain(){
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)在使用动态私钥的情况:
SendTransaction (需要传入私钥) (作用:往链上存储信息,注意:被调用合约函数的返回值最好设定为bool值。)
SendCall (需要传入私钥) (作用:获取链上信息,注意:合约函数的传入参数和返回值需要定义模型。 )
2.合约类型和go语言中的类型对应
合约中传入和返回参数Go语言中使用对应类型stringstring或者stringuint256big.Intuint8uint8addresscommon.address(用这个包:github.com/ethereum/go-ethereum/common)boolbooluint256[][]big.Intstring[][]string结构体(例如:User)User结构体数组(例如:User[])*[]User
注意事项:
go语言中声明传入、传出的参数的模型时,可以直接:new一个类型 赋值给 变量
例如:num:= new(big.Int)
五.参与贡献
凌零岭在哪,Flatsail,Bugdog
版权归原作者 凌零岭在哪 所有, 如有侵权,请联系我们删除。