在DAG 结构的区块链中存在着相当多的数据冗余,这篇文章通过特殊的数据结构TU减少了数据的冗余。
DAG的分类
DAG 分成 txDAG 和 blockDAG,
BLOCKDAG
允许不同的user 独立创建bolck,这样能够提高系统的并发率。但是不同的block之间会有冲付的交易 transaction inclusion collision
TXDAG
txDAG 以交易为粒度构成DAG,因此不会出现 transaction inclusion collision 。但是txDAG 又会有额外的存储开销。
txDAG 需要存储两种类型的 reference,收发地址,nonce ,签名。
- par-ref 由同一个sender 发出的交易会通过 parent reference链接
- var-ref 每个新的交易会随机 reference 两个tips A vertex is named as a ‘tip’, if it has not been cited by any par-ref and has been cited by less than two ver-ref s. For example, there are four tips in Fig. 1 marked by the thick
- nonce 用来验证POW计算结果。
confirmation rules
通过累计验证 Cumalative Verification (CurVer)进行验证。
Cumver 是引用验证这笔交易的子交易的数量。
CumVer of vertex 2 is 5, since it is verified by vertex 3, 4, 5, 7, and 8.
当有交易冲突时,系统认Cumver 最大的交易。
GeckoDAG
通过一个数据结构TU ,将交易中的重复部分进行合并。
acount redundancy
将同一个 par-ref 链上的交易进行聚合,有很多账户相关的信息重复,比如他们有相同的发送者。
原本是对每个交易进行签名,但是现在可以只针对TU进行签名,还可以省略签名的存储。
reference redundency
去除不必要的 par-ref
如果 ver-ref 首尾交易的账户是相同的,那么就是可以被 override的引用,因此可以去重。
Range and frequency to merge transactions
将同一个账户发出的多笔交易通过TU这个数据结构进行压缩。
Deduplication of content section
TU中的 content section中可能有数据的重复,因此可以将使用 common content section 将 content section 聚合在一起,进一步压缩存储。
Reduction of network overhead
因为TU 中很多内容都是可以通过之前的TU 和已有的交易计算出来的,因此在广播tu的时候没有必要广播所有的数据,只需要广播最新的交易和对tu的签名就够了
Transation prune
如果仅仅是增加了TU这个数据结构是不能够减少存储的,反而会增加存储,因此需要对过去的交易进行剪枝。
一个交易可能被引用多次,若存在引用没有override,那就不能被 prune,否则可以prune
如果没有进行剪枝,仅仅是生成TU 的确是会增加 vtx,就是诚实交易的 CumVer如下图所示
一个问题是TU 会增加 CumVer 没错,但是在剪枝prune 的时候,被剪枝的交易的Cumver会减少啊,这个为什么不说呢? 正如图6中,交易2被prune,那他的CumVer不就变小了?
设计上的一个问题。除非是在剪枝的时候,将达到 milestone的交易减掉。curver 减小也就不用再被关心了。
security
如果一个受害的合法交易 vtx 收到了恶意交易 mtx的双花攻击,那么恶意的算力会进行 selfish-mining 来使得 mtx 的CumVer 超过 vtx,因此不会提前将其公布出来,因此不会通过 TU 来增加 mtx的 CumVer,因此不会TU增加交易的CumVer不会降低vtx的安全性,反而会增加安全性。
但是 vtx 一旦被剪枝掉呢?这里没有分析,其实是这个设计存在的一个问题