以太坊区块链的轻客户端

大量基于区块链和点对点协议的项目如雨后春笋般出现,对网络性能和吞吐量提出了很高的要求。许多这样的项目都还处在研究&开发阶段,很多人没有意识到底层协议上线时会面临的适用性挑战。

网络拓扑

我们通常简单假设,大多数网络运行者的响应延时和计算能力落在某个置信区间;但我们常会忘记,用户必须与区块链节点进行交互时所遇到的阻碍。不幸的是,多数情况下运行全节点是极其昂贵和迟缓的,所以大部分用户会选择“轻”节点——这些节点依托全节点保证安全性,同时无需投入大量的资源。

以太坊轻节点客户端允许轻量级的设备(如树莓派)加入网络,下载区块头,并根据使用者需求

对特定状态进行验证。这样的轻节点在以太坊网络中特别常见,以至于树莓派在弹指间即可连上全节点。

以太坊区块链的轻客户端_第1张图片

-树莓派设备——你可以在其上部署轻客户端!-

对运行全节点而言,加密经济学提供的激励无法和资源成本消耗达成平衡,这为分布式网络带来性能瓶颈;我们很难精确评估在自然状态下,全节点和轻节点的平衡。以下有一些关于激励平衡的讨论,方便使用者评估运行全节点的合理性。

运行全节点的经济激励 (编者注:中译本见文末超链接)

轻客户端介绍:以太坊中的关键角色

轻客户端的核心思想是:它能够取得使用者关注的部分状态。这里假设矿工正确遵守以太坊区块链规则,并且全网中至少有一个诚实的全节点。

以太坊区块链的轻客户端_第2张图片

-同步模式( SyncMode )设置为“Light”的 Geth 客户端-

轻客户端的基本功能是,每当有区块出现在网络便下载区块头,并发送客户端需要的特定状态的默克尔证明(Merkle proofs)请求。以太坊轻客户端使用分布式哈希表来追踪前缀节点 (trie nodes),而不是使用本地存储。

因为以太坊状态是通过庞大的默克尔树体现,我们可以很容易的从默克尔树的根节点,沿着树分支校验特定资讯的完整性,从而完成轻量级的验证。这只依赖于此过程提供的默克尔根节点是证券。

轻客户端的消息包括但不限于:检查账户余额,校验交易被确认数,检查部署在网络的某个合约日志,等等。

以太坊区块链的轻客户端_第3张图片

通过默克尔验证,以上确认的复杂度都可以降到次线性(sublinear)级别。当区块链的数据不可用,或是验证交易索引状态时无法检出,客户端都能向点对点网络的其他参与者发出警告。

Geth 客户端专为轻模式设计了一种完全不同的配置和协议管理器。想要了解更多关于 Geth 转换成轻客户端的细节,可以参考以下问题:

探索当前客户端协议架构 · Issue #122

底层共识机制

目前的轻客户端,采用全节点在主链运行的工作量证明(proof of work)共识。在 PoW 共识中,存在这么一种函数,使得我们能够验证区块头的有效性。也就是说,通过计算这个算法来输出同样的区块头非常困难,相对的要进行验证却很容易。

轻客户端一旦连上网络,会立刻寻找最长链的区块头;对于攻击者来说,要生成假的区块头来欺骗区块链网络,从成本考虑是得不偿失的。虽然验证区块头非常高效,但通过PoW,仍然需要进行底层的物理工作转移——贡献电力来换取区块链的安全。

以太坊区块链的轻客户端_第4张图片

-图片来源:Software Engineering Daily-

轻客户端在 PoW 共识下十分有用,因为区块头能够持续不断的被验证;但在权益证明(Proof of Stake)共识下就无法得到保证。

PoS 共识下的轻客户端:PoW共识是必要的吗?

把轻客户端在 PoS 共识下的问题简化来看,就是区块头没有和特定数量的“真实”工作量因子相关联,也就无法化简。换言之, PoS 共识的约束力来自对拜占庭问题节点的惩罚,而不是对消耗电力计算 NP 问题的奖励。在 PoS 共识下,试图生成错误区块的节点会被惩罚,而在 PoW 共识下,生成错误区块的节点会造成区块链分叉,进而无法拿到有效共识链上的奖励。

PoS 提供一种协议内的机制,用来确定最新的区块头。一旦这些区块头被确定下来,访问他们包含的数据成为对数级别复杂度的问题(比如,访问默克尔树节点);除此之外,这里的区块头不包含我们在 PoW 协议下用来验证的标量。这些因素使得验证行为至少是对数复杂,并且从部署开始就有固定的时效性。

不过,至少我们能够在轻客户端的同步效率上做得更好。Vitalik 在他的推文中对这件事发表了看法——通过检查点(checkpoint)系统,可以构建出对轻客户端更加友好的 PoS 共识体系。

我们将某一定量的区块指定为检查点(checkpoint),这需要拥有超过 2/3 的参与者的数字签名同意,而且每个检查点需要包含前一个检查点的哈希值。新模式下的轻客户端在同步时,只有检查点区块头会被下载,而客户端可以验证这些检查点参与者的签名。这避免了当前 PoW 模式下每次轻客户端同步,都需要下载所有区块头的弊端。

然而这么做,并没有解决验证区块头的问题;所以为了达到创建轻客户端的目的,不排除在 PoS 协议下对区块头进行小范围 PoW 验证。

混合 PoW/PoS 系统能否为轻客户端提供助力?

只要验证区块头的算力需求很小,这种混合协议绝对能成为轻客户端验证的重要手段——也就是在 PoS 系统中,产生区块头时使用算力进行验证。

如果你对此感兴趣,可以了解以太坊社区在分片功能上做的研究工作。其中也包含我们团队, Prysmatic Labs !分片模型中,轻客户端在解放节点算力需求的任务上,扮演者令人难以置信的重要角色。大多数分片模型开发者会从此处开始他们的以太坊探索之旅:

无状态客户端的概念

参考

https://github.com/ethereum/wiki/wiki/Light-client-protocol

https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding

https://github.com/zsfelfoldi/go-ethereum/wiki/Light-Ethereum-Subprotocol-%28LES%29

https://etherworld.co/2018/03/13/understanding-ethereum-light-node/


链接: https://medium.com/zkcapital/a-primer-on-ethereum-blockchain-light-clients-f3cadde49137

你可能感兴趣的:(区块链,以太坊)