读写集语义
本文讨论了有关读写集语义的当前实现的细节。
Transaction模拟和读写集
在一个背书节点模拟transaction期间,为交易准备了一个读写集合。read set
包含在模拟期间transaction读取的唯一键及其提交的版本的列表。write set
包含唯一键的列表(尽管可能与读集中存在的键重叠)以及transaction写入的新值。如果transaction执行的更新是删除key,那么设置key的删除标记(代替新值)。
此外,如果transaction为key多次写入值,则只保留最后写入的值。另外,如果一个transaction为一个key读取一个值,即使transaction在发出读取之前更新了key的值,也会返回提交状态中的值。换句话说,不支持Read-your-writing语义。
如前所述,键的版本仅在读集中记录; 写入集只包含唯一键的列表及其由transaction设置的最新值。
可能有各种实现版本的方案。版本控制方案的最低要求是为给定的key生成不重复的标识符。例如,对于版本使用单调增加的数字可以是一种这样的方案。在当前的实现中,我们使用基于区块链高度的版本控制方案,其中提交transaction的高度被用作所有由transaction修改的key的最新版本。在该方案中,transaction的高度由tuple表示(txNumber是块内事务的高度)。该方案比增量数量方案具有许多优点 - 主要是它可以实现其他组件,如说明,交易模拟和验证,以进行有效的设计选择。
以下是通过模拟假设交易准备的示例读写集的说明。为了简单起见,在插图中,我们使用增量数字来表示版本。