应对UTXO集增长问题:低时延延迟TXO提交方案(2)
每晚八点,我们在社区分享知识,等你。
NervosFans 微信公号:Nervosfans
入群请加乐乐微信:sensus113 美果大冰微信:xj73226
备注入群,谢谢!
1.2.1 TXO MMR实施细节
每个TXO MMR状态都是对前一个TXO MMR状态的修改,多数信息都是共享的,通过分享状态间未更改数据以一种空间高效的方式存储大量TXO提交状态,其中每个状态都是之前状态的小三角。由于Merkle数据结构中,不存在循环,因此简单的引用计数足以进行垃圾数据收集。不需要的数据可以直接修剪出数据库,重新添加方可恢复。
由于数据提交通过加密哈希方式实现,因此无论在何处获取数据,恢复后均可得正确数据。
下面,看看TXO MMR工作细节。这个TXO MMR有两个txout,状态为#0:
添加另个条目,得到状态#1:
有没有注意到#0状态中100%的状态数据都在提交#1中重复使用。 下面再添加两个条目获得状态#2:
这次,#1状态中有部分数据没有被重复使用,虽不是个完美的二叉树,仍然有很多数据被重复使用。
现在假设状态#2被最近的块提交到区块链。 以后想花费状态#2输出的交易就必须证明输出是未花费的;因此必须提供部分状态#2 MMR数据。基于此,可以修剪该(状态#2 MMR)数据,该扔的扔,只留下添加新txout至TXO MMR所需的(最少)数据:
注意,这里略过了一些哪些数据需要保留的细节;这个实现中,节点“2”和“e”所需的应该是其哈希摘要。
再添加三个txouts,产生状态#3:
假设最近创建的txout f已花费。 现已拥有更新MMR所需的全部数据,更新后就是状态#4。新状态对两个内部节点和一个叶子节点做了修改:
若花费存档txout,则需要交易提供最近提交TXO的Merkle路径,就是状态#2。 若txout b已花费,则说明交易必须提供来自状态#2的以下数据:
可以将这些数据添加到TXO MMR的局部知识中,相当于对数据进行一定的恢复:
记住,此时仍未对状态#4进行修改;有的只是更多的数据。将txout b标记为已花费时,得到状态#5:
其次,到目前,状态#3已经被提交上链,想要花费状态#3以后txout的交易必须提供包括状态#3数据的TXO证明。输出g和h的叶节点还有它们上面的内部节点都是状态#3的一部分,可以对其进行修剪:
好了,从头捋一遍:花费txout a、c和g时,创建出三个新的txout i、j和k。 状态#3是最近提交的状态,因此花费a和g的交易提供了到状态#3的Merkle路径,路径中包括了状态#2的部分数据:
恢复数据后,有了以下的状态#5数据:
这就足以将三个输出标记为已花费并添加三个新的txout,产生状态#6:
另外,可以修剪状态#4的相关数据。 此外,根据STXO集的实现方式,也可以修剪与该状态之后的已花费txout相关的数据,包括一些节点下所有txout已花费的内部节点。
https://petertodd.org/2016/delayed-txo-commitments