乐趣区

关于区块链:百度区块链所遇到的问题及处理汇总

前言

这篇文章说下应用百度链可能遇到的问题及解决办法

创世节点账户余额最大值

cat data/config/xuper.json

我轻易写了一个值 239 位

而后查问下余额能够查到

所以就认为没有最大值吧 设置为多少就是多少喽

若要晓得准确的 须要看下源码

转账金额大小有限度吗

./xchain-cli transfer --to XC1111111111111111@xuper --amount 2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

有点震惊呐 这么大都能够转账 哈哈

这个账户我也没有创立 我间接往里面转账 也是能够的?

在转账的时候同时创立好了这个账户,但不是合约账户哦

一般账户和合约账户能够是同一个账户名称

咱们再来测试下哈

1、先给一个不存在的账户转账

此时会创立这个一般账户

2、在创立一个同名的合约账户

印证了上述的猜想

调用合约 保留 K -V Key 和 Value 长度有限度吗

我测试的时候是用的 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

创立一个合约账户并转账 看在其余的节点是否有同步过来

  • 在节点 2 创立一个合约账户

应用节点 1 账户地址拜访节点 2

通过 java sdk 连贯节点 1 创立合约账户 XC1111111111116666@xuper

create account de1dc9e04a2d8b9bbf734f60431ab7eac5843f8711c3fe430c5df345dac272b8

  • 给该合约账户转点钱

应用节点 1 的账户拜访节点 2

transfer 3d6023d4a1ba08506fdd1e0ee0cc234f6d93f639a708e32ebe8d1d51d8272349

  • 别离查看节点 1、节点 2、节点 3 的该合约账户的余额

节点 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`

小结:在一个节点部署合约 会同步给其余的所有节点

  • 到不同的节点查看一个 hash 值 看是否都统一

比方查问 60b4ee039415ed2e8880212cf182361143f314f988034a669aee5be2a9c6b02a

./xchain-cli tx query 60b4ee039415ed2e8880212cf182361143f314f988034a669aee5be2a9c6b02a

在节点 1、节点 2、节点 3 查问的交易详情内容统一

小结:在一个节点做的交易会同步给所有的节点

降级版本是否会影响到历史数据

  • 形式一(不举荐 也不对)

目前我是用的 master 分支 但不是最新的

以后的区块高度是 605

那我想要降级到最新的 master 代码

1、现将所有节点停掉

2、创立新的文件夹用来寄存最新的版本

3、下拉最新的代码并进行编译

4、替换可执行文件

`cp -r output/* lastv-20200729/pn1
cp -r output/* lastv-20200729/pn2
cp -r output/* lastv-20200729/pn3`

5、将上一版本下的 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`

6、重启

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 文件还须要批改创世块配置 所以须要删除老数据

  • 零碎如何抉择出块节点

此时零碎在抉择出块节点的算法中会判断该节点是否已同步实现 若已同步实现才会抉择该节点作为以后节点

  • 查问申请过去如何解决

查问的是以后同步到的状态

  • 新搭的场景 出块节点须要再创世快配置中配置;非新搭场景 增加一个出块节点 先批改 yaml 文件 跑起来 而后进行 token 抵押 能力出块

若一笔上链交易 在零碎确认好一个出块节点之后 若忽然这个节点挂掉了 此时零碎是如何解决的这笔交易呢

如果发动一笔上链交易 交易在出块前会在各个节点间转发,该节点挂掉其它节点能够持续打包

如何应用 xpos 共识

加上这个配置就是应用 xpos,也就是(tdpos+chainedBFT)

不加就是 tdpos,不能保障安全性

如果通过 sdk 调用合约上链的时候 节点若是响应超时的话或因为网络问题没有收到响应 此时并没有收到 hash 值

  • 交易 hash 没有返回肯定没有上链,阐明预执行失败
  • 首先客户端向节点发动交易预执行申请,预执行完结后会返回客户端读写集,这时客户端会在本地计算 txhash,如果没有失去 txhash 阐明交易基本不可能上链 计算 txhash 胜利后,才会将残缺的 tx 发送至网络

感激

非常感谢百度链的技术大牛的反对 超哥

本文应用 mdnice 排版

退出移动版