首页 > 其他分享 >webase go-sdk 简单使用

webase go-sdk 简单使用

时间:2024-05-15 18:56:48浏览次数:13  
标签:function string public webase returns go view id sdk

本流程在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 table
    function 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 main

import (
    "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方法的交易hash
    fmt.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

结果如下:

 

标签:function,string,public,webase,returns,go,view,id,sdk
From: https://www.cnblogs.com/Owhy/p/18194331

相关文章

  • PixelBook go刷回Chrome OS 小记(无备份BIOS恢复BIOS+刷回chrome os)
    参考主要看这两篇文章即可文章A:HowtoRestoreaChromebook’sOriginalBIOS文章B:chromebook恢复bios及刷回chromeos教程特别感谢网站(跪谢):MrChromeboxoverview先说现在系统的状态:第三方bios+Win11接下来需要进行的步骤,大概分为三步:安装/引导fydeos恢复原版bios用......
  • 2024-05-15:用go语言,考虑一个整数 k 和一个整数 x。 对于一个数字 num, 在其二进制表示
    2024-05-15:用go语言,考虑一个整数k和一个整数x。对于一个数字num,在其二进制表示中,从最低有效位开始,我们计算在x,2x,3x等位置处设定位的数量来确定其价值。举例说明,若对于x=1,num=13,则二进制表示为000001101,对应的价值为3。又如,当x=2,num=13,二进制表示依然为000001101,但对......
  • 洛谷题单指南-动态规划3-P4342 [IOI1998] Polygon
    原题链接:https://www.luogu.com.cn/problem/P4342题意解读:环中节点表示数字,边表示运算符,可以任意断一条边,其余节点两两按边的符号计算,求结果的最大值,以及最大值是断开那些边可以得到。解题思路:题意中有几个个关键信息:环形,节点数为n,边数为n任意断一条边,即可以从任意节点开始,......
  • 错误解决 TypeError: __init__() got an unexpected keyword argument 'size'import l
    TypeError:__init__()gotanunexpectedkeywordargument'size'importlogging代码段如下importloggingimportosfromgensim.modelsimportword2veclogging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s',level=logging.IN......
  • IceRPC之调用管道Invocation pipeline与传出请求Outgoing request->快乐的RPC
    作者引言.Net8.0下的新RPC很高兴啊,我们来到了IceRPC之调用管道Invocationpipeline与传出请求Outgoingrequest->快乐的RPC,基础引导,让自已不在迷茫,快乐的畅游世界。调用管道Invocationpipeline了解如何发送请求requests和接收响应responses。定义发送请求并接收......
  • 【django学习-24】自定义插件
    1.ModelForm可以帮助我们生成HTML标签,这种是普通的标签classUserModelForm(forms.ModelForm):classMeta:model=models.UserInfofields=["name","password",]form=UserModelForm()2.如果我们要使用bootstrap的标签,该怎么操作呢?2.1:自定义......
  • django启动时执行某个操作数据库的方法怎么实现
    为了让django启动时就执行某些方法做了如下尝试一、在Django中,可以通过AppConfig类的ready()方法来实现在Django启动时执行某个方法。首先,在你的应用的apps.py文件中,创建一个继承自AppConfig类的子类,并重写ready()方法。例如,假设你的应用名为myapp,则可以创建一个MyAppConfig类:......
  • 【强化学习】A grid world 值迭代算法 (value iterator algorithm)
    强化学习——值迭代算法代码是在jupyternotebook环境下编写只需要numpy和matplotlib包。此代码为学习赵世钰老师强化学习课程之后,按照公式写出来的代码,对应第四章第一节valueiteratoralgorithm可以做的实验:调整gama值观察策略的变化调整惩罚值(fa)的大小观察......
  • golang- 实现多环境配置
    需要安装插件gogetgopkg.in/yaml.v3配置yaml文件  然后配置数据块与yaml结构相同,用来接收数据,字段需要配置映射关系,如下完整的执行代码如下//初始化yaml文件funcdoYaml(){envName:=ParamsObj.EnvifStringUtil.IsEmpty(envName){envNa......
  • Go-Zero定义API实战:探索API语法规范与最佳实践(五)
    前言上一篇文章带你实现了Go-Zero模板定制化,本文将继续分享如何使用GO-ZERO进行业务开发。通过编写API层,我们能够对外进行接口的暴露,因此学习规范的API层编写姿势是很重要的。通过本文的分享,你将能够学习到Go-Zero的API语法规范,以及学会实际上手使用。概述下文所说的是api......