在百度超級鏈Xuper上部署智能合約並實現存證功能

現實生活中的使用場景

`幾個攝影師朋友找到你,
他們的攝影做品上傳到本身的blog後老是被其餘人盜用,
使用水印之類的方法也沒法避免像截取部分這種狀況,
他們須要一個能證實攝影做品最先是由
本身上傳、並且具備法律效力可供本身進行維權的工具 html

顯然區塊鏈對於解決此問題有很大的幫助,
它的不可篡改等特性很適合存證維權的場景,
咱們能夠經過XuperChain來構建一個存取證據的智能合約 java

下面就來幫助攝影師朋友開發一個
可以存儲照片版權、還能在發現被盜用後進行維權的智能合約
`node

搭建xuper節點環境(多節點)

環境準備

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

`git和g++以前已經安裝好了,如今安裝下go環境(接下來的a、b、c介紹的是經過mac安裝go語言環境 若是非mac的小夥伴 能夠跳過了)
`c++

經過brew安裝gogit

`brew install go
`github

`這樣就安裝好了,這裏涉及到一個問題,
就是經過brew下載安裝包速度的問題,
以前的文章也介紹過,這裏再重複下,
以避免朋友們在下載安裝包這塊浪費太多時間,
方法就是更換Homebrew源
`golang

a、替換brew.gitredis

`cd "$(brew --repo)"
git remote set-url origin https://mirrors.aliyun.com/ho...
`docker

b、替換homebrew-core.gitjson

`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-一、 /bin/zsh替換homebrew-bottles**

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

c-二、/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
`

多節點運行

`依次在pn一、pn二、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羣】百度超級鏈官方交流羣中的前輩的技術支持

@超哥 和 老大哥 @國電通-¿¿¿¿¿ `

相關文章
相關標籤/搜索