webase go-sdk 简单使用

news/2024/9/20 7:58:16

本流程在test目录下,其中用到的 solc-0.4.25 和 abigen 工具网上教程都比较详细,就暂时不展开聊,今天就大概描述流程。

1.将目录下的test.sol文件编译

pragma solidity ^0.4.25;import "./Table.sol";contract test {string constant TABLE_NAME = "test2";event insertEvent(string id, string title, uint iuser_id,uint ruser_id,int stauts);event updateEvent(string id, int stauts);constructor() public{TableFactory tf = TableFactory(0x1001);tf.createTable(TABLE_NAME,"id","title,iuser_id,ruser_id,stauts,start_time,sign_time");}function set(string id, string title, uint iuser_id,uint ruser_id,int stauts) public returns(int) {TableFactory tf = TableFactory(0x1001);Table table = tf.openTable(TABLE_NAME);uint t = 0;Entry entry = table.newEntry();entry.set("id",id);entry.set("title",title);entry.set("iuser_id",iuser_id);entry.set("ruser_id",ruser_id);entry.set("stauts",stauts);entry.set("start_time",now);entry.set("sign_time",t);int count = table.insert(id,entry);emit insertEvent(id,title,iuser_id,ruser_id,stauts);return count;}function update(string id,int stauts) public returns(int) {TableFactory tf = TableFactory(0x1001);Table table = tf.openTable(TABLE_NAME);Condition condition = table.newCondition();//condition.EQ("id",id);
        Entry entry = table.newEntry();entry.set("stauts",stauts);if (stauts == 5){entry.set("sign_time",now);}int count = table.update(id,entry,condition);emit updateEvent(id,stauts);return count;}function get(string id) public view returns (string,uint,uint,int,uint,uint) {TableFactory tf = TableFactory(0x1001);Table table = tf.openTable(TABLE_NAME);Condition condition = table.newCondition();//condition.EQ("id",id);Entries entries = table.select(id,condition);if(entries.size() == 0){return("", 0, 0, 0, 0, 0);}uint iuser_id;uint ruser_id;int stauts;iuser_id = entries.get(0).getUInt("iuser_id");ruser_id = entries.get(0).getUInt("ruser_id");stauts = entries.get(0).getInt("stauts");return (entries.get(0).getString("title"), iuser_id, ruser_id, stauts,entries.get(0).getUInt("start_time"), entries.get(0).getUInt("sign_time"));}}
test.sol

由于引用了Table.sol,所以还要将Table.sol放到目录下。

pragma solidity ^0.4.24;contract TableFactory {function openTable(string) public view returns (Table); //open tablefunction createTable(string, string, string) public returns (int256); //create table
}//select condition
contract Condition {function EQ(string, int256) public view;function EQ(string, string) public view;function EQ(string, address) public view;function NE(string, int256) public view;function NE(string, string) public view;function GT(string, int256) public view;function GE(string, int256) public view;function LT(string, int256) public view;function LE(string, int256) public view;function limit(int256) public view;function limit(int256, int256) public view;
}//one record
contract Entry {function getInt(string) public view returns (int256);function getUInt(string) public view returns (uint256);function getAddress(string) public view returns (address);function getBytes64(string) public view returns (bytes1[64]);function getBytes32(string) public view returns (bytes32);function getString(string) public view returns (string);function set(string, int256) public;function set(string, uint256) public;function set(string, string) public;function set(string, address) public;
}//record sets
contract Entries {function get(int256) public view returns (Entry);function size() public view returns (int256);
}//Table main contract
contract Table {function select(string, Condition) public view returns (Entries);function insert(string, Entry) public returns (int256);function update(string, Entry, Condition) public returns (int256);function remove(string, Condition) public returns (int256);function newEntry() public view returns (Entry);function newCondition() public view returns (Condition);
}contract KVTableFactory {function openTable(string) public view returns (KVTable);function createTable(string, string, string) public returns (int256);
}//KVTable per permiary key has only one Entry
contract KVTable {function get(string) public view returns (bool, Entry);function set(string, Entry) public returns (int256);function newEntry() public view returns (Entry);
}
Table.sol

然后执行命令:

./solc-0.4.25 --bin --abi -o ./ ./test.sol

结果如下:

 

2.abigen生成go文件

./abigen --bin ./test.bin --abi ./test.abi --pkg test --type test --out ./test.go

 结果如下:

 

3.复制节点的SDK文件

 将上面的sdk文件夹,直接复制到test目录下

4.使用get_account.sh脚本生成账户私钥

 get_account.sh

 该脚本在FISCO的console中,可以直接复制下来执行

./get_account.sh

执行完毕,生成一个目录,里面有我们需要的账户私钥文件(这个账户私钥文件(*.pem),可以重复使用),将它拷贝到test目录下 。

5.配置config.toml

 可以拷贝go-sdk里的config.toml

 也可以直接新建一个config.toml文件

[Network]
#type rpc or channel
Type="channel"
CAFile="./sdk/ca.crt"
Cert="./sdk/sdk.crt"
Key="./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="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="./accounts/0x2b4c58c9b6bb9165931c9956f96d69723bb92754.pem"[Chain]
ChainID=1
SMCrypto=false[log]
Path="./"
config.toml

将config.toml的KeyFile修改为上一步获得的pem文件的名字,然后其他的NodeURL和GroupID等,根据自己需要进行修改。

6.使用接口

在test目录下新建一个cmd目录,编写一个main.go来调用链码

package mainimport ("math/big""fmt""log""test""github.com/FISCO-BCOS/go-sdk/client""github.com/FISCO-BCOS/go-sdk/conf""github.com/ethereum/go-ethereum/common"
)func main(){configs, err := conf.ParseConfigFile("config.toml")  //读取config.toml文件if err != nil {log.Fatal(err)}config := &configs[0]client, err := client.Dial(config)  //加载配置文件,生成client进行相关链操作if err != nil {log.Fatal(err)}contractAddress := common.HexToAddress("0xac05ff0709f443db85f7cd524e142e1778a8e426") // 这里请放入刚刚部署的合约地址,注意,是你自己的机子部署的地址instance, err := test.NewTest(contractAddress, client)  //根据地址和client生成test合约对象if err != nil {log.Fatal(err)}testSession := &test.TestSession{Contract: instance, CallOpts: *client.GetCallOpts(), TransactOpts: *client.GetTransactOpts()}a := big.NewInt(7)b := big.NewInt(8)c := big.NewInt(0)_,tx,receipt,err := testSession.Set("5","gosdk_title",a,b,c)if err != nil{log.Fatal(err)}fmt.Printf("tx sent: %s\n", tx.Hash().Hex())  //调用set方法的交易hashfmt.Printf("transaction hash of receipt: %s\n", receipt.GetTransactionHash())  //调用set方法的交易hash ,与上面的hash是一样,只是存在不同的地方而已
title,iuser_id,ruser_id,stauts,start_time,sign_time,err := testSession.Get("5")if err != nil{log.Fatal(err)}fmt.Printf("title: %s\niuser_id: %d\nruser_id: %d\nstauts: %d\nstart_time: %d\nsign_time: %d\n",title,iuser_id,ruser_id,stauts,start_time,sign_time)
}
main.go

在执行这个main.go之前应该先部署链码,但是由于笔者是先在webase上编写test.sol部署后,才进行go-sdk的配置的,所以这里就不重复部署了。

go mod init
go mod tidy
go run ./cmd/main.go

结果如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/31919.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Selenium4自动化测试6--控件获取数据--下拉框级联选择、checkbox选择、时间选择器

4-下拉框级联选择 import time from selenium.webdriver.support.select import Select #pip install selenium from selenium import webdriver from selenium.webdriver.common.by import By# 定义一个driver的变量,用来接收实例化后的浏览器 # 指定浏览器的位置,解决浏览器…

Selenium4自动化测试7--控件获取数据--radio单选框、select下拉框选择、iframe

7- radio单选框 import timefrom selenium import webdriver from selenium.webdriver.common.by import By # 定义一个driver的变量,用来接收实例化后的浏览器 # 指定浏览器的位置,解决浏览器驱动和浏览器版本不匹配的问题 chrome_location = rD:\pythonProject2023\Seleniu…

三原色及补色

RGB和CMY互补关系按顺序来一一对应(一定要牢记); 也就是说 (C)青色是(R)红色的补色,(M)品红色是(G)绿色的补色, (Y)黄色是(B)蓝色的补色。 这样就很好记了三原色其中的两种叠加生成另一种原色的补色:比如 红➕绿=黄(蓝的补色); 反之同理:青➕品=蓝 (黄对应的原色),所以青…

Mac电脑idea插件JRebel提示不可用

现象:原因:常见如:https://jrebel.qekang.com/解决办法: 降低IDEA>jrebel版本 2022.4.1 进入idea:打开 Preferences-Plugins找到jrebel插件并卸载; 到idea官方店下载:https://plugins.jetbrains.com/plugin/4441-jrebel-and-xrebel/versions/stable 找到对应版本下载…

HBuilderX 配置微信小程序进行调试

1、打开微信开发者工具,点击设置--->安全设置 2、在安全设置选项卡窗口,开启服务端口,复制端口号3、返回到HBuilderX工具,点击工具--->设置--->运行配置,【配置外部web服务器调用url】和【微信开发者工具路径】 4、选中uni-app项目,点击运行--->运行到小程序…

说说webpack proxy工作原理?为什么能解决跨域?

一、是什么 webpack proxy,即webpack提供的代理服务 基本行为就是接收客户端发送的请求后转发给其他服务器 其目的是为了便于开发者在开发模式下解决跨域问题(浏览器安全策略限制) 想要实现代理首先需要一个中间服务器,webpack中提供服务器的工具为webpack-dev-server webp…

AST 简述

AST 是源代码的抽象语法结构的树状表示。利用它可以还原混淆后的js代码。 @babel/parser 是js语法编译器 Babel 的 nodejs 包,内置很多分析 js 的方法,可以实现js到AST的转换。 JS 转为 AST:https://astexplorer.net/ 准备工作: 需安装nodejs环境以及babel,babel 安装: n…

arco-init 项目初始化失败!Error: spawnSync pnpm.cmd ENOENT

今天使用arco创建项目时初始化失败,失败截图: 只需要安装 npm i -g pnpm 就可以了,不需要做额外配置,之后再初始化项目arco init hello-arco