前言

这篇文章,咱们承接上文,来聊聊

上篇文章的飞机票

在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 排版