本系列內容參考圖
尊重原創,轉載請註明出處https://blog.csdn.net/cc007cc009/article/details/102902294
尊重原創,轉載請註明出處 - https://blog.csdn.net/cc007cc009/article/details/102902294
文章目錄
標題 | 版本號 | 作者 | 技術棧版本號 | IDE | 官網 | |
---|---|---|---|---|---|---|
問道區塊鏈_區塊鏈學習_v0.0.2_持續更新。。。 | v0.0.3 | 若布與宮合 | 8416837 | protobuf3.10.1 golang1.13.4 |
LiteIDE | protobuf golang |
前言
- 簡明的基礎技術落地筆記;
- 有興趣的同學請一起討論;
- 難免紕漏,請斧正。
概念
Hash
- Hash,一般翻譯做“散列”,也有直接音譯爲“哈希”的,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。
- 哈希表是根據設定的哈希函數H(key)和處理衝突方法將一組關鍵字映射到一個有限的地址區間上,並以關鍵字在地址區間中的象作爲記錄在表中的存儲位置,這種表稱爲哈希表或散列,所得存儲位置稱爲哈希地址或散列地址。作爲線性數據結構與表格和隊列等相比,哈希表無疑是查找速度比較快的一種。
- 用途。身份驗證和數字簽名,——也稱爲“消息摘要”。
SHA-256
將任意數據編碼爲256位的二進制串。hash碰撞的概率極低。
Java代碼
public class Sha256 {
public static void main(String[] args) {
String data = "他是一個勇士。";
getSHA256( data);
getSHA256( data);
data += " ";
getSHA256( data);
}
/**
* 利用java原生的類實現SHA256加密
*
* @param data 加密後的報文
* @return
*/
public static String getSHA256(String data) {
MessageDigest messageDigest;
String encodestr = "";
try {
messageDigest = MessageDigest.getInstance("SHA-256"); // 彙編
messageDigest.update( data.getBytes("UTF-8"));
encodestr = byte2Hex(messageDigest.digest());// 字節轉16進制
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println(String.format("%s%s%d",encodestr," 長度 === ", encodestr.length()));
return encodestr;
}
/**
* 將byte轉爲16進制
*
* @param bytes
* @return
*/
private static String byte2Hex(byte[] bytes) {
StringBuffer stringBuffer = new StringBuffer();
String temp;
for (int i = 0; i < bytes.length; i++) {
temp = Integer.toHexString(bytes[i] & 0xFF);
if (temp.length() == 1) {
stringBuffer.append("0"); // 補0
}
stringBuffer.append(temp);
}
return stringBuffer.toString();
}
}
Output
c75c7b4b24d94e4f2686022d917654d21ade275bfbfab8976a7f8540e02af462 長度 === 64
c75c7b4b24d94e4f2686022d917654d21ade275bfbfab8976a7f8540e02af462 長度 === 64
a969eac9922e2b88f48ec1f8212c8a4a747292dca1ff785812005c55d7e7c237 長度 === 64
無中心化
- 無管理員。數據庫有管理員,而區塊鏈沒有。
Block
- 記錄。每寫入記錄,就是建立一個區塊(Block)。
創世區塊
第一個塊。
塊相關
- 出塊時間:區塊產生的時間間隔。
節點
可看成是服務器。客戶端爲什麼是服務器?舉個栗子,互聯網誕生之初,個人電腦經常充當服務器的角色。
DAG:Directed Acyclic Graph
有向無環圖.有人提出用DAG的拓撲結構來存儲區塊,解決區塊鏈的效率問題.
p2p廣播
- 節點向其它節點廣播。節點通信基於加密的P2P網絡,本質上和cs通信原理相同;局域網穿透技術採用NAT方案.
- 對等網絡,即對等計算機網絡,是一種在對等者(Peer)之間分配任務和工作負載的分佈式應用架構,是對等計算模型在應用層形成的一種組網或網絡形式。因此,從字面上,P2P可以理解爲對等計算或對等網絡。
在P2P網絡環境中,彼此連接的多臺計算機之間都處於對等的地位,各臺計算機有相同的功能,無主從之分,一臺計算機既可作爲服務器,設定共享資源供網絡中其他計算機所使用,又可以作爲工作站,整個網絡一般來說不依賴專用的集中服務器,也沒有專用的工作站。網絡中的每一臺計算機既能充當網絡服務的請求者,又對其它計算機的請求做出響應,提供資源、服務和內容。通常這些資源和服務包括:信息的共享和交換、計算資源(如CPU計算能力共享)、存儲共享(如緩存和磁盤空間的使用)、網絡共享、打印機共享等。P2P網絡具有分散性、可擴展性、健壯性等特點,這使得P2P技術在信息共享、實時通信、協同工作、分佈式計算、網絡存儲等領域都有廣闊的應用。
- 節點發現主流協議有Gossip以及KAD。
- NAT技術是一種把內部網絡(簡稱爲內網)私有IP地址轉換爲外部網絡(簡稱爲外網)公共IP地址的技術,它使得一定範圍內的多臺主機只利用一個公共IP地址連接到外網,可以在很大程度上緩解了公網IP地址緊缺的問題.
超級鏈
百度超級鏈、Ethereum、EOS、Fabric.
Hyperledger
Linux基金會2015年成立了超級賬本項目(Hyperledger)來推動跨行業區塊鏈技術。並非聲明一個單一的區塊鏈標準,它鼓勵通過社區來合作開發區塊鏈技術,鼓勵開源知識產權,採用隨時間演進的關鍵標準。
Fabric
Hyperledger Fabric是Hyperledger區塊鏈項目中的一員。像其他區塊鏈技術一樣,它有一個賬本,使用智能合約,是一個由參與者共同管理他們的交易的系統。
共識
需要一種機制來認可運行在區塊鏈上的行爲(包括比特幣的運營,亦或是運行在區塊鏈上的其他業務),這種機制就是共識機制。
智能合約
英文即Smart Contracts
.並不是人工智能(artificial intelligence
)那個智能。薩博於1994年提出此概念。
- “
一個智能合約是一套以數字形式定義的承諾(commitment),包括合約參與方可以在上面執行這些承諾的協議。
”
Thomas Bocek. Digital Marketplaces Unleashed. Springer-Verlag GmbH. 2017-09-15: 169-184. ISBN 978-3-662-49274-1.
部署合約
由合約賬號部署合約。
私鑰
丟失將無法找回。
以太坊
運用數字貨幣和編程語言的結合解決問題。
EOS
Enterprise Operation System。“EOS是一個區塊鏈開發平臺,具有可擴展性強、支持大規模商業應用等特點。首先,EOS 採取DPoS共識算法及其他技術手段預期實現每秒百萬級別交易請求,將能夠支持數千個商業級的DAPPs。以太坊是一條公鏈,在以太坊鏈上運行的每一個應用都會消耗整條鏈的資源,但EOS 只是區塊鏈基礎架構,開發者可以自由地在 EOS 上創建公鏈,鏈與鏈之間不會影響彼此的資源使用,不會出現因個別應用資源消耗巨大而造成網絡大面積擁堵。 其次,在 EOS 上轉賬與運行智能合約並不需要消耗 EOS代幣,這將吸引更多的用戶。 最後,EOS出現系統錯誤時,其“憲法”可用於區分此錯誤是否確實爲BUG,判斷社區的修復舉措是否得當。”
提案
一種解決系統升級問題的機制。比如修改區塊大小,升級共識算法。提案整個過程涉及 到發起提案、參與投票、投票生效三個階段。
混盤技術
- 混盤技術也稱爲多盤技術,將多個磁盤從邏輯上當作一個磁盤來處理,主要用於解決只支持本地單盤場景下數據庫空間不夠的問題(即擴展性問題),比如被廣泛使用的LevelDB。目前對LevelDB的多盤擴展技術,大部分是採用了多個LevelDB實例的方式,也就是每個盤一個單獨的LevelDB實例。
- 多個LevelDB實例的方式好處是簡單,不需要修改LevelDB底層代碼,缺點是犧牲了多行原子寫入的功能。在區塊鏈的應用場景中,需要保證多個寫入操作是原子性的特性。超級鏈改造LevelDB存儲引擎本身,在引擎內部完成了數據文件的多盤放置,能夠確保所有寫入更新操作的原子性,從而能夠滿足區塊鏈場景的交易原子性要求。
百度超級鏈中的平行鏈
- 百度超級鏈通過系統合約方式創建平行鏈,平行鏈之間相互獨立,擁有各自的賬本和共識算法等模塊,目前平行鏈之間共享p2p網絡。不同的業務可以跑在不同的平行鏈上,起到了業務隔離效果,在使用平行鏈時,需要通過–name指定需要操作的平行鏈的名字。
utxo
UTXO(unspenttransaction outputs)是未花費交易輸出。交易輸出了,但是沒花費出去,比如找零。
玩轉開源組件 - 站在巨人的肩膀
XuperUnion
安裝包部署
- 環境 Ubuntu 18.04.2 || CentOS7
安裝Golang
- 命令
# 卸載舊的
sudo apt-get remove golang-go
sudo apt-get remove --auto-remove golang-go
# 下載
mkdir -p 下載目錄;cd 下載目錄
wget https://studygolang.com/dl/golang/go1.12.5.linux-amd64.tar.gz
sudo tar -zxvf go1.12.5.linux-amd64.tar.gz -C /usr/local
# 配置
sudo vim ~/.bashrc # centos vim /etc/profile
# 內容
export GOROOT=/usr/local/go # 安裝目錄
export GOPATH=$HOME/go # 工作環境 centos環境將$HOME改爲/usr/local
export GOBIN=$GOPATH/bin # 可執行文件存放
export PATH=$GOPATH:$GOBIN:$GOROOT/bin:$PATH # 添加PATH路徑
source ~/.bashrc
g++
sudo apt-get install g++ # Ubuntu 18 已預置
g++ --version # 查看g++是否安裝,如果安裝了則output:g++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
git
apt-get install git
程序
cd 預安裝目錄 # 存放源碼的目錄,在這裏對源碼make
git clone https://github.com/xuperchain/xuperunion
git clone https://gitee.com/baidu/XuperUnion # 更快
# 解壓後
cd 根目錄
make # 執行make後,等待 ...
cd output/ # 發現xchain、xchain-cli目錄
- 目錄意義
目錄名 | 功能 | 備註 |
---|---|---|
node/ | 根節點目錄 | |
-----/conf | xchain.yaml:xchain服務的配置信息,plugins.conf: 插件的配置信息 防止衝突,部署時根據需要修改端口號 | |
-----/data | 數據的存放目錄,創世塊信息,以及共識和合約的樣例 | |
-----/-----/blockchain | 賬本目錄 | |
-----/-----/keys | 此節點的地址,唯一性 | |
-----/-----/netkeys | 此節點的網絡標識ID,唯一性 | |
-----/-----/config | 創始的共識採用tdpos模式,指定單一地址有權利出塊 | |
-----/logs | 程序日誌目錄 | |
-----/plugins | so的存放目錄 | |
-----/xchain | 服務的二進制文件 | |
-----/xchain-cli | 客戶端工具 | |
-----/wasm2c | wasm工具 |
# cd到上文的output目錄,執行下述命令
mkdir -p /home/app/blockChain/x;cp -r * /home/app/blockChain/x;cd /home/app/blockChain/x # 遞歸拷貝output裏的全部文件至x目錄
至此,XuperUnion程序準備完畢。
Docker部署 - 待續
鏈的初始化
創世
創建第一個區塊
# 創建xuper鏈
./xchain-cli createChain # 客戶端創建創世區塊。若是共識搭建,請先配置再創建。
dump_chain # 丟棄命令
output log見下文,較長。
t=2019-11-17T11:29:18+0800 lvl=dbug msg="create block chain by contract" module=xchain from=xuper toCreate=xuper
t=2019-11-17T11:29:18+0800 lvl=info msg="ledger meta" module=xchain genesis_block= tip_block= trunk_height=0
t=2019-11-17T11:29:18+0800 lvl=trce msg="Start to ConfirmBlock" module=xchain
t=2019-11-17T11:29:18+0800 lvl=info msg="begin format genesis block" module=xchain
t=2019-11-17T11:29:18+0800 lvl=info msg="start to confirm block" module=xchain blockid=0d7d3ba836179b81f6e3887f3710f41e5807586678e26d36478f677feea7bd36 txCount=1
t=2019-11-17T11:29:18+0800 lvl=dbug msg="print block size when confirm block" module=xchain blockSize=1415 blockid=0d7d3ba836179b81f6e3887f3710f41e5807586678e26d36478f677feea7bd36
t=2019-11-17T11:29:18+0800 lvl=dbug msg="confirm block cost" module=xchain blkTimer="saveHeader: 0.15 ms,saveAllTxs: 0.61 ms,saveToDisk: 0.08 ms,total: 1.06ms"
t=2019-11-17T11:29:18+0800 lvl=info msg="ConfirmBlock Success" module=xchain Height=1
t=2019-11-17T11:29:18+0800 lvl=info msg="utxo total is estimated" module=xchain total=0
t=2019-11-17T11:29:18+0800 lvl=dbug msg="debug tx" module=xchain txid=92adc3e88be5cc5aec29baa17d11b78b9814b7279a1125f347ac83ad04b2bb17
t=2019-11-17T11:29:18+0800 lvl=dbug msg=txoutput module=xchain offset=0 addr=dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN amount=100000000000000000000
t=2019-11-17T11:29:18+0800 lvl=dbug msg="hit queryblock cache" module=xchain blkid=0d7d3ba836179b81f6e3887f3710f41e5807586678e26d36478f677feea7bd36
t=2019-11-17T11:29:18+0800 lvl=info msg="unconfirm table size" module=xchain unconfirmTxMap=0
t=2019-11-17T11:29:18+0800 lvl=dbug msg="autogen tx list size, before play block" module=xchain len=0
t=2019-11-17T11:29:18+0800 lvl=trce msg=" start to dotx" module=xchain txid=92adc3e88be5cc5aec29baa17d11b78b9814b7279a1125f347ac83ad04b2bb17
t=2019-11-17T11:29:18+0800 lvl=trce msg=" insert utxo key" module=xchain utxoKey=UdpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN_92adc3e88be5cc5aec29baa17d11b78b9814b7279a1125f347ac83ad04b2bb17_0 amount=100000000000000000000
t=2019-11-17T11:29:18+0800 lvl=dbug msg="autogen tx list size, after play block" module=xchain len=0
cd /home/app/blockChain/x/data/blockchain/xuper # 這裏存儲了創世區塊信息。
cd data/blockchain/ # 查看鏈名,bcname,即xuper,使用./xchain-cli status查詢bcname
節點
- 創建節點.節點,區別於區塊,它是一個客戶端,礦工節點。
# 啓動服務節點
nohup ./xchain &
ps aux|grep 'xchain' # 查看xchain進程
在根目錄查看日誌tail -f nohup.out -n 500
# check服務運行狀況
./xchain-cli status -H 127.0.0.1:37101
head /home/app/blockChain/x/data/keys/address && echo # 當前節點的地址
- 某些時候,
--host 127.0.0.1:37101 或 -H 127.0.0.1:37101
可以省略。
賬戶
# 創建普通用戶, 包含地址,公鑰,私鑰
./xchain-cli account newkeys --output data/bob # 注意這裏是cli,同創世區塊的創建
# 在bob目錄下會看到文件address,publickey,privatekey生成
head data/bob/* && echo # 展示公私鑰對
output log
create account using crypto type default
create account in data/bob
- 餘額
./xchain-cli account balance --keys data/keys -H 127.0.0.1:37101 # 餘額爲100000000000051000000
覆蓋原節點賬戶
如果data/keys裏面已經有賬戶,但是想更新它,那麼執行:
./xchain-cli account newkeys --output data/keys -f # -f 強制覆蓋
cat data/keys/address && echo # /home/app/moreChain/x003 YjuXEdGX3Y82JWN38WW3uMybUvSHhExgd
跨節點操作
- 轉賬
./xchain-cli transfer --to YjuXEdGX3Y82JWN38WW3uMybUvSHhExgd --amount 123 --keys data/keys/ -H 127.0.0.1:37101 # txid: 68e8ad93de23a0b38d9c6984e9349b54b81a686461149cfa370156d236bb89be # 需要等待幾分鐘纔到賬,測試環境,可能是要等塊更新
交易地址
與用戶數據掛鉤的最小單元。地址可以是合約賬號,也可以是由公鑰生成的一個長度爲33的字符串。
交易
- 轉賬
# 查詢地址,目標
cat data/bob/address && echo # fszZouvYxmyhdhV4AB3q4TfpzZd6ge1YP
# 轉賬命令
# --keys 從此地址 轉給 --to地址 --amount 錢
./xchain-cli transfer --to fszZouvYxmyhdhV4AB3q4TfpzZd6ge1YP --amount 36 --keys data/keys/ -H 127.0.0.1:37101 # 轉賬後,日誌輸出交易id 7677e8dad33137b4161d4027d4f339de9b9c0f1d77ef96553672a13ea574e2d1 1d2c0c528b49beba1dca31f1e2238973aadd636b83997bf4214ccc31361cc274
# 根據id查詢交易記錄
# 可查詢上一步生成的txid的交易信息
./xchain-cli tx query 1d2c0c528b49beba1dca31f1e2238973aadd636b83997bf4214ccc31361cc274 -H 127.0.0.1:37101
交易信息 - 36幣
"txOutputs": [
{
"amount": "36",
"toAddr": "fszZouvYxmyhdhV4AB3q4TfpzZd6ge1YP"
},
{
"amount": "999964",
"toAddr": "dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN"
}
],
其中包含一個塊id0c607121b1f182fb44b64442b1eaabd7048758e1bde030ffa4e264b7022fd3f9
。下文圖示一個塊id:
# 查詢區塊
# 可查詢上一步交易所在的block id信息
./xchain-cli block 56c8cf05c5347474847e31fd34a6f83c6a6d18083db202c31fc2906775b54b92 -H 127.0.0.1:37101
截圖中可見區塊高度已達到85;
./xchain-cli status -H 127.0.0.1:37101
- 多重簽名交易
- 確認該交易已經上鍊(標誌是blockid不爲空了)
多重簽名
多重簽名是指在數字簽名中,有時需要多個用戶對同一個交易進行簽名和認證,例如某些合約賬戶下的數據需要多個人【授權】才能修改或轉賬。
區塊鏈自身運行的參數升級
包括:block大小、交易大小、挖礦獎勵金額和衰減速度等。
P2P多節點部署
概念
- 選一個節點作爲“bootNode”,其他節點啓動前都配置這個“bootNode”的地址即可實現
- 獲取bootNode URL
./xchain-cli netURL get -H 127.0.0.1:37101 # output "/ip4/127.0.0.1/tcp/47101/p2p/QmVxeNubpg1ZQjQT8W5yZC9fD7ZB1ViArwvyGUB53sqf8e"
./xchain-cli netURL gen -H 127.0.0.1:37101 # 如果不是以默認配置啓動的,我們需要先生成它的netUrl,然後再獲取
具體部署
- TDPoS共識的環境部署注意事項
【注意】修改完每個節點的創世塊配置後,需要確認各節點的 data/blockchain 目錄下內容爲空。然後重新按照下述步驟,在各節點上【創建鏈】,啓動所有節點,即完成TDPoS共識的環境部署.
- 更新各節點配置
vim data/config/xuper.json
{
"version" : "1",
"predistribution":[
{
"address" : "mahtKhdV5SZP4FveEBzX7j6FgUGfBS9om",
"quota" : "100000000000000000000"
}
],
"maxblocksize" : "128",
"award" : "1000000",
"decimals" : "8",
"award_decay": {
"height_gap": 31536000,
"ratio": 1
},
"genesis_consensus": {
"name": "tdpos",
"config": {
# tdpos共識初始時間,聲明tdpos共識的起始時間戳,建議設置爲一個剛過去不久的時間戳
"timestamp": "1548123921000000000",
# 每一輪選舉出的礦工數,如果某一輪的投票不足以選出足夠的礦工數則默認複用前一輪的礦工
"proposer_num":"3",
# 每個礦工連續出塊的出塊間隔
"period":"3000",
# 每一輪內切換礦工時的時間間隔,需要爲period的整數倍
"alternate_interval":"6000",
# 切換輪時的出塊間隔,即下一輪第一個礦工出第一個塊距離上一輪礦工出最後一個塊的時間間隔,需要爲period的整數配
"term_interval":"9000",
# 每一輪內每個礦工輪值任期內連續出塊的個數
"block_num":"200",
# 爲被提名的候選人投票時,每一票單價,即一票等於多少Xuper
"vote_unit_price":"1",
# 指定第一輪初始礦工,礦工個數需要符合proposer_num指定的個數,所指定的初始礦工需要在網絡中存在,不然系統輪到該節點出塊時會沒有節點出塊
"init_proposer": {
"1":["RU7Qv3CrecW5waKc1ZWYnEuTdJNjHc43u","XpQXiBNo1eHRQpD9UbzBisTPXojpyzkxn","SDCBba3GVYU7s2VYQVrhMGLet6bobNzbM"]
}
}
}
}
- 共識查詢:
./xchain-cli tdpos -h
- 這些節點可以部署在同一主機,或者部署到獨立主機(ip)。
mkdir -p /home/app/blockChain/x003;cp -r * /home/app/blockChain/x003;cd /home/app/blockChain/x003 # 遞歸拷貝output裏的全部文件至x目錄
sudo vim conf/xchain.yaml # 配置根節點,根節點自己也要配置
p2pV2:
port: 47102
# port: 47101
bootNodes:
- "/ip4/127.0.0.1/tcp/47101/p2p/QmVxeNubpg1ZQjQT8W5yZC9fD7ZB1ViArwvyGUB53sqf8e"
./xchain-cli createChain # 與上文一樣,在新節點使用客戶端創建創世區塊.【注意】必須先配置bootNodes再創建新鏈(節點)才行。
cd /home/app/blockChain/x002/data/blockchain/xuper # 查看信息
# 如果已經create了3個節點,重啓bootNode。方式見下↓
kill pid
cd 節點根目錄
nohup ./xchain &
如果啓動報錯:error="error to connect to all bootstrap"
,請檢查bootNodes.不同主機的節點注意ip.
- 部署列表
路徑 | ip端口 | 是否bootNodes | |
---|---|---|---|
/home/app/newChain/x002 | 192.168.0.xxx:37001 | 否 | |
/home/app/blockChain/x002 | 192.168.0.xxx:37002 | 是 | |
/home/app/moreChain/x003 | 192.168.0.xxx:37003 | 否 |
查看分支高度,檢測全部節點是否關聯
./xchain-cli status -H 127.0.0.1:37101
./xchain-cli status -H 127.0.0.1:37102
./xchain-cli status -H 127.0.0.1:37103
# 啓動
cd /home/app/newChain/x002/;nohup ./xchain &
cd /home/app/blockChain/x002/;nohup ./xchain &
cd /home/app/moreChain/x003/;nohup ./xchain &
# 修改配置文件
vim /home/app/newChain/x002/data/config/xuper.json
vim /home/app/blockChain/x002/data/config/xuper.json
vim /home/app/moreChain/x003/data/config/xuper.json
{
"name": "xuper",
"ledger": {
"rootBlockid": "94248ef7a1c1e8b043d4621cc3cc1bf1eb15e74c9c4fdedded0cdee199cd84d2",
"tipBlockid": "0917a9e90a7916c4bfd9de36485940b9190c06f87313769e9bc2c8cea5d45bc1",
"trunkHeight": 733
},
智能合約
合約賬戶
- 自定義權限的鏈上標識符稱爲合約賬號,通常分配一個或多個密鑰或多個賬號。不同權重賬戶的多中心化資產管理模式,不同賬戶角色也可以通過共同簽名來更改權限。
- 部署合約以及需要多方共同管理資產時,需要使用合約賬戶;其他應用場景下,普通賬戶與合約賬戶沒有明顯區別。
- 爲了部署實名合約,我們需要首先創建一個合約賬號.隨機選擇個節點:
/home/app/newChain/x002
,這個節點的信息在上文有講。
./xchain-cli account new --account 1234560123456789 --fee 1000 # 192.168.4.132節點創建合約賬戶tx===1130b45b1d1b953ddb1098878a1f87d6cdc4e8cb4ada9231fdeee241e85a451e。目錄爲/opt/soft/xuperunion/output
上述命令output↓
contract response:
{
"pm": {
"rule": 1,
"acceptValue": 1.0
},
"aksWeight": {
"dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN": 1.0 // 此ak作爲文件data/acl/addrs的內容
}
}
The gas you cousume is: 1000
有可能有這一句 You need add fee
./xchain-cli account query -H 127.0.0.1:37101 # 查詢合約賬號,結果爲null,說明沒創建成功
在文檔找到解決方案:遇到The gas you cousume is: XXXX, You need add fee 通過加--fee XXXX 參數附加資源
,加上--fee 數值
後,創建賬號成功。
創建MrCheng,【複習】文章開頭的轉賬。
./xchain-cli account newkeys --output data/MrCheng
head data/MrCheng/* && echo # 查看MrCheng的公私鑰,上文也有講
cat data/MrCheng/address && echo # 查詢MrCheng的地址
./xchain-cli transfer --to k8BAsKrxKhZYLXrh45eb7j7FydzApYUDC --amount 201234 --keys data/keys/ -H 127.0.0.1:37101 # 轉賬到上文獲得的地址,獲得txid 56ccc04bc98db0a4c6c11a4d64117bce3c36f0d205a5b68bf631d06caaa445e5
給合約賬號轉賬↓
./xchain-cli transfer --to XC1234560123456789@xuper --amount 201234 # 執行轉賬後,output 交易id b63b62defc70e3f98c538f77360a5d3cdeaeaaca544fafbe04106797f634646f。192.168.4.132交易id===b29e4013948c5f24702e9c36c02548c4ae2162be8cf9cf0c38e18ff278bc0d59
–from指定轉賬來源賬號,默認地址是data/keys/address。原始交易多重簽名multisig send時,將該來源地址的簽名寫在Initiator(發起人)的位置。
- 另一種NewAccount方式:調用系統合約的方式,創建合約賬號其實屬於調用系統合約。描述文件如下↓
{
"module_name": "xkernel",
"method_name": "NewAccount",
"args" : {
"account_name": "1234098776890654", // 說明:16位數字組成的字符串
"acl": "{
\"pm\": {\"rule\": 1,\"acceptValue\": 1},
\"aksWeight\": {\"dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN\": 1}
}" // 這裏的address改成自己的address
}
}
- 查詢存在的合約賬戶
./xchain-cli account query # 傳地址,默認 -H 127.0.0.1:37101
編譯合約
實名合約
- 服務器上的源碼地址
/home/app/newChain/source/XuperUnion
。記錄地址,便於回顧。
cd /home/app/newChain/source/XuperUnion # 進入源碼根目錄
cd contractsdk/cpp/ # 進入編譯目錄
cp reserved/identity.cc example
./build.sh # 執行後可能會報Unable to find image 'hub.baidubce.com/xchain/emcc:latest' locally,請等待自動下載。【注意】腳本依賴從hub.baidubce.com拉取的docker鏡像,請在編譯前確認docker相關環境是可用的。
cd build # 發現identity.wasm
注意事項:
問:編譯cpp合約出現 “Post http:///var/run/docker.sock/v1.19/containers/create: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?” 是什麼原因?
答:這可能是因爲用戶安裝docker後,沒有創建docker用戶組,或者當前運行的系統賬號不在docker用戶組中,可以嘗試下面的命令:
sudo groupadd docker
sudo usermod -aG docker ${USER} // 此處${USER}爲你編譯合約時使用的linux賬號
service docker resteart
部署合約
- 部署xunion源碼裏的合約
- 官方腳本
#!/bin/bash
set -e
# check input parameter
if [ $# -lt 4 ]; then
echo "usage: sh -x deployContract.sh accountName contractName contractNamePath args fee"
exit
fi
accountName=$1
contractName=$2
contractNamePath=$3
args=$4
fee=$5
address=`cat ./data/keys/address`
# get testnet conf including ip:port and complianceCheck public key
source "./testnet.conf"
acl="./data/acl"
if [ ! -d "$acl" ]; then
mkdir $acl
fi
addrs="./data/acl/addrs"
if [ ! -f "$addrs" ]; then
touch $addrs
fi
echo $public_key > data/acl/addrs
echo "$accountName/$address" >> data/acl/addrs
./xchain-cli wasm deploy --account $accountName --cname $contractName -H $ip_port -m $contractNamePath --arg $args --output contractRawTx.out --fee $fee
./xchain-cli multisig get --tx ./contractRawTx.out --host $ip_port --output complianceCheck.out
./xchain-cli multisig sign --tx ./contractRawTx.out --output my.sign
./xchain-cli multisig send my.sign complianceCheck.out,my.sign --tx ./contractRawTx.out -H $ip_port
cp identity.wasm /home/app/newChain/x002/ # 拷貝上文編譯好的合約到節點根目錄
./xchain-cli wasm deploy --account XC1234560123456789@xuper --cname identity003 -H 127.0.0.1:37101 wasm/identity.wasm -a '{"creator":"MrChengMath"}' # cname:合約名稱,字母開頭;identity.wasm:合約代碼;-a:參數,由合約確定,可以查看服務端源碼確定功能,比如,將客戶端參數存入數據庫,即PutObject;
運行,來了
contract response: initialize identity contract success
The gas you cousume is: 148794
You need add fee
意思是請支付燃料(代幣),在命令末尾加上--fee 148794
部署合約成功,響應:d225ee6ec6e58bea9e0f1206f3d3af757a29bd274c60202ebf32712f98b525f5(交易id)
./xchain-cli tx query d225ee6ec6e58bea9e0f1206f3d3af757a29bd274c60202ebf32712f98b525f5 # 查看部署結果:查詢本次部署
調用合約
data/keys賬戶也可以調用合約。
也就是調用合約的函數
調用合約的Json模板,【內容與本例無關】
{
"module_name": "wasm",
"contract_name": "counter",
"method_name": "increase", // 函數名稱
"args":{
"key":"counter"
}
}
- 先查詢合約賬戶的acl,然後修改
./xchain-cli acl query --account XC1234560123456789@xuper
output:
{
"pm": {
"rule": 1,
"acceptValue": 1
},
"aksWeight": {
"dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN": 1
}
}
- 新增
identity_add.json
{
"module_name": "wasm",
"contract_name": "identity002",
"method_name": "register_aks",
"args":{
"aks":"ak1,ak2"
}
}
mkdir -p data/acl
vim addrs # 填入內容:XC1234560123456789@xuper/dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN 生成地址文件.dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN 對應合約賬號裏的ak.將需要收集簽名的address寫入該文件中.如果需要黃反服務背書,須在data/acl/addrs文件中寫入黃反服務address.
# 1: 生成原始交易
./xchain-cli multisig gen --desc json/identity_add.json --host 127.0.0.1:37101 --output out/tx_add.out
報錯:
contract response: register aks to identify contract success
The gas you cousume is: 83
The fee you pay is: 83
WriteFile error
解決辦法:
創建目錄out.再次執行。
# 2: 本地簽名
mkdir sign # 如果沒有這個目錄會報錯
./xchain-cli multisig sign --output sign/tx_add_my.sign --tx out/tx_add.out
./xchain-cli multisig get --tx out/tx_add.out --host 14.215.179.74:37101 --output out/complianceCheck.out
# 3: 交易發送
./xchain-cli multisig send sign/tx_add_my.sign out/complianceCheck.out --host 127.0.0.1:37101 --tx out/tx_add.out # send隨後的兩個參數分別爲發起者的簽名和acl的簽名(acl中有多個AK時,用逗號連接多個簽名文件)。執行成功後,返回響應TX id:59b4d44a25a304aa15069217be4b7ff85a5381f2719052d4e8864ff1a2bc1a69
./xchain-cli tx query 59b4d44a25a304aa15069217be4b7ff85a5381f2719052d4e8864ff1a2bc1a69
響應日誌↓
原始交易
contract response: register aks to identify contract success
The gas you cousume is: 83
The fee you pay is: 1000
{
"txid": "",
"blockid": "",
簽名
{
"PublicKey": "{\"Curvname\":\"P-256\",\"X\":74695617477160058757747208220371236837474210247114418775262229497812962582435,\"Y\":51348715319124770392993866417088542497927816017012182211244120852620959209571}",
"Sign": "MEQCIFYFeh2SfDfETkXeuGfMTbSLt1JeiY7v8k5VaMoGMAvOAiAgFBEWN+mMi76Pprn72JQXKPSCzKarP3u69WxEz5nGZw=="
}
- 刪除
上文的合約是註冊ak,那麼現在刪除ak,即不註冊它們了。
identity_del.json
{
"module_name": "wasm",
"contract_name": "identity002",
"method_name": "unregister_aks",
"args":{
"aks":"ak1,ak2"
}
}
# 1: 生成原始交易
vim identity_del.json # 填入上文json內容
./xchain-cli multisig gen --desc json/identity_del.json --host 127.0.0.1:37101 --output out/tx_del.out
# 2: 本地簽名
./xchain-cli multisig sign --output sign/tx_del_my.sign --tx out/tx_del.out
# 3: 交易發送
./xchain-cli multisig send sign/tx_del_my.sign out/complianceCheck.out --host 127.0.0.1:37101 --tx out/tx_del.out # send隨後的兩個參數分別爲發起者的簽名和acl的簽名(acl中有多個AK時,用逗號連接多個簽名文件)。響應交易id:db3763d95cc6ec40ad237455ed9ed081dd30b45927fd3652131914b3e22952ad
# 檢驗是否成功執行,即是否刪除了ak
./xchain-cli tx query db3763d95cc6ec40ad237455ed9ed081dd30b45927fd3652131914b3e22952ad #
Response:
查詢部署過的合約
./xchain-cli account contracts --account XC1234560123456789@xuper # 根據合約賬號檢索
響應↓
[
{
"contract_name": "identity001",
"txid": "d225ee6ec6e58bea9e0f1206f3d3af757a29bd274c60202ebf32712f98b525f5",
"desc": "TWF5YmUgY29tbW9uIHRyYW5zZmVyIHRyYW5zYWN0aW9u"
}
]
查詢賬號的ACL
./xchain-cli acl query --account XC1234560123456789@xuper # account參數爲合約賬號名稱
上述命令響應↓
{
"pm": {
"rule": 1,
"acceptValue": 1 // 須達到的閾值
},
"aksWeight": {
"dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN": 1
}
}
查詢餘額
./xchain-cli account balance XC1234560123456789@xuper -H 127.0.0.1:37101 # output 258118
自己寫合約
GRPC基礎 Protobuf
撰寫合約-寫代碼 請見智能合約教程
測試環境
測試命令
- 連接互聯網測試機
- 查詢節點餘額
./xchain-cli account balance dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN -H 14.215.179.74:37101不推薦,建議自己搭建測試環境
操作指導
升級XuperUnion
版本升級時,需要更新爲新版本的代碼,並重新編譯,然後將 plugins文件夾, 二進制文件xchain,xchain-cli 全部替換後全部重新啓動即可,注意多節點模式下需要先啓動bootNodes節點。
問答
客戶端發送交易後,怎麼查詢是否成功上鍊。通過querytx判斷tx狀態還是有其他事件機制?支持事件通知麼?
首先查詢交易所在區塊,然後查詢區塊是否在區塊鏈主幹上,如果交易所在區塊在區塊鏈主幹上,表明此交易已經生效。事件通知暫不支持,後續有計劃支持部分類型事務執行結果的事件通知。
密碼學中橢圓曲線選擇使用P-256的考慮?
首先,P-256曲線目前依然在密碼學界被廣泛使用。其次,這次開源的是我們的基礎版本,而在xchain的代碼架構下,密碼學相關的模塊是插件化使用的,密碼學crypto模塊是可以獨立研發並集成進開源框架中的。同時,在ECDSA之外,也已開源了多重簽名、EDDSA、環簽名等多種簽名算法。在尚未開源的版本中,通過可變簽名算法,我們已經支持國密/NIST的多條橢圓曲線。最後,這些算法和曲線被支持混合使用,開發者可以自由選擇他們認爲安全的曲線和算法來保護自己的數字資產。所以,敬請期待百度xchain後續的密碼學相關開源進展。