转载

在百度超级链Xuper上部署智能合约并实现存证功能

现实生活中的使用场景

`几个摄影师朋友找到你,

他们的摄影作品上传到自己的blog后总是被其他人盗用,

使用水印之类的方法也无法避免像截取部分这种情况,

他们需要一个能证明摄影作品最早是由

自己上传、而且具有法律效力可供自己进行维权的工具

显然区块链对于解决此问题有很大的帮助,

它的不可篡改等特性很适合存证维权的场景,

我们可以通过XuperChain来构建一个存取证据的智能合约

下面就来帮助摄影师朋友开发一个

能够存储照片版权、还能在发现被盗用后进行维权的智能合约

`

搭建xuper节点环境(多节点)

环境准备

  • go 1.12以上
  • git
  • g++4.8.2以上

`git和g++之前已经安装好了,现在安装下go环境(接下来的a、b、c介绍的是通过mac安装go语言环境 如果非mac的小伙伴 可以跳过了)

`

通过brew安装go

`brew install go

`

在百度超级链Xuper上部署智能合约并实现存证功能

`这样就安装好了,这里涉及到一个问题,

就是通过brew下载安装包速度的问题,

之前的文章也介绍过,这里再重复下,

以免朋友们在下载安装包这块浪费太多时间,

方法就是更换Homebrew源

`

a、替换brew.git

`cd "$(brew --repo)"

git remote set-url origin  https://mirrors.aliyun.com/ho...

`

b、替换homebrew-core.git

`cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"

git remote set-url origin  https://mirrors.aliyun.com/ho...

`

c、echo $SHELL 看输出结果是/bin/zsh还是/bin/bash

c-1、 /bin/zsh替换homebrew-bottles**

`echo 'export HOMEBREW_BOTTLE_DOMAIN= https://mirrors.aliyun.com/ho... ' >> ~/.zshrc

source ~/.zshrc

`

c-2、/bin/bash替换homebrew-bottles

`echo 'export HOMEBREW_BOTTLE_DOMAIN= https://mirrors.ustc.edu.cn/h... ' >> ~/.bash_profile

source ~/.bash_profile

`

到此已经好了go语言环境 既然编译环境准备好了 下面咱们开始编译下xuperchain源码 let‘s go

下载源码

`git clone https://gitee.com/pingfanrenb...

下载的是master分支 当前版本 v3.7

`

编译

`进入源码目录

cd xuperchain

make

编译好之后 就会在output文件夹下面出现编译之后的文件

这里需要注意下 一定要安装master分支

不要安装老的分支 比如v3.1分支

v3.1分支是pow共识 

我一开始就用的这个版本的代码 节点是可以部署 

但使用命令或通过sdk调用和链交互就会有出现问题 

所以一定要用master分支哦

`

在百度超级链Xuper上部署智能合约并实现存证功能

多节点配置

创建节点目录

`mkdir pn1

mkdir pn2

mkdir pn3

将编译之后的所有文件copy到相应的节点目录

cp -r output/* pn1

cp -r output/* pn2

cp -r output/* pn3

`

节点1配置

  • 查看节点1地址

`cat pn1/data/keys/address dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN

dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN

`

  • 将该地址配置到 pn1/data/config/xuper.json 里的address

`

cat pn1/data/config/xuper.json

{

"version": "1",

"predistribution": [

{

"address": "dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN",

"quota": "100000000000000000000"

}

],

"maxblocksize": "128",

"award": "1000000",

"decimals": "8",

"award_decay": {

"height_gap": 31536000,

"ratio": 1

},

"gas_price": {

"cpu_rate": 1000,

"mem_rate": 1000000,

"disk_rate": 1,

"xfee_rate": 1

},

"new_account_resource_amount": 1000,

"genesis_consensus": {

"name": "tdpos",

"config": {

"timestamp": "1559021720000000000",

"proposer_num": "1",

"period": "3000",

"alternate_interval": "3000",

"term_interval": "6000",

"block_num": "20",

"vote_unit_price": "1",

"init_proposer": {

"1": [

"dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN"

]

},

"init_proposer_neturl": {

"1": [

"/ip4/127.0.0.1/tcp/47101/p2p/QmVxeNubpg1ZQjQT8W5yZC9fD7ZB1ViArwvyGUB53sqf8e"

]

}

}

}

}

`

  • 复制该文件替换pn2/data/config/ 和 pn3/data/config/ 下的 xuper.json

`cp pn1/data/config/xuper.json pn2/data/config/xuper.json

cp pn1/data/config/xuper.json pn3/data/config/xuper.json

`

  • 依次 cd pn2 和 cd pn3 执行下面两条指令

`./xchain-cli account newkeys -f

./xchain-cli netURL gen

此时在pn2和pn3 /data 目录下生成新的 keys 和 netkeys 文件夹 通过 more data/keys/address 分别得到pn2和pn3的address

`

  • 查看p1的地址

`cd pn1

./xchain-cli netURL get

"/ip4/127.0.0.1/tcp/47101/p2p/QmVxeNubpg1ZQjQT8W5yZC9fD7ZB1ViArwvyGUB53sqf8e"

得到pn1.url 复制 放入pn2和pn3 data/conf/xchain.yaml文件中的bootNodes

`

  • 配置pn2和pn3节点(端口号+1)

端口配置

port

metricPort

p2pv2 - port

节点1

37101

37200

47101

节点2

37102

37201

47102

节点3

37103

37202

47103

`vim pn2/conf/xchain.yaml

`

在百度超级链Xuper上部署智能合约并实现存证功能

