在百度超級(jí)鏈Xuper上部署智能合約并實(shí)現(xiàn)存證功能

現(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ù)支持

@超哥?和?老大哥?@國電通-?????

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容