這篇文章說下使用百度鏈可能遇到的問題及解決辦法html
cat data/config/xuper.json
java
我隨便寫了一個值 239位node
而後查詢下餘額能夠查到算法
因此就認爲沒有最大值吧 設置爲多少就是多少嘍json
若要知道精確的 須要看下源碼數組
./xchain-cli transfer --to XC1111111111111111@xuper --amount 2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
安全
有點震驚吶 這麼大均可以轉帳 哈哈網絡
這個帳戶我也沒有建立 我直接往裏面轉帳 也是能夠的?併發
在轉帳的時候同時建立好了這個帳戶,但不是合約帳戶哦ide
普通帳戶和合約帳戶能夠是同一個帳戶名稱
咱們再來測試下哈
一、先給一個不存在的帳戶轉帳
此時會建立這個普通帳戶
二、在建立一個同名的合約帳戶
印證了上述的猜想
我測試的時候是用的36288長的字符串 是能夠的
若是是 36288*2 長度 java代碼已經不支持了 超過了java 字符串常量的長度
這裏科普下java的基本知識
`a、字符串變量:
String內部是以char數組的形式存儲,數組的長度是int類型,那麼String容許的最大長度就是Integer.MAX_VALUE = 2^zhi31 - 1 = 2147483647。又因爲java中的字符是以16位存儲的,所以大概須要4GB的內存才能存儲最大長度的字符串。
b、字符串常量:
如「abc」、」1234」之類寫在代碼中的字符串str,那麼容許的最大長度取決於字符串在常量池中的存儲大小,也就是字符串在class格式文件中的存儲格式:
CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}
u2是無符號的16位整數,所以理論上容許的string str的最大長度是2^16-1=65535。然而實際測試代表,容許的最大長度僅爲65534,超過就編譯錯誤。`
既然調用合約是經過java sdk調用 因此字符串最大不能超過java所支持的範圍
測試環境
2個出塊節點 1個同步節點
分別命名爲 節點1 節點2 節點3
使用節點1帳戶地址訪問節點2
經過java sdk 鏈接節點1 建立合約帳戶 XC1111111111116666@xuper
create account de1dc9e04a2d8b9bbf734f60431ab7eac5843f8711c3fe430c5df345dac272b8
使用節點1的帳戶訪問節點2
transfer 3d6023d4a1ba08506fdd1e0ee0cc234f6d93f639a708e32ebe8d1d51d8272349
節點1餘額查詢 1000000000
節點2餘額查詢 1000000000
節點3餘額查詢 1000000000
小結:在一個節點建立合約帳戶併發起轉帳交易 會同步給其餘的節點
使用節點1的帳戶訪問節點3
./xchain-cli wasm deploy --account XC1111111111116666@xuper --cname hello_last_1 --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"}'
在節點1調用合約
`invoke txid: 60b4ee039415ed2e8880212cf182361143f314f988034a669aee5be2a9c6b02a
response:
gas: 100608`
在節點2調用合約
和節點1區別在於 key爲 mac1(這個合約的key是惟一的)
`invoke txid: 127ad9ea3c0071dad560fb189b6be054e9fde06dc07d2202171aed5a32f49d3b
response:
gas: 100609`
在節點3調用合約
和節點1區別在於 key爲 mac2
`invoke txid: 56cd4547e266423630b6db038692bb04f0730ea207b776f55654d7d0db705717
response:
gas: 100609`
小結:在一個節點部署合約 會同步給其餘的全部節點
好比查詢 60b4ee039415ed2e8880212cf182361143f314f988034a669aee5be2a9c6b02a
./xchain-cli tx query 60b4ee039415ed2e8880212cf182361143f314f988034a669aee5be2a9c6b02a
在節點一、節點二、節點3查詢的交易詳情內容一致
小結:在一個節點作的交易會同步給全部的節點
目前我是用的master分支 但不是最新的
當前的區塊高度是605
那我想要升級到最新的master代碼
一、現將全部節點停掉
二、建立新的文件夾用來存放最新的版本
三、下拉最新的代碼並進行編譯
四、替換可執行文件
`cp -r output/* lastv-20200729/pn1
cp -r output/* lastv-20200729/pn2
cp -r output/* lastv-20200729/pn3`
五、將上一版本下的data和conf目錄替換到最新的
`cp -R pn1/data/ lastv-20200729/pn1/data
cp -R pn1/conf/ lastv-20200729/pn1/conf
cp -R pn2/data lastv-20200729/pn2/data
cp -R pn2/conf lastv-20200729/pn2/conf
cp -R pn3/data/ lastv-20200729/pn3/data
cp -R pn3/conf/ lastv-20200729/pn3/conf`
六、重啓
nohup ./xchain --vm ixvm &
節點1能夠啓動,但節點2啓動失敗 說明這種升級的方式不對
查看升級文檔 https://xuperchain.readthedoc..._guides.html#id2
我上面的思路是建立新的文件夾 將老版本數據複製到新文件夾中
官方文檔的思路是 將新的「plugins文件夾, 二進制文件xchain,xchain-cli」這些文件將老版本的替換掉 而後重啓便可
`cp -R output/plugins/ pn1/plugins/
cp -R output/xchain pn1/xchain
cp -R output/xchain-cli pn1/xchain-cli
cp -R output/plugins/ pn2/plugins/
cp -R output/xchain pn2/xchain
cp -R output/xchain-cli pn2/xchain-cli
cp -R output/plugins/ pn3/plugins/
cp -R output/xchain pn3/xchain
cp -R output/xchain-cli pn3/xchain-cli`
升級完成 保留了老數據
a、如果新增一個同步節點 不須要修改 創世塊配置 不須要刪除老數據 只須要修改 yaml文件便可 而後啓動便可
https://xuperchain.readthedocs.io/zh/latest/advanced_usage/multi-nodes.html?highlight=%E5%A2%9E%E5%8A%A0%E8%8A%82%E7%82%B9#id1
b、如果新增一個出塊節點 這個不只僅須要修改yaml文件還須要修改創世塊配置 因此須要刪除老數據
此時系統在選擇出塊節點的算法中會判斷該節點是否已同步完成 若已同步完成纔會選擇該節點做爲當前節點
查詢的是當前同步到的狀態
若是發起一筆上鍊交易 交易在出塊前會在各個節點間轉發,該節點掛掉其它節點能夠繼續打包
加上這個配置就是使用xpos,也就是(tdpos+chainedBFT)
不加就是tdpos,不能保證安全性
很是感謝百度鏈的技術大牛的支持 超哥
本文使用 mdnice 排版