前言
这篇文章说下使用百度链可能遇到的问题及解决办法
创世节点账户余额最大值
我随便写了一个值 239位
然后查询下余额可以查到
所以就认为没有最大值吧 设置为多少就是多少喽
若要知道精确的 需要看下源码
转账金额大小有限制吗
有点震惊呐 这么大都可以转账 哈哈
这个账户我也没有创建 我直接往里面转账 也是可以的?
在转账的时候同时创建好了这个账户,但不是合约账户哦
普通账户和合约账户可以是同一个账户名称
我们再来测试下哈
1、先给一个不存在的账户转账
此时会创建这个普通账户
2、在创建一个同名的合约账户
印证了上述的猜测
调用合约 保存K-V Key和Value长度有限制吗
我测试的时候是用的36288长的字符串 是可以的
如果是 36288*2 长度 java代码已经不支持了 超过了java 字符串常量的长度
这里科普下java的基本知识
既然调用合约是通过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
- 在不同的节点分别调用该合约做交易
在节点1调用合约
在节点2调用合约
和节点1区别在于 key为 mac1(这个合约的key是唯一的)
在节点3调用合约
和节点1区别在于 key为 mac2
小结:在一个节点部署合约 会同步给其他的所有节点
- 到不同的节点查看一个hash值 看是否都一致
比如查询 60b4ee039415ed2e8880212cf182361143f314f988034a669aee5be2a9c6b02a
在节点1、节点2、节点3查询的交易详情内容一致
小结:在一个节点做的交易会同步给所有的节点
升级版本是否会影响到历史数据
- 方式一(不推荐 也不对)
目前我是用的master分支 但不是最新的
当前的区块高度是605
那我想要升级到最新的master代码
1、现将所有节点停掉
2、创建新的文件夹用来存放最新的版本
3、下拉最新的代码并进行编译
4、替换可执行文件
5、将上一版本下的data和conf目录替换到最新的
6、重启
节点1可以启动,但节点2启动失败 说明这种升级的方式不对
- 方式二(推荐)
查看升级文档 https://xuperchain.readthedocs.io/zh/latest/operations_guides.html#id2
我上面的思路是创建新的文件夹 将老版本数据复制到新文件夹中
官方文档的思路是 将新的“plugins文件夹, 二进制文件xchain,xchain-cli”这些文件将老版本的替换掉 然后重启即可
升级完成 保留了老数据
新增出块节点 节点数据同步中
- 如何新增节点
a、若是新增一个同步节点 不需要修改 创世块配置 不需要删除老数据 只需要修改 yaml文件即可 然后启动即可
b、若是新增一个出块节点 这个不仅仅需要修改yaml文件还需要修改创世块配置 所以需要删除老数据
- 系统如何选择出块节点
此时系统在选择出块节点的算法中会判断该节点是否已同步完成 若已同步完成才会选择该节点作为当前节点
- 查询请求过来如何处理
查询的是当前同步到的状态
- 新搭的场景 出块节点需要再创世快配置中配置 ;非新搭场景 添加一个出块节点 先修改yaml文件 跑起来 然后进行token抵押 才能出块
若一笔上链交易 在系统确认好一个出块节点之后 若突然这个节点挂掉了 此时系统是如何处理的这笔交易呢
如果发起一笔上链交易 交易在出块前会在各个节点间转发,该节点挂掉其它节点可以继续打包
如何使用xpos共识
加上这个配置就是使用xpos,也就是(tdpos+chainedBFT)
不加就是tdpos,不能保证安全性
如果通过sdk调用合约上链的时候 节点若是响应超时的话或因为网络问题没有收到响应 此时并没有收到hash值
- 交易hash没有返回一定没有上链,说明预执行失败
- 首先客户端向节点发起交易预执行请求,预执行结束后会返回客户端读写集,这时客户端会在本地计算txhash,如果没有得到txhash说明交易根本不可能上链 计算txhash成功后,才会将完整的tx发送至网络
感谢
非常感谢百度链的技术大牛的支持 超哥