总结超级账本合约开发过程中遇到的坑

1. 不要尝试获取节点本地的时间作为key或value的值

即使每个节点的本地的时间系统是经过校对一致的,但同一个交易在每个节点上执行的时间点不一定是相同的。如果使用time.now().unix()来取节点本地的时间作为key或value的值,会导致每个节点执行同一个交易的结果不一致,从而造成交易失败。正确的做法是使用函数GetTxTimestamp()来获取交易的时间。每个节点通过函数GetTxTimestamp()来获取到的交易时间是相同的
例子:
t, err := stub.GetTxTimestamp()
t.Seconds // 交易的时间,unix时间戳,精确到秒
t.Nanos// 交易的时间,unix时间戳,精确到纳秒
time.Unix(t.Seconds, int64(t.Nanos)).UnixNano() / 1e6 // 交易的时间,unix时间戳,精确到毫秒



2. 在同一个区块里多笔交易对同一键进行更新

对同一键进行更新的一个或多笔交易打包到同一块中,只有第1笔交易会成功,后面的交易会失败。相关的原因是:在一个区块里的多笔交易,只有在区块被提交后才会真正生效。而每一个键值都有版本号,假设一个键“key_1”在本个区块提交前的版本号为9,然后在本个区块里有2笔交易分别更新键"key_1"的值为"123"和"456"。那么当第1笔交易更新键“key_1”的值时,键"key_1"的版本号在本个区块里将更新为10,但在本区块未提交前,真正生效的版本号还是9。而当执行第2笔交易时,该交易读取到键"key_1"的版本号还是9&#x

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值