前言
这篇文章,咱们承接上文,来聊聊
上篇文章的飞机票
在 Xuper 链上部署 Java 语言智能合约和剖析存证合约的实现逻辑
“如何依据本人公司的业务逻辑定义存证合约外面的数据结构来实现存证智能合约”
首先须要明确下公司存证业务须要上链的数据结构
`{
“data”:””, #这里是一个动静的 json 字符串
“businessId”:””, #业务 id
“fileHash”:””, #文件 hash
“applyNotarization”,”” #申请组织编号
“entityName”:”” #公司名称
}`
业务需要
1、将下面的数据上链
2、能够通过业务 id businessId 和 fileHash 查问
官网给的 go 语言版本的存证合约模版
` 这个咱上篇文章曾经具体介绍过存证合约模版的实现逻辑了
这里把数据结构贴出来 而后和本人须要的数据结构进行比对
{
“Owner”:”xiaoming” , # 这个示意用户名
“UserFiles”:{# 这个是一个 map 汇合
“filehash”:{# map 汇合的 key 是文件 hash
“Timestamp”:”” # 工夫戳
“Hashval”:”” # []byte(filehash) 其实也是 hash 值
}
}
}`
比对后果
1、filehash 这个 map 的 key 对应的 value 是一个对象 对象内容官网模版只有 Timestamp 和 Hashval 这 2 个字段 那么咱们把 data、businessId、fileHash、applyNotarization、entityName 这 5 个字段退出进去
2、另外咱们上篇文章也说了 官网模版外面 是通过 owner 和 filehash 确认一条上链数据的,那么咱们的需要又减少了一个查问参数 businessId 那么再增加一个 map 汇合 外面的与元素 key 示意 businessId value 示意一个对象的 json 字符串不就能够解决了
最终合乎业务需要的数据结构
`{
“Owner”:”xiaoming”,
“UserFiles”:{
“filehash”:{
“Timestamp”:””,
“Hashval”:””,
“data”:””,
“businessId”:””,
“applyNotarization”:””,
“entityName”:””,
“fileHash”:””
}
},
“BuisnessUserFiles”:{
“businessId”:{
“Timestamp”:””,
“Hashval”:””,
“data”:””,
“businessId”:””,
“applyNotarization”:””,
“entityName”:””,
“fileHash”:””
}
}
}`
上面存证合约模版代码
- 数据结构
1、增加了一个 map 汇合 key-value,key 为 businessId
2、将那 5 个业务字段增加进去
3、须要留神的是 对象外面的参数首字母必须大写 否则 给属性赋不了值
- 数据上链办法批改
模拟 filehash 书写的形式和逻辑
1、给属性赋值
2、给 map 汇合赋值或初始化
- 查询方法
这 2 个查问的办法也是模拟官网模版外面的 getFile 办法
编译合约
` 进入到 go 源码合约文件目录
GOOS=js GOARCH=wasm go build -o hello.wasm
会编译合约文件生成一个 hello.wasm 文件 `
部署合约
./xchain-cli wasm deploy --account XC1111111111111111@xuper --cname hello_last_9 --fee 5574291 --runtime go ./hello-go/hello.wasm -a '{"owner":"mengfanxiao"}'
调用合约
若合约源码问题有问题如何解决
景象是:合约部署胜利 但调用合约失败
那么就能够认定是 本人自定义的合约代码有问题
如果每次测试合约都须要部署到链上再发动调用会特地麻烦,官网提供的 3 种形式,能够脱离链上环境运行合约
官网提供的 3 种形式 下面的 go 语言合约代码问题我是通过形式 2 实现的 没有通过官网提供的这 3 种形式解决 起因如下;
这里简略的说下目前的现状 截止 20200706,次要目标是防止敌人们在坑里待得工夫太久 耽搁了进度
官网文档
https://xuperchain.readthedoc…_manuals/XdevManual.html
通过百度超级链官网控制台入口来测试合约源码文件是否有问题
目前仅仅反对 c ++ 语言开发的合约的测试,那咱们用的是 go 语言,所以这种形式就用不了,为什么用 go 语言呢,因为只有 go 语言才有存证的合约模版
大抵的应用步骤是
a、先注册一个账号登陆控制台
b、充值 2 元钱
c、创立一个合约账户
d、创立合约
d-1 输出合约名称
d-2 能够抉择现有的模版,也能够抉择空白的模版
d-2-1 抉择空白模版的话 能够将本人的 c ++ 编写的合约代码复制进去
空白模版
d-2-2 若是抉择的现有的模版 能够基于现有的模版代码进行批改
通过 xdev 可执行命令来测试
dev 工具是随 xuperchain 公布的一个合约编译和测试工具
先来运行下官网给的例子 相熟下流程和确保运行环境没有问题
咱们目前的环境是最新版的 master 版本
应用默认的形式启动的 nohup ./xchain &
应用 xdev 测试 c ++ 语言合约
- 配置环境变量
`export PATH=$HOME/xuperchain/output:$PATH
export XDEV_ROOT=$HOME/xuperchain/core/contractsdk/cpp
留神这里配置的是 cpp 目录 `
- 初始化代码
xdev init hello-cpp
目录构造和图【空白模版】是对应的
- 编译
`cd hello-cpp
xdev build -o hello.wasm`
- 部署下合约
./xchain-cli wasm deploy --account XC1111111111111111@xuper --cname hello --fee 5200000 --runtime c ./hello-cpp/hello.wasm
- 调用合约
./xchain-cli wasm invoke --method hello --fee 110000 hello
- 测试
xdev test
合约部署和调用都能够通过
应用 xdev 测试 go 语言存证模版合约
- 编译
`cd xuperchain/core/contractsdk/go/example/eleccert
GOOS=js GOARCH=wasm go build -o hello.wasm`
- 合约部署
`./xchain-cli wasm deploy –account XC1111111111111111@xuper –cname hello –fee 5200000 –runtime go ./hello-go/hello.wasm
此时会报错使得以后节点挂掉 `
梳理下问题景象
1、以后节点环境是通过 nohup ./xchain & 形式启动的
2、通过 wsam 部署形式部署 c ++ 合约对应的合约文件是能够的
3、通过 wsam 部署形式部署 go 合约对应的合约文件是不能够的 会导致节点挂掉
调整启动形式
nohup ./xchain –vm ixvm &
而后再执行下面的部署命令是能够的
论断
目前版本可能还不反对没有指定 –vm ixvm 虚拟机的状况下通过 wasm 的形式部署 go 语言合约
还有一种可能是下面配置的环境变量配置的是 cpp 这里是不是须要配置成 go?敌人们感兴趣的话 能够尝试下
- 测试
- go 和 c ++ 合约文件区别
上面咱通过同样的形式部署下咱们自定义的存证的智能合约
1、先对 go 源码文件编译生成 hello.wasm 文件
2、复制到 hello-go 文件夹
3、执行 xdev test 命令
此时心里十万个茶叶蛋飞奔而过
我辛辛苦苦应用 xdev 测试我的合约文件 想找出外面是哪里的代码有问题 但你却通知我这种构造,遂“含恨”放弃这种形式
第三种形式 是通过 vscode 来编译源码文件
这种形式就不演示了 原理就是用的 xdev 命令对源码进行编译 (build) 和测试(test)
因为我对 vscode 编译 go 不太熟 所以这里简略的记录下步骤 免得下次用 vscode 再对 go 编译的时候看看这里就晓得了
1、关上 vscode 增加 add workspace 工作目录 指定一个文件夹 该文件夹上面蕴含 go 源码文件
2、Terminal-Configure Tasks-create task.json
`{
// See https://go.microsoft.com/fwli…
// for the documentation about the tasks.json format
“version”: “2.0.0”,
“tasks”: [
{
“label”: “xdev build”,
“type”: “shell”,
“command”: “xdev build -p”,
“options”: {
“cwd”: “${workspaceFolder}”
},
“group”: {
“kind”: “build”,
“isDefault”: true
}
},
{
“label”: “xdev test”,
“type”: “shell”,
“command”: “xdev test”,
“options”: {
“cwd”: “${workspaceFolder}”
}
}
]
}`
3、而后 Terminal-run Build Task 的时候也始终报错 说找不到 XDEV_ROOT,XCHAIN_ROOT 环境变量
因为我晓得原理就是利用的 xdev 来做的,我对 xdev 曾经不抱什么心愿了,所以就没有再去解决这个问题
起初转变了下方向 终于找到了适宜的方向
比拟适合的办法【举荐】
我一开始想着既然是合约源码有问题,那么在源码文件中增加一些日志,而后一行一行的进行定位不就能够找到问题代码了吗,起初看了下存证模版源码文件中没有输入日志的代码 所以我就没有采纳这种形式
大家能够试下 增加写日志文件 而后去 logs/contract.log 日志文件中找下日志
我最终采纳的形式是:
1、一份存证模版文件源码 这个必定是没有问题的
2、我基于模版文件源码新写的一份文件
我在想在模版文件中增加了这么多代码 第一次执行必定会有问题的
相似于“步子垮大了 容易扯蛋”,“一口不能吃下一个大瘦子”
那么我将新增的代码一点一点的放入模版文件,每次放入都会经验编译、部署、调用执行的过程 确保每次新增的代码没有问题,遂很快的解决了这个问题
手续费去向问题
通过节点账户调用合约发动交易,那么手续费起源节点账户,目标账户是出块节点账户吗
咱们查看交易详情
./xchain-cli tx query 1fcc2d5cc2e6bad345a21d14871bd641167c44b5a5ac69076d3095458ed94784
不查不晓得 一查吓一跳 请看蓝色字体
1、起源账户余额不止这个数 怎么是 1000000
2、目标账户怎么是 $
大家是不是在放心账户余额要是不够了,是不是发动不了交易了?
这个放心是多余的
起因:
- 因为以后节点是出块节点,每次出块都会有处分,每次处分的金额能够调整 如果放心的话 能够调大点
- 再一个就是定时出块机制 每隔 3 秒出一次处分一次
- 初始金额能够调大些
还不释怀的话 能够多个节点账户做备用账户 若一个账户余额不够了 则应用其余的账户来发动合约交易(当然须要对应账户上面的合约账户部署的合约喽)
下面遗留的 2 个问题 咱们下回分解哦
自定义合约文件源码地址
https://gitee.com/pingfanrenbiji/xuper-java-sdk/blob/master/src/test/resources/com/baidu/xuperunion/api/eleccert.go
本文应用 mdnice 排版