百度超级链xuperunion部署测试

编译后会生成一个output文件夹:

tree output
output
├── conf
│   ├── plugins.conf
│   ├── xchain.yaml
│   └── xchain.yaml.sample
├── data
│   ├── acl    
│   ├── blockchain   
│   ├── config
│   │   ├── decay_demo.json
│   │   ├── pmroot.json
│   │   ├── pow.json
│   │   ├── root_demo.json
│   │   └── xuper.json
│   ├── keys
│   │   ├── address      //默认用户账户地址
│   │   ├── private.key  //默认用户的私钥
│   │   └── public.key   // 默认用户的公钥
│   ├── netkeys
│   │   └── net_private.key
│   └── sample  //模板
│       ├── set_account_acl.json
│       └── set_method_acl.json
├── dump_chain
├── plugins
│   ├── consensus  //共识插件,目前支持pow,single,tdpos三种共识方式
│   │   ├── consensus-pow.so.1.0.0   
│   │   ├── consensus-single.so.1.0.0
│   │   └── consensus-tdpos.so.1.0.0
│   ├── contract
│   ├── crypto
│   │   └── crypto-default.so.1.0.0
│   └── kv
│       ├── kv-badger.so.1.0.0
│       ├── kv-ldb-multi.so.1.0.0
│       └── kv-ldb-single.so.1.0.0
├── wasm2c     //智能合约部署二进制文件
├── xchain        //服务端二进制文件
└── xchain-cli   //客户端二进制文件

3.新建链上账户

# 覆盖式创建账户
rm -r data/keys
./xchain-cli account newkeys  
#输出结果
create account using crypto type default
create account in ./data/keys

查询账户余额:

# 直接访问测试网,无需开启服务节点,我测试用的gas是向官方要的!
cd output && ./xchain-cli account balance asiRErZLVLVLXNa9qgUttZ5b5ym3uedvJ -H 14.215.179.74:37101
#输出结果
4983890
# asiRErZLVLVLXNa9qgUttZ5b5ym3uedvJ为你的账户地址, 14.215.179.74:37101为测试环境接入地址.

查询测试网状态:

./xchain-cli status -H  14.215.179.74:37101

#输出结果
{
  "blockchains": [
    {
      "name": "xuper",
      "ledger": {
        "rootBlockid": "d7b5ddb8347c9f27fa7bad09ee610665e6b0ab8cd15fd7e82e9e79bcb092dff4",
        "tipBlockid": "53042cc2dfdec062b292625ad0489e492702d1a93dfa897feea3c705529e506d",
        "trunkHeight": 835635,  //当前区块的高度
        "maxBlockSize": 33554432
      },
      "utxo": {
        "latestBlockid": "53042cc2dfdec062b292625ad0489e492702d1a93dfa897feea3c705529e506d",
        "lockKeyList": null,
        "utxoTotal": "10000000000000000",
        "avgDelay": 727,
        "unconfirmed": 0
      }
    }
  ],
  "peers": [
    "10.117.130.40:6718", //集群中部署了4个节点
    "10.117.131.14:6718",
    "10.117.135.39:6718",
    "10.117.131.15:6718"
  ],
  "speeds": {
    "SumSpeeds": {
      "GetBalance": 1.5066298863960237,
      "GetSystemStatus": 67.10594216407269,
      "QueryAcl": 1.139123969332878,
      "QueryTx": 1.0290288260044227
    },
    "BcSpeeds": {
      "xuper": {
        "BcSpeed": {
          "PostTx": 1.868379453458055
        }
      }
    }
  }
}

4.创建的合约账户

4.1创建合约账户

mkdir userconfing &&cd userconfig && vim newcontractaccount.json
#
{
  "module_name": "xkernel",
  "method_name": "NewAccount",
  "args" : {
    "account_name": "1234098776890001",  //说明:16位数字组成的字符串
    "acl": "{\"pm\": {\"rule\": 1,\"acceptValue\": 1},\"aksWeight\": {\"asiRErZLVLVLXNa9qgUttZ5b5ym3uedvJ\": 1}}"  // 这里的address改成自己的address
  }
}

image

Step1.设置黄反背书服务,初次使用都需要配置这个文件:

# 创建文件,并添加内容,保存退出
vim data/acl/addrs  
#添加黄反服务地址
SDnzqhbqm24NvHhFwThLXKpD9jFc9SzxH

