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

87次阅读

共计 6053 个字符,预计需要花费 16 分钟才能阅读完成。

现实生活中的使用场景

` 几个摄影师朋友找到你,
他们的摄影作品上传到自己的 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
`

` 这样就安装好了,这里涉及到一个问题,
就是通过 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 分支哦
`

多节点配置

创建节点目录

`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
`

`vim pn3/conf/xchain.yaml
`

多节点运行

` 依次在 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
`

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

  • 脚本内容

`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
`

部署并执行存证合约

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

` 在官方源码中

cd xuperchain/core/contractsdk/cpp/example

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

` 目前官方推荐使用 c ++ 和 go 语言编写的合约文件 java 语言还不支持 
c++ 合约模版比较多 而且 有对应的编译脚本 很方便生成合约文件

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

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

cd contractsdk/cpp

sh build.sh

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

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”}’
`

  • 存证合约的执行

a、通过命令行执行

`/xchain-cli wasm invoke -a ‘{“owner”: “mengfanxiao”,”filehash”: “xxx11111″,”timestamp”: “111111”}’ –method save -H localhost:37101 eleccert –fee 5568179
`

b、通过 java-sdk 代码执行

  • 存证合约的查询

a、通过命令行执行

`./xchain-cli wasm query -a ‘{“owner”: “mengfanxiao”,”filehash”: “xxx11111″,”timestamp”: “111111”}’ –method query -H localhost:37101 eleccert
`

b、通过 java-sdk 代码查询

java sdk 源码地址

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

参考官方文档

`https://xuperchain.readthedoc…
注意是最新的版本哦
`

感谢

` 非常感谢 ???? 

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

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

正文完
 0