现实生活中的使用场景
几个摄影师朋友找到你,
他们的摄影作品上传到自己的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 remoteset-url origin https://mirrors.aliyun.com/homebrew/brew.git
b、替换homebrew-core.git
cd"$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remoteset-url origin https://mirrors.aliyun.com/homebrew/homebrew-core.git
c、echo $SHELL 看输出结果是/bin/zsh还是/bin/bash
c-1、 /bin/zsh替换homebrew-bottles**
echo'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles'>> ~/.zshrc
source~/.zshrc
c-2、/bin/bash替换homebrew-bottles
echo'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles'>> ~/.bash_profile
source~/.bash_profile
到此已经好了go语言环境 既然编译环境准备好了 下面咱们开始编译下xuperchain源码 let‘s go
下载源码
gitclonehttps://gitee.com/pingfanrenbiji/xuperchain.git
下载的是master分支 当前版本 v3.7
编译
进入源码目录
cdxuperchain
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的地址
cdpn1
./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)
端口配置portmetricPortp2pv2 - port
节点1371013720047101
节点2371023720147102
节点3371033720247103
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++合约源码的编译
在官方源码中
cdxuperchain/core/contractsdk/cpp/example
目前支持c++、go、java、pb语言
目前官方推荐使用c++和go语言编写的合约文件 java语言还不支持
c++合约模版比较多 而且 有对应的编译脚本 很方便生成合约文件
这里举一个简单的实例说明一下如何进行c++语言的编译
c++语言的智能合约 依赖docker环境
cdcontractsdk/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 [email protected]
brew unlink [email protected]
brew switch [email protected] 1.13.9
ln -s /usr/local/Cellar/[email protected]/1.13.9/bin/go /usr/local/bin
执行go编译命令
cdxuperchain/core/contractsdk/go/example/eleccert
GOOS=js GOARCH=wasm go build eleccert.go
但此时会报错
go: github.com/BurntSushi/[email protected]: 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/pingfanrenbiji/xuper-java-sdk.git
参考官方文档
https://xuperchain.readthedocs.io/zh/latest/advanced_usage/create_contracts.html#wasm
注意是最新的版本哦
感谢
非常感谢
微信群【2群】百度超级链官方交流群中的前辈的技术支持
@超哥 和 老大哥 @国电通-¿¿¿¿¿