關于百度鏈往期文章匯總
在百度超級鏈Xuper上部署智能合約并實現(xiàn)存證功能
在Xuper鏈上部署Java語言智能合約和分析存證合約的實現(xiàn)邏輯
以單節(jié)點環(huán)境運行
以單一變量的方式來研究一個不了解的事物 才是合理的方式
不然多種變量雜糅在一起 只會越來越亂了
單節(jié)點即單個出塊地址,不需要考慮多個出塊節(jié)點輪流出塊的情況
環(huán)境準備
cd?pn1
rm?-rf?data/blockchain/xuper/修改節(jié)點配置
./xchain-cli?createChain
nohup?./xchain?--vm?ixvm?&確認下幾個初始金額
-
節(jié)點地址 dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN
-
初始金額 100000000000000000000
-
每出一個塊獎勵 1000000
-
金額精度是8 即總金額為 1000000000000 個
-
proposer_num為1表示一個出塊節(jié)點
-
period為3000表示每三秒出一次塊
-
alternate_interval為3000 表示出塊節(jié)點切換耗時3秒 因為當前就一個節(jié)點 所以不需要切換
-
term_interval為6000 表示節(jié)點1最后一個出塊結(jié)束開始到節(jié)點2第一個節(jié)點開始之間間隔6秒 即 節(jié)點切換時間3秒+3秒出一個塊 一共6秒 因為就一個節(jié)點所以這個時間也不需要
-
block_num為20 表示一個節(jié)點出20個塊 再輪到另外一個節(jié)點出20個塊
-
vote_unit_price表示每頭一次票 所代表的權重即代表多少token值
查看節(jié)點賬戶地址
cat?data/keys/address
dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN查看當前區(qū)塊高度的腳本
#!/bin/bash
for((i=1;i<=1;i++));
do
????????echo?-n?"node$i:";
????????./xchain-cli?status?-H?127.0.0.1:3710$i?|?grep?trunkHeight;
done
echo?-n?'節(jié)點賬戶金額:'
./xchain-cli?account??balance?dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN查看初始地址金額
./xchain-cli?account??balance?dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN
結(jié)果和期望一致
3秒出一個塊 出了256個塊 100000000000000000000+256*1000000=100000000000256000000
創(chuàng)建一個合約賬戶(默認由節(jié)點賬戶創(chuàng)建)
./xchain-cli?account?new?--account?1111111111111111?--fee?1000手續(xù)費1000
咱們來看下這個手續(xù)費跑哪里去了
來源賬戶 dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN
金額是 1000000
這個金額大家可能會有疑問
總金額不是 > 100000000000256000000 這個值嗎
(為什么大于 因為在不斷的出塊嘛)
那為什么是 1000000
原因是 總金額 雖然 > 100000000000256000000
但它是又很多的 面值為1000000的utxo組成
所以這里支付 1000手續(xù)費 那么只需要一個 1000000 的 utxo即可
目的賬號有2個
一個是 1000手續(xù)費 去了 $ 賬戶
另一個是 999000 表示 1000000的utxo減去手續(xù)費1000 還剩這么多
大家有沒有疑惑 $ 地址 是啥玩意
其實這個表示未知地址
因為此時發(fā)起一個創(chuàng)建一個合約賬戶的交易,同步返回一個交易hash
此時這個交易還未被打包做為塊的一部分,還在交易池中即還未上鏈
打包的過程
1、先確定哪個出塊節(jié)點
2、從交易池中獲取3秒這個時間段內(nèi)的交易
3、將這些交易打包(如果沒有交易也會進行打包)
只有打包了之后 才會確定手續(xù)費會給到哪個出塊節(jié)點地址
下面咱確認下上面的表述
首先
從交易詳情里面獲取區(qū)塊id
通過區(qū)塊id查看區(qū)塊詳情
./xchain-cli?block?eb8a60f5c12666ea0b0fbc11088d6e8f2d3466311d920a7b320b1fe642255b39大家發(fā)現(xiàn)了沒 這個區(qū)塊中的交易列表中就一筆交易 就是剛才我們做的那筆
創(chuàng)建合約賬戶的交易
接著往下看這個區(qū)塊詳情 發(fā)現(xiàn)這里還有一個交易
看到了沒
"txInputs": null對應的txOutputs表示出塊獎勵
獎勵金額是 1000000 給到了節(jié)點賬戶 dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN
猜想:到此節(jié)點賬戶的金額包含2部分 一部分是 出塊的獎勵 另外一部分來源于手續(xù)費1000
咱們確認下上面的猜想
看到了沒
當前節(jié)點賬戶的金額只是出塊獎勵的金額 并沒有手續(xù)費的金額
上面的猜想錯了
那么手續(xù)費的金額去哪了呢?
其實手續(xù)費的來源賬戶是節(jié)點賬戶 目標賬戶也是節(jié)點賬戶 那不就抵消了嘛
再來一個測試來印證下剛才的結(jié)論:給合約賬戶轉(zhuǎn)賬
./xchain-cli?transfer?--to?XC1111111111111111@xuper?--amount?100000
e2979b6bff380c7e1864d645fa514e06c428bdce5e74f9bba779a36e9bf0e748轉(zhuǎn)賬沒有手續(xù)費也可以轉(zhuǎn)
來源賬戶是節(jié)點賬戶 目的賬戶是合約賬戶
轉(zhuǎn)賬帶有手續(xù)費
./xchain-cli?transfer?--to?XC1111111111111111@xuper?--amount?100000?--fee?100結(jié)論
當手續(xù)費來源賬戶和流向賬戶是同一個賬戶的時候 賬戶余額為
賬戶初始金額+出塊高度x出塊獎勵-轉(zhuǎn)賬金額
上面的公式并沒有將手續(xù)費計算在內(nèi)
咱們再來一個測試來印象下
剛才不是手續(xù)費來源賬戶和目的賬戶是同一個賬戶嘛
那咱們測試下讓手續(xù)費來源賬戶和目的賬戶是不一個賬戶的情況
- 先創(chuàng)建一個普通賬戶
./xchain-cli?account?newkeys?--output?data/bob
a1E2v3RHtLHhE7N4yRgcrsfsDdMsjQFm9
- 通過節(jié)點賬戶給這個普通賬戶轉(zhuǎn)點錢
- 通過這個普通賬戶創(chuàng)建合約地址
- 查看交易詳情
來源賬戶是這個普通賬戶a1E2v3RHtLHhE7N4yRgcrsfsDdMsjQFm9
初始金額是剛才轉(zhuǎn)給它的1000000000這么多錢
目的賬戶 1、手續(xù)費1000元給到了 $ 這個出塊節(jié)點地址
2、剩余的999999000錢又回到了來源地址中a1E2v3RHtLHhE7N4yRgcrsfsDdMsjQFm9
- 看下普通賬戶余額和節(jié)點賬戶余額(確認下手續(xù)費有沒有轉(zhuǎn)給節(jié)點賬戶)
./xchain-cli?account??balance?a1E2v3RHtLHhE7N4yRgcrsfsDdMsjQFm9
999999000余額是999999000說明手續(xù)費已經(jīng)扣掉了
通過區(qū)塊id查詢區(qū)塊詳情已確認出塊獎勵去了哪個節(jié)點賬戶 (當然這里咱只用的一個節(jié)點進行測試的)
查看節(jié)點賬戶余額
余額是這么個值 99999999999913801000
咱計算下這個值是否符合預期
初始金額是 100000000000000000000
創(chuàng)建了一個合約賬戶手續(xù)費1000(來源賬戶和目的賬戶是一個地址 不計算在內(nèi))
給合約地址轉(zhuǎn)賬100000
又轉(zhuǎn)賬了一筆 100000 ?手續(xù)費100(來源賬戶和目的賬戶是一個地址 不計算在內(nèi))
創(chuàng)建了一個普通賬戶
給普通賬戶轉(zhuǎn)賬了 1000000000
普通賬戶創(chuàng)建了一個合約賬戶 手續(xù)費1000給到了節(jié)點賬戶
100000000000000000000-100000-100000+1000-1000000000=99999999998999801000
這個值是不包含出塊獎勵在內(nèi)的值
當前的出塊高度1101
99999999998999801000+1101000000=100000000000100801000
金額正好可以匹配上
通過合約賬戶部署合約
期望:手續(xù)費來源于合約賬戶,手續(xù)費給到節(jié)點賬戶(出塊節(jié)點)
先給合約賬戶XC1111111111111111@xuper轉(zhuǎn)賬 1000000000
./xchain-cli?wasm?deploy?--account?XC1111111111111111@xuper?--cname?hello_last_17??--fee?5574291?--runtime?go?/Users/mengfanxiao/Documents/project/company/XinPools_INFO/document/business/baidu/20200714-最新版本/xuperchain/core/contractsdk/go/example/eleccert_final/eleccert_final.wasm?-a?'{"creator":"mengfanxiao"}'
contract?response:?
The?gas?you?cousume?is:?5206429
The?fee?you?pay?is:?5574291
Tx?id:?f7392917ed5691ed40b3756b0b562e5dc54994052cafd7894fc21e17524b4231來源賬戶是合約賬戶 XC1111111111111111@xuper
初始金額是 1000000000
最終金額 994425709
手續(xù)費是 5574291 轉(zhuǎn)給了出塊節(jié)點賬戶
查詢節(jié)點賬戶余額為99999999999322375291
分析下這個金額是否正確
1、剛才計算的金額是 100000000000100801000
2、給合約賬戶XC1111111111111111@xuper轉(zhuǎn)了1000000000
3、收到手續(xù)費 5574291
100000000000100801000-1000000000+5574291=99999999999106375291
100000000000100801000這個所對應的區(qū)塊高度是 1101
目前高度是 1356
目前賬戶金額 99999999999361375291
99999999999106375291+(1356-1101)x1000000=99999999999361375291
金額完美匹配哦
通過調(diào)用合約交易
期望:賬戶來源是節(jié)點賬戶,手續(xù)費專項節(jié)點賬戶,即目前的余額的增加只包含出塊獎勵 沒有手續(xù)費 ,因為手續(xù)費抵消了嘛
目前最新高度1485
最新余額 99999999999490375291
剛才計算的金額 99999999999361375291 對應的高度1356
99999999999361375291+(1485-1356)x1000000=99999999999490375291
正好對應
感謝
感謝百度鏈超哥的技術支持??