Closed godeamon closed 1 year ago
【问题介绍】超级链采用UXTO模型,在合约数据上使用XModel模型,即所有的key都有唯一的版本,版本由refTxid+offset组成,因此所有的交易可以组成一个DAG。一个合约调用的交易的 input 中会包括引用的key以及版本,output 中会包括key以及value,如果交易中对某些key是只读的,那么只会在input中出现,不会在output中出现,同时此时key的版本也不会改变。 在未确认交易池中就可能出现这种情况:交易A的output包括key:a,交易B中引用了交易A的key:a,交易C中引用了交易A中的key:a同时将key:a的value修改,此时交易B只读依赖于交易A,交易C读写依赖于交易A。这三笔交易在未确认交易池中也会建立对应关系。
【问题详细描述】矿工打包区块时需要从未确认交易池中获取一批交易,且交易要按照依赖关系排序,其他节点执行这个区块时需要按照顺序执行。目前在打包区块时,对交易A、B、C进行打包时,会先打包交易A,因为交易B、C都依赖于交易A,但是对于交易B、C的打包顺序是不确定的,如果先打包了交易C再打包交易B,那么其他节点执行此区块时会失败,因为交易C将key:a的版本从交易A改到了交易C,验证交易B时版本不对导致区块执行失败。
【解决方案】打包区块交易时,对于上述情况,需要保证打包顺序为:A->B->C,在目前未确认交易池中遍历交易时区分只读、读写关系。
【设计方案】
评审结论:按照上面方案执行。
【问题介绍】超级链采用UXTO模型,在合约数据上使用XModel模型,即所有的key都有唯一的版本,版本由refTxid+offset组成,因此所有的交易可以组成一个DAG。一个合约调用的交易的 input 中会包括引用的key以及版本,output 中会包括key以及value,如果交易中对某些key是只读的,那么只会在input中出现,不会在output中出现,同时此时key的版本也不会改变。 在未确认交易池中就可能出现这种情况:交易A的output包括key:a,交易B中引用了交易A的key:a,交易C中引用了交易A中的key:a同时将key:a的value修改,此时交易B只读依赖于交易A,交易C读写依赖于交易A。这三笔交易在未确认交易池中也会建立对应关系。
【问题详细描述】矿工打包区块时需要从未确认交易池中获取一批交易,且交易要按照依赖关系排序,其他节点执行这个区块时需要按照顺序执行。目前在打包区块时,对交易A、B、C进行打包时,会先打包交易A,因为交易B、C都依赖于交易A,但是对于交易B、C的打包顺序是不确定的,如果先打包了交易C再打包交易B,那么其他节点执行此区块时会失败,因为交易C将key:a的版本从交易A改到了交易C,验证交易B时版本不对导致区块执行失败。
【解决方案】打包区块交易时,对于上述情况,需要保证打包顺序为:A->B->C,在目前未确认交易池中遍历交易时区分只读、读写关系。
【设计方案】