現(xiàn)實(shí)生活中的使用場景
幾個(gè)攝影師朋友找到你,
他們的攝影作品上傳到自己的blog后總是被其他人盜用,
使用水印之類的方法也無法避免像截取部分這種情況,
他們需要一個(gè)能證明攝影作品最早是由
自己上傳、而且具有法律效力可供自己進(jìn)行維權(quán)的工具
顯然區(qū)塊鏈對于解決此問題有很大的幫助,
它的不可篡改等特性很適合存證維權(quán)的場景,
我們可以通過XuperChain來構(gòu)建一個(gè)存取證據(jù)的智能合約
下面就來幫助攝影師朋友開發(fā)一個(gè)
能夠存儲(chǔ)照片版權(quán)、還能在發(fā)現(xiàn)被盜用后進(jìn)行維權(quán)的智能合約
搭建xuper節(jié)點(diǎn)環(huán)境(多節(jié)點(diǎn))
環(huán)境準(zhǔn)備
go 1.12以上
git
g++4.8.2以上
git和g++之前已經(jīng)安裝好了,現(xiàn)在安裝下go環(huán)境(接下來的a、b、c介紹的是通過mac安裝go語言環(huán)境?如果非mac的小伙伴?可以跳過了)
通過brew安裝go
brew?install?go

這樣就安裝好了,這里涉及到一個(gè)問題,
就是通過brew下載安裝包速度的問題,
之前的文章也介紹過,這里再重復(fù)下,
以免朋友們在下載安裝包這塊浪費(fèi)太多時(shí)間,
方法就是更換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 看輸出結(jié)果是/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
到此已經(jīng)好了go語言環(huán)境 既然編譯環(huán)境準(zhǔn)備好了 下面咱們開始編譯下xuperchain源碼 let‘s go
下載源碼
gitclonehttps://gitee.com/pingfanrenbiji/xuperchain.git
下載的是master分支?當(dāng)前版本?v3.7
編譯
進(jìn)入源碼目錄
cdxuperchain
make
編譯好之后?就會(huì)在output文件夾下面出現(xiàn)編譯之后的文件
這里需要注意下?一定要安裝master分支
不要安裝老的分支?比如v3.1分支
v3.1分支是pow共識(shí)
我一開始就用的這個(gè)版本的代碼?節(jié)點(diǎn)是可以部署
但使用命令或通過sdk調(diào)用和鏈交互就會(huì)有出現(xiàn)問題
所以一定要用master分支哦

多節(jié)點(diǎn)配置
創(chuàng)建節(jié)點(diǎn)目錄
mkdir?pn1
mkdir?pn2
mkdir?pn3
將編譯之后的所有文件copy到相應(yīng)的節(jié)點(diǎn)目錄
cp?-r?output/*?pn1
cp?-r?output/*?pn2
cp?-r?output/*?pn3
節(jié)點(diǎn)1配置
查看節(jié)點(diǎn)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"
]
}
}
}
}
復(fù)制該文件替換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 執(zhí)行下面兩條指令
./xchain-cli?account?newkeys?-f
./xchain-cli?netURL?gen
此時(shí)在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?復(fù)制?放入pn2和pn3?data/conf/xchain.yaml文件中的bootNodes
配置pn2和pn3節(jié)點(diǎn)(端口號(hào)+1)
端口配置portmetricPortp2pv2 - port
節(jié)點(diǎn)1371013720047101
節(jié)點(diǎn)2371023720147102
節(jié)點(diǎn)3371033720247103
vim?pn2/conf/xchain.yaml

vim?pn3/conf/xchain.yaml

多節(jié)點(diǎn)運(yùn)行
依次在pn1、pn2、pn3下面執(zhí)行
./xchain-cli?createChain
注意這里需要使用解釋模式來啟動(dòng)
nohup?./xchain?--vm?ixvm?&?而非
nohup?./xchain?&?原因是部署go語言合約的時(shí)候需要
查看多節(jié)點(diǎn)環(huán)境是否正常
./xchain-cli?status?-H?127.0.0.1:37101
查看節(jié)點(diǎn)1狀態(tài)?其中peers?顯示的是?節(jié)點(diǎn)2和節(jié)點(diǎn)3的地址?說明多節(jié)點(diǎn)環(huán)境搭建OK

多節(jié)點(diǎn)統(tǒng)一查詢區(qū)塊數(shù)腳本
腳本內(nèi)容
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
~
執(zhí)行腳本
bash?get_trunkHeight

部署并執(zhí)行存證合約
簡單介紹下c++合約源碼的編譯
在官方源碼中
cdxuperchain/core/contractsdk/cpp/example
目前支持c++、go、java、pb語言

目前官方推薦使用c++和go語言編寫的合約文件?java語言還不支持
c++合約模版比較多?而且?有對應(yīng)的編譯腳本?很方便生成合約文件
這里舉一個(gè)簡單的實(shí)例說明一下如何進(jìn)行c++語言的編譯
c++語言的智能合約?依賴docker環(huán)境
cdcontractsdk/cpp
sh?build.sh
到當(dāng)前目錄build里即是編譯好的合約二進(jìn)制

java語言編寫的合約代碼
作為以java語言為生的程序猿來說
大家都非常期待?java語言編寫的合約代碼
但截止目前20200705還不支持(
即目前版本的鏈不支持、也沒有相應(yīng)的文檔)
僅僅又一個(gè)java語言編寫的合約模版(xuperchain/core/contractsdk/java)
但并未提供如何編譯成合約文件的文檔
官方內(nèi)部說預(yù)計(jì)7月底會(huì)支持
期待哦
編譯go語言編寫的合約文件(以存證合約為例)
存證合約在go文件夾中
xuperchain/core/contractsdk/go/example/eleccert/eleccert.go
安裝go語言編譯環(huán)境
這里需要注意下
截止當(dāng)前日期?20200705?為止
目前master分支版本的鏈源碼
僅支持?go1.13版本的
還不支持go.1.14版本的
問了下官方內(nèi)部的技術(shù)擔(dān)當(dāng)說是預(yù)計(jì)下周就會(huì)支持go1.14版本的
但目前我本地是go.14.1版本的
所以需要再安裝一個(gè)go1.13版本的
并切換下go環(huán)境
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
執(zhí)行g(shù)o編譯命令
cdxuperchain/core/contractsdk/go/example/eleccert
GOOS=js?GOARCH=wasm?go?build?eleccert.go
但此時(shí)會(huì)報(bào)錯(cuò)
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
原因是?所下載的庫依賴有官方庫,而官方被封禁網(wǎng)導(dǎo)致
處理的方法?設(shè)置代理
go?env?-w?GOPROXY=https://goproxy.cn
設(shè)置完之后重新執(zhí)行即可
ps:go1.11發(fā)布后,還發(fā)布一個(gè)goproxy提供代理服務(wù),goproxy.cn是專門服務(wù)于中國的,依賴于七牛云
github地址:?https://github.com/goproxy
執(zhí)行完編譯命令之后?將至統(tǒng)一放到指定目錄方便進(jìn)行管理
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"}'

存證合約的執(zhí)行
a、通過命令行執(zhí)行
/xchain-cli?wasm?invoke?-a'{"owner":?"mengfanxiao","filehash":?"xxx11111","timestamp":?"111111"}'--method?save?-H?localhost:37101?eleccert?--fee?5568179

b、通過java-sdk代碼執(zhí)行

存證合約的查詢
a、通過命令行執(zhí)行
./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群】百度超級(jí)鏈官方交流群中的前輩的技術(shù)支持
@超哥?和?老大哥?@國電通-?????