Don’t Trust, Verify

这篇文章试图讨论全节点对于区块链的意义。安全

角色

咱们都知道,区块链网络中的节点有不一样的角色。例如:网络

出块节点

出块节点负责打包交易,生产区块。出块节点在不一样的地方有不一样的名字,例如比特币和以太坊中的矿工/矿池,Bitshares的Delegator,EOS的Producer, Cardarno的Stakeholder,Tendermint和Casper中的Validator,以及CITA中的共识节点等等。 在这些网络中,出块节点的角色每每与全节点角色重合。最接近纯粹出块节点的例子应该是使用getblocktemplate协议参与挖矿的比特币矿机,他们不验证区块,可是拥有选择交易打包和封装完整区块的权力。框架

出块节点相对于其余节点每每须要付出更多的资源,包括算力(不管是用于PoW仍是用于交易计算),磁盘,网络带宽等等。这些资源要求抬高了出块节点的门槛,容易形成出块节点分布的中心化。分布式

全节点

区块链中的区块由两个部分组成,区块头和区块体。区块头中存放包括区块见证(例如工做量证实或是投票)在内的元数据,区块体中包含交易数据。区块的验证由此也能够分为两部分,对区块头的验证和对区块体的验证。对区块头的验证主要是出块权的检查,例如区块头中包含的工做量证实是否有效;对区块体的验证主要是对交易有效性的检查,确保区块体中每一笔交易都是有效的。性能

全节点同步交易和区块,对其进行验证,并转发有效的交易和区块。为了可以进行验证,全节点必须有完整的当前世界状态(例如UTXO集合)。因为全节点自行进行全部的验证,所以不须要信任其余第三方。区块链

一般状况下,出块节点构造新区块时须要引用前一个有效区块,为了确认父块的有效性必须对其进行验证。此时出块节点也作了全节点的事情,也是一种全节点。这种角色上的重合不是必然的,不影响后面的讨论。优化

轻节点

轻节点与全节点不一样:轻节点只同步和验证区块头,不会同步和验证区块体以及其中的交易。所以,轻节点只能验证区块头的有效性,没法验证该区块头对应的区块体中交易的有效性,只能相信构造这个区块的出块节点没有打包无效的交易,而且相信将这个看起来合理的区块头发送给本身的全节点对其进行了完整的检查。轻节点是信任其它节点的节点。因为不一样步交易,轻节点也没法得知交易处理以后的世界状态,天然也没法验证交易双花或是世界状态的变动。轻节点的验证能力大大弱于全节点。网络传输协议

相信其它节点的好处是,轻节点的开销很小:区块头的体积只占区块的很小一部分,很容易同步和存储。所以轻节点能够运行在笔记本甚至手机等各类有限硬件环境中。加密

关系

这几种角色之间的关系是一个很是有意思的问题,也是我和朋友们经常会讨论的一个话题。在这样的讨论中,若是你拿出一支笔,请在场的任意一位朋友在白板上画出他心目中的这三种节点组成的区块链网络拓扑,大几率会获得相似这样的图:spa

clipboard.png

clipboard.png

图1. 朋友心中的节点拓扑A12856753-e57be4f7b1204b84.jpg1240×960 44 KB
图2. 朋友心中的节点拓扑B12856753-90c0b692bf524eaf.jpg1240×960 46.5 KB
在图1中,出块节点在最中心的位置,全节点围绕出块节点造成网络,轻节点链接在全节点上;在图2中,出块节点和全节点混合组成分布式网络位于中心,轻节点链接在全节点或者出块节点上。哪一副图更接近真实状况呢?

谁是守护者

人们一般认为出块节点是守护者(Keeper)一个区块链网络的守护者,这样的观点不无道理。毕竟是出块节点验证交易,生产新的区块,为用户提供服务,这也是为何人们会把出块节点/矿工画在网络拓扑的中心。看上去,他们已经拥有了定义区块链的权力。然而,若是咱们将注意力再降低一层,从P2P网络的观点来看,结果却不是这样。

通常的P2P网络,例如BitTorrent或是Kad Network,目的在于更快的分享数据,这些网络中的节点并不关心本身转发的数据包包含的是什么样的数据。这些节点不须要理解数据,只须要转发数据,帮助数据从网络中的一点流动到另一个点。它们只是数据的搬运工。

区块链的P2P网络则不只仅是数据的搬运工,仍是数据的验证者。P2P网络由全节点构成,全节点在接收到新的交易或者新的区块时,首先作的事情是验证。这里的验证不只仅是验证数据自己的完整性(Integrity),还要验证数据在业务逻辑中的有效性,例如这笔交易是否和帐本中已经有的交易冲突(双花),或者这个新区块是否包含了无效的交易。验证交易是否双花是业务层(帐本)的逻辑,不是网络层的逻辑。在区块链的P2P网络中,节点不只仅要转发数据,还须要理解数据。数据转发在区块链节点中是一个提高到业务层的概念,而不仅是一个网络层的概念。

这种设计所致使的结果就是,全节点组成的网络造成了一道“防火墙”,有效阻止了无效交易和区块的传播。出块节点若是产生一个包含无效交易的区块,这个区块只可以传播到与其相邻的全节点,没法穿透这些相邻节点造成的防火墙传播到更远的地方,没法进入全节点网络维护的区块链主分叉,无效交易也就没法被依赖全节点的轻节点或是钱包接受。

