美文网首页
Nervos项目核心设计简释

Nervos项目核心设计简释

作者: Buffalo_Lv | 来源:发表于2018-11-05 22:08 被阅读159次

    在Bitcoin和Ethereum取得巨大成功之后,人们开始对公链的设计进行大量的探索,新的架构和设计层出不穷,比如DAG、DPOS、Algorand、Ouroboros 、Conflux、2-hop Blockchain、Thunderella等等。对于DAG、Conflux,之前的文章已经给出过相关的分析和论述。近期阅读分析了Nervos项目的技术白皮书,感觉这个项目对于公链设计给出了一些有趣的创新点、有启发性的新思路,其白皮书下载地址为:

    https://github.com/NervosFoundation/binary/blob/master/whitepaper/nervos-ckb.pdf

    https://github.com/NervosFoundation/binary/blob/master/whitepaper/nervos-ckb-zh.pdf

    由于其技术白皮书对设计细节的论述不够详尽,因此本文尝试着对其核心设计做简要解读,如有误解,以Nervos的具体代码实现为准。

    Nervos的核心设计思想

    1)区块链的技术体系应该分层,比如Bitcoin和Ethereum属于Layer1,而闪电网络和Plasma则属于Layer2。除了闪电网络、Truebit、Plasma等典型的Layer2技术之外,Layer2可以有多种多样的表现形式,Nervos需尽可能实现一些通用的、不可或缺的Layer1核心功能,致力于为应用链(APP-Chain)的设计和运行提供底层支撑。因此Nervos设计了一个Layer1的核心系统Nervos-CKB(Common Knowledge Base),其综合了Bitcoin和Ethereum的一些优点,并试图避免Bitcoin和Ethereum做得不够好的某些地方。

    2)Layer2系统的参与者(包括节点、用户等等)在进行交互之前,必然要具备一些共同知识或共识,这些共识最终会以数据的形式表达出来,并存储在Nervos-CKB的各个参与节点上,这也是共同知识库(Common Knowledge Base)的命名由来。这就类似于两个人能够流畅的沟通交流区块链技术,那么两人必然要储备同一门自然语言(比如汉语、英语)的语法及语义知识,同时两人还必须储备一些共同的非对称密码学、P2P通信等知识。

    Nervos对「Bitcoin-UTXO」的改进

    从Nervos的设计观点来看Bitcoin的UTXO,其实是对某一账户地址所拥有的价值总额的分批存储,UTXO是共同知识的一个特例,正是因为其存储的余额是一种共同知识,其代表的价值才能被整个Bitcoin网络所认可,账户拥有者才能执行转账交易花掉这笔钱。如果把UTXO的功能推广,不仅仅用于存储余额及锁定脚本,而可用于存储任何数据和代码,这样就更加通用化了。Nervos称一个通用化的UTXO为Cell,其为共同知识的基础存储单元。一个Cell包含了5个基本面:

    1)Type:Cell中存储的数据是有类型和结构的,有些类似于用DTD 来定义 XML 文档的结构;

    2)Capacity:Cell的存储容量,可以存储的最大字节个数;

    3)Data:Cell中实际存储的数据;

    4)Owner_Lock:定义Cell的拥有者,和UTXO类似,通过一段脚本程序对拥有者进行描述和验证;

    5)Data_Lock:定义Data的拥有者,同样是通过一段脚本程序对拥有者进行描述和验证。

    Nervos通过Owner_Lock和Data_Lock分离了Cell的拥有权和使用权。Cell的拥有者可以转让Cell,而Data的拥有者才可以更改Cell里存储的数据。Bitcoin解决了双花问题,UTXO被花掉以后,就不能再被第二次花费了。类似的,A_Cell被更新为B_Cell之后,A_Cell就不能再被更新了,除非对B_Cell做更新。所有可以被更新的Cell(也就是还未被更新的Cell)中存储的数据及其关联的验证程序,形成了最新版本的共同知识,类似于Bitcoin的UTXO集。对于Bitcoin,利用UTXO和多重签名、时间锁等机制,可以实现跨链原子交易和链外的支付通道,对于Nervos,利用Cell中存储的共同知识数据、验证代码等机制,可以为Layer2系统、跨链交互、以及App-Chain的实现提供一定的便利。

    Nervos对「Ethereum-状态变更」的改进

    在Ethereum平台上,可以部署合约,在合约中可以分配数据存储空间,并通过交易事件触发运行合约函数对这些数据存储状态进行更新。Nervos认为对数据状态的更新,可以运行在用户端(比如手机里安装的钱包APP),用户发送的交易会包含更新后的数据状态值和Cell中的数据使用权证明,Nervos-CKB链上只需要部署状态更新的验证程序就可以了,而无需运行状态更新程序。对比交易事件驱动状态改变的模型,Nervos的设计方式可以带来很多好处,比如:

    1)Nervos全节点可以非常自然地并行处理多个交易,而Ethereum全节点对于同一区块中的目标地址为同一个合约地址的多笔交易,只能做串行处理;

    2)对于很多计算任务,计算过程和验证过程是不一样的,执行量也是有很大差异的。比如Bitcoin的工作量证明,给出一个合法的区块头部,是极其困难的,而验证一个区块头是否合法,则非常简单。在输入数据源相同的情况下,对于一个计算程序,一定存在比其计算复杂度小的验证程序。否则就没必要验证了,重新运行一次计算程序,并核对结果是否相同,就是最精确的验证手段。因此将计算程序分配给用户端执行,而区块链系统只执行验证程序,可以很大程度上减轻区块链系统全节点的运行负担。Nervos称验证程序为Validator,计算程序为Generator,类似于Hadoop的设计者并不知道用户会用Hadoop平台做什么类型的计算,但是Hadoop只需设计出并实现通用的Map-Reduce计算框架,用户自然会针对具体的计算问题给出具体的Map程序和Reduce程序。

    例如:利用Generator和Validator互相分离的特性,可以设计一款象棋或围棋程序,记录AI系统(比如Alpha-Go)和人类专业棋手进行的著名对战(普通人之间的对战就没必要上链了,区块链游戏还是太贵,最好放在Layer2执行),Cell负责存储棋盘状态及变更历史,Validtor负责验证每一步棋子挪动是否符合规范(车走直、马走日、炮打隔子等等),Generator负责游戏界面交互、移动棋子、判决游戏输赢等等。

    3)Ethereum用户向某个合约地址发送一笔交易,用户可能无法预测这笔交易会给合约里的数据带来怎样的更改,因为在同一时间段,可能还有其他用户也向该合约地址发送了交易。除此之外,矿工还可能监控某些合约(比如Fomo3D),通过立即打包、不打包、延后打包某些交易、调整交易在区块中的位置顺序等手段,为自己谋求利益。而Nervos用户在发交易之前,自己执行了Generator程序,并得出了Cell的结果状态,只要其交易能通过Validator程序的验证,用户是能够事先清楚地知道状态变更结果的。

    4)Ethereum用户必须拥有足够的ETH才能让交易上链并触发合约执行,这会给普通用户带来一定的麻烦,比如某项目方创建了ERC20-Token合约,但是该Token的用户必须同时拥有ETH才能正常执行Token的转账。Nervos考虑到了这一点,可以让Cell的拥有者给Cell的使用者付费,但Nervos白皮书并未详细解释具体是如何做到的这一点的。不过Ethereum也在不断发展,未来也可以通过升级实现这一点,比如在合约中实现某些特殊的指令,允许合约的拥有者预先存入一定量的ETH为普通用户付费,并注册验证程序,能够通过验证的交易,就能触发运行合约,不能通过验证的交易,就会被矿工丢弃,这样可以防止恶意的交易并防止DDOS攻击,对于普通转账交易,也可以引入账户属性设置等更加人性化的功能,并实现收款方支付不超过收款额的手续费,这些在理论上都是可以做到的。

    相关文章

      网友评论

          本文标题:Nervos项目核心设计简释

          本文链接:https://www.haomeiwen.com/subject/btbexqtx.html