#查看添加之后的效果
cat data/acl/addrs 
输出:
SDnzqhbqm24NvHhFwThLXKpD9jFc9SzxH

Step2: 生成创建合约账号的原始交易,命令如下:

./xchain-cli multisig gen --desc ./userconfig/newcontractaccount.json  -H 14.215.179.74:37101 --fee 1000 --output ./userconfig/rawTx.out

输出:

......
  "initiator": "asiRErZLVLVLXNa9qgUttZ5b5ym3uedvJ",
  "authRequire": [
    "SDnzqhbqm24NvHhFwThLXKpD9jFc9SzxH"   //指定使用了黄反服务的地址,所以需要黄反服务签名
  ],
  "initiatorSigns": null,
  "authRequireSigns": null,
  "receivedTimestamp:": 0

Step3: 向黄反服务获取签名,命令如下:

./xchain-cli multisig get --tx ./userconfig/rawTx.out --host 14.215.179.74:37101 --output  ./userconfig/complianceCheck.out

Step4: 自己对原始交易签名,命令如下:

./xchain-cli multisig sign --tx ./userconfig/rawTx.out --output ./userconfig/my.sign

Step5: 将黄反服务交易签名输出,原始交易输出以及自己对原始交易的签名发送出去,命令如下:

./xchain-cli multisig send ./userconfig/my.sign ./userconfig/complianceCheck.out --tx ./userconfig/rawTx.out -H 14.215.179.74:37101

Step6: 查询创建的合约账号,命令如下;

./xchain-cli account query --host 14.215.179.74:37101
[
  "XC1234098776890001@xuper"
]

查看ACL权限
./xchain-cli acl query --account XC1234098776890001@xuper --host 14.215.179.74:37101
{
  "pm": {
    "rule": 1
  },
  "aksWeight": {
    "asiRErZLVLVLXNa9qgUttZ5b5ym3uedvJ": 1
  }
}
confirmed

4.2 设置合约账户访问权限ACL

在创建合约账户的时候就已经设置的ACL,那么再次设置ACL的意义何在?
答:再次设置ACL仅仅是为了适用于需要修改合约账户访问权限的情况。再接下了的内容中,我将使用新的账户去更改原先的合约账户的所属账户的ACL权限。
创建一个./xchain-cli account newkeys --output data/yzwaccount

cat data/yzwaccount/address
VFd5yGvm2WPdDd3AbygdpdFES1BKr2ZnW

前提准备: 修改acl/addrs,添加权限设置:

SDnzqhbqm24NvHhFwThLXKpD9jFc9SzxH
XC1234098776890001@xuper/VFd5yGvm2WPdDd3AbygdpdFES1BKr2ZnW

image
Step1: 生成设置合约账号的原始交易,

编写accountAclSet.json文件

vim userconfig/accountAclSet.json
# 模版如下:
{
    "module_name": "xkernel",
    "method_name": "SetAccountAcl",
    "args" : { 
        "account_name": "XC1234098776890001@xuper",
        "acl": "{\"pm\": {\"rule\": 1,\"acceptValue\": 1},\"aksWeight\": {\"VFd5yGvm2WPdDd3AbygdpdFES1BKr2ZnW\": 1}}"
    }   
}

命令如下:

./xchain-cli multisig gen --desc  ./userconfig/accountAclSet.json -H 14.215.179.74:37101 --fee 10 --output  ./userconfig/rawTx.out

输出结果:

......
 "initiator": "asiRErZLVLVLXNa9qgUttZ5b5ym3uedvJ",//合约发起者
  "authRequire": [
    "SDnzqhbqm24NvHhFwThLXKpD9jFc9SzxH",
    "XC1234098776890001@xuper/VFd5yGvm2WPdDd3AbygdpdFES1BKr2ZnW"  //合约账号及拥有权限的acl账户,此处已经修改过了
  ],
  "initiatorSigns": null,
  "authRequireSigns": null,
  "receivedTimestamp:": 0
 }

Step2: 向黄反服务获取签名,命令如下:

./xchain-cli multisig get --tx ./userconfig/rawTx.out --host 14.215.179.74:37101 --output ./userconfig/complianceCheck.out

Step3: 自己对原始交易签名,命令如下:

./xchain-cli multisig sign --tx ./userconfig/rawTx.out --output ./userconfig/my.sign

Step4: 使用合约账号对合约acl原始交易输出签名

