区块链技术在发展的过程中,逐步演化出了其他结构形式的技术流派,比如DAG、Block-Latice、Block-Vine等等。所有的区块链技术流派,都必须实现对交易事件的定序,只是实现的方式有所不同。DAG技术突破了“区块”和“链”的概念,Block-Latice技术也一样。Nano项目采用了Block-Latice技术,据其白皮书中宣称,比典型的DAG项目(比如IOTA、ByteBall等等)出现得还早一些。目前有很多项目都采用了这种设计方案(比如Jura、Vite、Dexon等等),Nano是否为Block-Latice技术的首创者,我并不确定,不过Nano确实给我展示了一种简单、优雅的设计印象。
为了更容易地理解Nano及Block-Latice的设计思想,我们可以看一个简化的经济交互场景:某个经济系统里A、B、C三人互相之间有资金往来,需要记录每笔交易事件的详细信息(花费了多少钱,支付给了谁,支付时间等等)。若采用Bitcoin系统,则由矿工负责记账,通常多笔交易被放在一起,由矿工批量打包到区块中,并通过PoW共识算法同步到全网络。
Block-Latice从更贴合实际经济活动的角度出发,针对每个账户,按交易顺序分别记录仅属于该账户的交易事件,形成该账户对应的唯一的一条链。一个账户一条链的设计,使得每笔支付交易只会导致相关的两条链(或两个以上,若同一笔支付交易中可以包含多个接收账户)需要变更,而不影响其他链,不同链之间的更新是异步的,不需要同时进行,提高了系统的吞吐量。每个链的最新区块(头部区块)代表了该链的「当前有效状态」,头部区块之前的区块数据只代表历史,仅用于回溯对账,很多计算节点可抛弃历史数据(可称之为「账本修剪」),只保留每条链的头部区块作为最新账本,这就极大地降低了存储需求,相当于Bitcoin系统中的某些节点抛弃了大部分交易数据,只保留所有的Block-Header和UTXO集。
当A支付X个币给C时,A账户链中会生成只包含这笔交易信息的区块,A账户的余额发生了变化,C账户链感知到A账户链中的数据变化后,也会生成只包含这笔交易信息的区块,C账户的余额也发生了相应的变化。虽然A链与C链在形式上是互相独立的,但是A账户链与C账户链的数据更新必须相互融洽,不可以出现资金发送(Send)与接收(Rreceive)数额不一致的现象。Nano通过「交易数据的数字签名」和「类似PoS共识算法的代理人投票机制」确保整个账本的一致性,并实现对冲突区块(恶意分叉、双花交易可制造多个冲突区块)的选择与淘汰。Nano的每个账户链的第一个区块(可称之为「开户区块」)中填写了用户自愿选择的投票代表(Representative),并允许用户随时发送更新交易将其更换。投票代表R的权重由选择R作为代表的所有账户的余额总和所决定,与PoS共识机制类似。
Block-Latice技术中同样存在双花支付现象:基于A账户的最新区块(Block i+1),A支付X个币给B后,又基于区块(Block i+1),支付了Y个币给C,这样就形成了两个互相冲突的新区块(Block i+2)。当B和C获得A的支付交易区块之后,可将A的交易广播到全网络,然后询问投票代表(或监听投票广播信息)是否观察到A有双重支付行为,若B和C的选择的投票代表不在线,可以更换新的投票代表。假定同时在线的多个投票代表中,大部分权重对应的代表是诚实的,针对A账户链的多个冲突区块进行几轮投票之后,选票最高的唯一区块获胜,其他区块将被淘汰。然后B和C才开始更新B账户链和C账户链,这就解决了双重支付问题。我认为还可以引入押金机制,对双重支付行为进行处罚,避免A账户持续生成双重支付区块,导致代理人节点之间频繁进行投票广播。
Nano技术白皮书里并没有提到如何奖励投票代表节点(也必然是全节点),可能是经济激励的设计并不难,有很多可选方案,比如系统每年增发一定量的币,按照权重比例,分配给投票代表节点。Nano采用了零手续费的设计方案,因为其具备极好的账本修剪特性,不用担心账本数据量激增。为了防止恶意用户在自己的多个账户链之间持续发送垃圾交易,Nano要求每笔交易中的部分数据的哈希值必须处于一定范围,这部分数据是可以提前知道的,因此用户可以为未来的交易提前计算好符合哈希值要求的Nonce值,不会耽误未来的交易。也可以采取「限制每个账户链的区块生成速率」的方式防范垃圾交易行为。但这些方案似乎不能防止攻击者利用多个账户链持续创建开户区块,再加上新建的账户链,则可创建更多的开户区块,造成数据量激增。所以我觉得零手续费机制不一定最优,燃烧掉较低的手续费,可强化系统安全,并进一步简化设计方案。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』