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