./xchain-cli multisig sign --tx ./userconfig/rawTx.out --keys ./data/yzwaccount/ --output verify.sign 

Step5: 将原始交易以及签名发送出去,命令如下:

./xchain-cli multisig send ./userconfig/my.sign ./userconfig/complianceCheck.out,./userconfig/verify.sign --tx ./userconfig/rawTx.out -H 14.215.179.74:37101
#输出交易ID
Tx id: d547f983992464718455836eff12de9be54698ba40bdddc3e24b608420f5a7e2

查看acl访问权限:

./xchain-cli acl query --account XC1234098776890001@xuper --host 14.215.179.74:37101
{
  "pm": {
    "rule": 1,
    "acceptValue": 1
  },
  "aksWeight": {
    "VFd5yGvm2WPdDd3AbygdpdFES1BKr2ZnW": 1
  }
}
confirmed

4.3 交易发起者向合约账户充入测试资源

合约部署需要合约账户才能操作,因此会消耗合约账户的测试资源,需要开发者先将个人账户的测试资源转一部分给合约账户。

去掉 data/acl/addrs中的一些权限属性,只留黄反服务,否则,会报错的.
如:# cat data/acl/addrs
SDnzqhbqm24NvHhFwThLXKpD9jFc9SzxH

Step1: 生成测试资源转给合约账户的原始交易数据,命令如下:

./xchain-cli multisig gen --to XC1234098776890001@xuper --amount 300000 --output  ./userconfig/rawTx.out  --host 14.215.179.74:37101

其中: --amount是转出的测试资源数量,--to是接收测试资源的账户名。如果转出方不是./data/keys下的默认地址,则可以使用--from指定转账来源账户,并将该来源地址的签名在multisig send时写在Initiator的位置。

Step2: 向黄反服务获取签名,命令如下:

./xchain-cli multisig get --tx ./userconfig/rawTx.out --output ./userconfig/complianceCheck.out --host 14.215.179.74:37101

Step3: 自己对原始交易签名,命令如下:

./xchain-cli multisig sign --tx ./userconfig/rawTx.out --output ./userconfig/my.sign

Step4: 将原始交易以及签名发送出去,命令如下:

./xchain-cli multisig send ./userconfig/my.sign ./userconfig/complianceCheck.out --tx ./userconfig/rawTx.out -H 14.215.179.74:37101

Step5: 查询合约账户的测试资源数额,确定转账成功:

./xchain-cli account balance XC1234098776890001@xuper -H 14.215.179.74:37101
# 输出结果:
300000

5.合约部署

5.1编译合约

编译一个C++版本的智能合约

cd contractsdk/cpp
vim yzwcounter.cc
#写入合约内容,合约最好是自定义的,见yzwcounter.cc

#编译合约
sh -x build.sh

yzwcounter.cc

#include "xchain/xchain.h"

struct YzwCounter : public xchain::Contract {};

DEFINE_METHOD(YzwCounter, initialize) {
    xchain::Context* ctx = self.context();
    const std::string& creator = ctx->arg("creator");
    if (creator.empty()) {
        ctx->error("missing creator");
        return;
    }
    ctx->put_object("creator", creator);
    ctx->ok("initialize succeed");
}

DEFINE_METHOD(YzwCounter, increase) {
    xchain::Context* ctx = self.context();
    const std::string& key = ctx->arg("key");
    std::string value;
    ctx->get_object(key, &value);
    int cnt = 0;
    cnt = atoi(value.c_str());
    char buf[32];
    snprintf(buf, 32, "%d", cnt + 1);
    ctx->put_object(key, buf);
    ctx->ok(buf);
}

DEFINE_METHOD(YzwCounter, get) {
    xchain::Context* ctx = self.context();
    const std::string& key = ctx->arg("key");
    std::string value;
    if (ctx->get_object(key, &value)) {
        ctx->ok(value);
    } else {
        ctx->error("key not found");
    }
}

5.2 部署合约

前提准备: 在步骤4.3我们修改访问控制权限,现在我们修改回来,修改acl/addrs,添加权限设置,如4.2所述:

SDnzqhbqm24NvHhFwThLXKpD9jFc9SzxH
XC1234098776890001@xuper/VFd5yGvm2WPdDd3AbygdpdFES1BKr2ZnW

并将编译好的合约可执行文件拷贝到工作目录下userconfig,重命名。