`vim pn3/conf/xchain.yaml

`

在百度超级链Xuper上部署智能合约并实现存证功能

多节点运行

`依次在pn1、pn2、pn3下面执行

./xchain-cli createChain

注意这里需要使用解释模式来启动

nohup ./xchain --vm ixvm & 而非

nohup ./xchain & 原因是部署go语言合约的时候需要

`

查看多节点环境是否正常

`./xchain-cli status -H 127.0.0.1:37101

查看节点1状态 其中peers 显示的是 节点2和节点3的地址 说明多节点环境搭建OK

`

在百度超级链Xuper上部署智能合约并实现存证功能

多节点统一查询区块数脚本

  • 脚本内容

`vim get_trunkHeight

!/bin/bash

for((i=1;i<=3;i++));

do

echo -n "node$i:";

./xchain-cli status -H 127.0.0.1:3710$i | grep trunkHeight;

done

~`

  • 执行脚本

`bash get_trunkHeight

`

在百度超级链Xuper上部署智能合约并实现存证功能

部署并执行存证合约

简单介绍下c++合约源码的编译

`在官方源码中

cd xuperchain/core/contractsdk/cpp/example

目前支持c++、go、java、pb语言

`

在百度超级链Xuper上部署智能合约并实现存证功能

`目前官方推荐使用c++和go语言编写的合约文件 java语言还不支持

c++合约模版比较多 而且 有对应的编译脚本 很方便生成合约文件

这里举一个简单的实例说明一下如何进行c++语言的编译

c++语言的智能合约 依赖docker环境

cd contractsdk/cpp

sh build.sh

到当前目录build里即是编译好的合约二进制

`

在百度超级链Xuper上部署智能合约并实现存证功能

java语言编写的合约代码

`作为以java语言为生的程序猿来说

大家都非常期待 java语言编写的合约代码 

但截止目前20200705还不支持(

即目前版本的链不支持、也没有相应的文档)

仅仅又一个java语言编写的合约模版(xuperchain/core/contractsdk/java) 

但并未提供如何编译成合约文件的文档 

官方内部说预计7月底会支持

期待哦

`

编译go语言编写的合约文件(以存证合约为例)

`存证合约在go文件夹中

xuperchain/core/contractsdk/go/example/eleccert/eleccert.go

`

  • 安装go语言编译环境

`这里需要注意下

截止当前日期 20200705 为止 

目前master分支版本的链源码 

仅支持 go1.13版本的 

还不支持go.1.14版本的 

问了下官方内部的技术担当说是预计下周就会支持go1.14版本的

但目前我本地是go.14.1版本的 

所以需要再安装一个go1.13版本的 

并切换下go环境

brew install go@1.13

brew unlink go@1.14

brew switch go@1.13  1.13.9

ln -s /usr/local/Cellar/go@1.13/1.13.9/bin/go /usr/local/bin

`

  • 执行go编译命令

`cd xuperchain/core/contractsdk/go/example/eleccert

GOOS=js GOARCH=wasm go build eleccert.go

但此时会报错

go: github.com/BurntSushi/toml@v0.3.1: Get "https://proxy.golang.org/github.com/%21burnt%21sushi/toml/@v/v0.3.1.mod": dial tcp 172.217.24.17:443: i/o timeout

原因是 所下载的库依赖有官方库,而官方被封禁网导致

处理的方法 设置代理

go env -w GOPROXY= https://goproxy.cn

设置完之后重新执行即可

ps:go1.11发布后,还发布一个goproxy提供代理服务,goproxy.cn是专门服务于中国的,依赖于七牛云

github地址:  https://github.com/goproxy

执行完编译命令之后 将至统一放到指定目录方便进行管理

cp core/contractsdk/go/example/eleccert/eleccert data/blockchain/xuper/wasm/

`

  • 存证合约部署

`./xchain-cli wasm deploy --account XC1111111111111111@xuper --cname eleccert  -a '{"creator": "someone"}' -A data/acl/addrs -o tx.output --keys data/keys --name xuper -H localhost:37101 /Users/mengfanxiao/Documents/project/company/XinPools_INFO/document/business/baidu/xuperchain/data/blockchain/xuper/wasm/eleccert --fee 5568179 --runtime=go -a '{"owner":"mengfanxiao"}'

`

在百度超级链Xuper上部署智能合约并实现存证功能

  • 存证合约的执行

a、通过命令行执行

`/xchain-cli wasm invoke -a '{"owner": "mengfanxiao","filehash": "xxx11111","timestamp": "111111"}' --method save -H localhost:37101 eleccert --fee 5568179

`

在百度超级链Xuper上部署智能合约并实现存证功能

b、通过java-sdk代码执行

在百度超级链Xuper上部署智能合约并实现存证功能

  • 存证合约的查询

a、通过命令行执行

`./xchain-cli wasm query -a '{"owner": "mengfanxiao","filehash": "xxx11111","timestamp": "111111"}' --method query -H localhost:37101 eleccert

`

在百度超级链Xuper上部署智能合约并实现存证功能

b、通过java-sdk代码查询

在百度超级链Xuper上部署智能合约并实现存证功能

java sdk 源码地址

` https://gitee.com/pingfanrenb...

`

参考官方文档

` https://xuperchain.readthedoc...

注意是最新的版本哦

`

感谢

`非常感谢 :pray:

微信群【2群】百度超级链官方交流群中的前辈的技术支持

@超哥 和 老大哥 @国电通-¿¿¿¿¿

`

原文  https://segmentfault.com/a/1190000023099547
正文到此结束
Loading...