所以,出块节点只是新的区块的提议者,并不能让全节点网络接受无效的区块或是交易。挖出一个新的区块并非共识的结束,而是共识的开始。若是套用Paxos共识里面的词汇,出块节点是Proposer,全节点是Acceptor。出块节点持续打包交易,提交新的区块,全节点验证新的区块提案,保证新区块和其中交易的正确性。从这个角度看,做为验证者的全节点更应该被称做守护者(Keeper)

按照这样的理解,咱们能够画出这样一个图:

clipboard.png

在图3中,全节点网络位于中心,造成一个相互验证的去中心化网络,一道安全屏障。轻节点链接这个网络中的全节点,使用全节点提供的服务。轻节点之间也能够造成本身的网络,但须要注意的是,轻节点网络没有验证功能,转发在这里更多的是网络层的概念。轻节点网络和全节点网络是不一样的网络。出块节点链接全节点提交新的区块,出块节点之间也能够造成本身的网络,以更好的提供服务,例如比特币的FIBRE就是一个矿池之间的专用网络。

全节点网络对区块链的安全相当重要。全节点数量越多,网络越可靠,加密经济的基础越稳固。全节点的运行成本和长期数量这两个指标在将来的区块链价值评估中应该会扮演愈来愈重要的做用。区块链发展面临的一个关键问题是,如何激励全节点?这个问题看上去简单,实际上会触及一些很是深层次的(也许是不可调和的)矛盾,例如data availability problem,这里就不展开说了,之后有时间再写文章讨论。

案例分析

当咱们理解了全节点的重要性,在脑海中创建了正确的网络拓扑后,就能够用这个框架来分析实际的问题了。这里举两个例子。

FIBRE

FIBRE是比特币快速网络中继引擎(Fast Internet Bitcoin Relay Engine)的缩写,是一个专门给矿工提供服务的区块传输网络。FIBRE在全球不一样的位置部署了6个节点,相互之间经过高速网络链接,使用UDP+ForwardErrorCorrection传送数据,几乎实现了无延迟的传输。在FIBRE注册过的矿工能够链接到离本身最近的FIBRE节点,以最短的时间得到新的区块数据。FIBRE和比特币P2P网络传输协议的一系列优化使得比特币的新区块几乎能够在瞬间被全世界的矿工接收,很是有效的下降了孤块率,保证了网络安全。

FIBRE是由Matt Corallo维护的一个须要注册使用的网络,所以是一个中心化管理的系统。这也是FIBRE常为人所诟病的地方。可是若是咱们按照图3的拓扑来分析,就会发现FIBRE的中心化对比特币网络并无负面影响:不管矿工是用中心化仍是去中心化的网络加速新区块的传播,这个行为都不会影响全节点对新区块的验证。FIBRE也不是整个网络的单点,若是FIBRE崩溃或者做恶,矿工随时能够切换回比特币本身的P2P网络。

思考题:一样的出块节点间专用加速网络,若是用于提高网络吞吐量解决scalability问题,上述结论依然成立吗?

clipboard.png

EOS

EOS的目标是百万级的TPS,为了实现这个目标,EOS使用投票的方式由全网选出21个出块节点(以及必定数量的候选节点),并要求出块节点使用最好的硬件来支撑高性能。EOS是否真的实现了百万级TPS并不重要,重要的是,经过这种方式来提高性能不只仅要求出块节点付出不菲的成本,也要求全节点付出一样的成本。然而与出块节点不一样,EOS网络中的全节点并无获得网络的补贴,所以用户很难有足够的动力真的去支付几乎与出块节点相同的成本去运行一个全节点。在这种状况下,网络最终会演化成一个没有全节点的结构:

clipboard.png

ByteMaster对21个节点合理性的论证是,比特币的算力也是集中在<10个矿池手中,21个节点其实比10个矿池更加去中心化。咱们经过比较网络拓扑应该容易看出,这个辩护并不成立,由于二者的网络结构有很大区别,没法这样直接比较。在EOS网络中,因为去中心化全节点网络的缺失,出块节点缺少监督,用户只能彻底相信出块节点不会做恶。出块和验证的工做最终都集中到出块节点的角色上,出块节点既是运动员,又是裁判。而在比特币的网络中,大量的全节点承担了裁判的角色,矿池仅仅是运动员。用户能够相信大量的全节点,不须要相信矿池。

须要指出的是,这个问题实际上不只仅是EOS的问题,也是其余要在Layer 1扩容的项目会遇到的问题。

对CKB的启示

出块节点,全节点,轻节点造成了一个动态的网络,网络中的各种角色均可以自由进出(额,出块节点实际上在不少区块链中没法自由进出,这个也不展开了,之后有时间再写文章讨论…),这些角色造成的拓扑结构(例如节点比例、谁和谁链接等等等等)决定了网络的性质,包括性能、安全、中心化程度等各个方面。不一样的设计可能会致使网络最终造成不一样的结构,而这个最终结构所展示的性质有可能和设计初衷是相违背的。

全节点为了可以不信任任何第三方,选择自行验证全部交易历史。这种作法使全节点不只仅知足了本身的需求,也为网络安全贡献了力量,体现出一种正外部性。区块链须要这种安全保证,所以全节点对于一个去中心化的网络相当重要。如何内部化这种正外部性是一个须要重视的课题,在这个课题尚未解决的状况下,咱们能作的只能是保证全节点能够运行在一个较低的成本,以促进网络保有尽量多的全节点。

对于但愿成为将来加密经济的基础设施的Nervos CKB来讲,必须在设计之初就把这些因素考虑在内,以理想中的网络结构为目标,并经过经济激励和其余机制设计来实现。这并非一件容易的事情,还须要大量的研究和探索。

相关文章
相关标签/搜索