Step1: 生成部署合约的原始交易,命令如下:

./xchain-cli wasm deploy --account XC1234098776890001@xuper --cname  yzwcounter -H 14.215.179.74:37101 -m ./userconfig/counter --arg '{"creator":"xchain"}' --output ./userconfig/contractRawTx.out --fee 145000
# 输出结果
The gas you cousume is: 144198
The fee you pay is: 145000

Step2: 向黄反服务获取签名,命令如下:

./xchain-cli multisig get --tx ./userconfig/contractRawTx.out --host 14.215.179.74:37101 --output ./userconfig/complianceCheck.out

Step3: 自己对原始交易签名,命令如下:

./xchain-cli multisig sign --tx ./userconfig/contractRawTx.out --output ./userconfig/my.sign

Step4: 使用合约账号对合约原始交易输出签名,命令如下:

./xchain-cli multisig sign --tx ./userconfig/contractRawTx.out  --keys ./data/yzwaccount/ --output ./userconfig/verify.sign 

Step5: 将原始交易以及签名发送出去,命令如下:

./xchain-cli multisig send ./userconfig/my.sign ./userconfig/complianceCheck.out,./userconfig/verify.sign --tx ./userconfig/contractRawTx.out -H 14.215.179.74:37101
Tx id: dbf7fbc2b780ec8f2d7863aebb2c5cd7b06e22aa6a7707143eceb6d61d00d461

5.3合约调用

Step1: 生成合约调用的原始交易,命令有下面两种实现方式:

./xchain-cli multisig gen --desc counterIncrease.json -H 14.215.179.74:37101 --fee 90 --output  ./userconfig/rawTx.out 
vim  counterIncrease.json
#添加内容如下:
{
    "module_name": "wasm",
    "contract_name": "yzwcounter",
    "method_name": "increase",
    "args":{
        "key":"counter"
    }
}

OR(我使用了方法2)

./xchain-cli wasm invoke -a '{"key":"counter"}' --method increase yzwcounter -H 14.215.179.74:37101 --fee 90 -m --output ./userconfig/rawTx.out
输出
The gas you cousume is: 86
The fee you pay is: 90

step2: 修改acl文件,修改结果如下

cat data/acl/addrs 
SDnzqhbqm24NvHhFwThLXKpD9jFc9SzxH  #添加了普通合约账户AK的地址
XC1234098776890001@xuper/VFd5yGvm2WPdDd3AbygdpdFES1BKr2ZnW

Step2: 向黄反服务获取签名,命令如下:

./xchain-cli multisig get --tx ./userconfig/rawTx.out --host 14.215.179.74:37101 --output ./userconfig/complianceCheck.out

Step3: 自己对原始交易签名,命令如下:

./xchain-cli multisig sign --tx ./userconfig/rawTx.out --output ./userconfig/my.sign

Step4: 使用合约账号对合约原始交易输出签名,命令如下:

./xchain-cli multisig sign --tx ./userconfig/rawTx.out  --keys ./data/yzwaccount/ --output ./userconfig/verify.sign 

Step5: 将原始交易以及签名发送出去,命令如下:

./xchain-cli multisig send ./userconfig/my.sign ./userconfig/complianceCheck.out,./userconfig/verify.sign  --tx ./userconfig/rawTx.out -H 14.215.179.74:37101
输出:
Tx id: 72f3ab82df9d4b878c3442f7a50f39d90ad43d65b69815bb0339f381b23858d8

Step6: 查询交易信息,命令如下:

./xchain-cli wasm query -a '{"key":"counter"}' --method get -H 14.215.179.74:37101 yzwcounter

./xchain-cli wasm query yzwcounter --args '{"key":"counter"}' -H 14.215.179.74:37101

image
image
image

报错处理

执行sh build.sh报错docker: Error response from daemon: linux spec user: unable to find user --rm: no matching entries in passwd file.
ERRO[0000] error waiting for container: context canceled

报错处理:

#将build.sh修改为
docker run -u `id -u` --rm -v $(pwd):/src hub.baidubce.com/xchain/emcc emmake make

编译成功后将在build目录下生成一个yzwcouter.wasm的文件,到当前目录build里,将编译好的合约二进制yzwcouter.wasm,重新命名为yzwcouter,放到某个目录下,比如刚才的目录是./output/

问题

go语言合约花费gas太高了

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值