简化FISCOBCOS中的GoSDK合约调用-自定义GoSDK封装

简化FISCOBCOS中的GoSDK合约调用-自定义GoSDK封装


文档操作记录

内容作者时间版本号联系方式
文档创建凌零岭在哪,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"
)

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语言中使用对应类型
stringstring或者*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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值