来源 | ethos.dev
作者 | JosephC
还记得你刚窥探到区块链的奥秘时那份喜悦吗?
你对信标链有同样的求知欲吗?
信标链是以太坊2.0系统的核心,然而针对该系统的大部分描述都过于技术化、针对性过强或者不够深入。但是从这篇文章中,读者可以充分了解到信标链中的各个元素和运行机制。为了使读者在理解信标链时事半功倍,文章将通过一些例子,用通俗的语言解释其中的关键细节。
阅读本文之前,我们假设读者对以太坊和比特币有不错的基础知识,并对权益证明 (Proof of Stake) 这一共识机制有一定了解。
现在进入正题,让我们一起深入探讨信标链的各个部分,诸如分片(shards)、质押验证者 (staking validators)、证明 (attestations)、委员会 (committees)、检验点 (checkpoints) 和最终确定性 (finality)。
分片:未来蓝图
要想进入信标链的世界,首先我们需要打开分片的大门。在扩容性方面,包括以太坊在内的区块链现在面临的主要问题是:每个节点必须验证和执行每一笔交易。
在计算机科学中,主要有两种扩容方式: A.纵向扩容:即增强节点能力 B.横向扩容:即增加节点数量
为了保证去中心化,区块链需要采取横向扩容方式。以太坊2.0 (也即Eth2或Serenity) 其中一个目标就是让节点可以在消费级硬件中运行。总体来说,Eth2采用的分片机制指的就是对数据库进行横向分割。
总的来说,每条分片链都拥有一个节点子集,在该链上进行工作。虚拟矿工和验证者被分配到不同的分片中,并且只处理和验证自己所在分片链上的交易。
以太坊分片上的节点子集是动态的,按照区块顺序处理分片。
区块链实行分片机制的主要挑战在于如何确保分片安全性。由于验证者分散在不同的分片中,有的节点可能会恶意控制某个分片。
解决该问题的关键在于:
随机分配 (shuffling) 验证者,每个分片区块都有一个委员会,其中的验证者都经由随机挑选。这种做法的目的是,经数学计算,如果攻击者控制的验证者少于总数的三分之一,其想要攻击单个分片是难以实现的。
此外,错误性证明(fraud proofs)、数据托管证明 (custody proofs) 和数据可用性检查 (data availability checks) 都是确保安全的重要因素,不过需要单独的讲解才能说清楚。
Eth2 目前的计划是启用64个分片。尽管分片和信标链是独立运作的,我们还是会针对整个系统的关键部分进行阐述。
分片向我们揭示了以太坊信标链能做什么,需要什么。我们也能从中了解到为什么在传统的区块链基础上需要增添这些新元素。分片式区块链作为一片新大陆,始终等待着创新者的开垦。
以太坊2.0的各个阶段
简单来说,以太坊2.0有三个阶段: Phase 0 – 信标链 Phase 1 – 分片 Phase 2 – 执行
可以和人体进行类比: Phase 0 – 心脏 Phase 1 – 四肢 Phase 2 – 大脑
也可以和一支强大的管弦乐队进行类比: Phase 0 – 指挥 Phase 1 – 乐器 Phase 2 – 乐手
每个阶段都是系统里的重要组成部分,有着不同的特性。阶段0是以太坊2020年的目标之一。与其他阶段相比,阶段1要更加稳定,而阶段2侧重于执行与代理。
时隙 (slots) 和时段 (epochs)
信标链是以太坊2.0的心脏,它令以太坊系统在和谐与共识中有序运行。每个slot为12秒,每个epoch由32个slots组成,即6.4分钟。
在每个slot中,在信标链和分片中都可能新增一个区块。我们可以想象,信标链和分片链有序且紧密地排列在一起,**当系统在理想情况下运转时,每12秒就有一个信标(链)区块和64个分片区块产生。**验证者大致按照这个时间同步。
我们可以将一个slot看作是区块生成时间,不同的是slots内可以没有区块。信标链和分片的创世区块都在Slot 0中产生。分片将在信标链epoch 0的下一个epoch中开始运作,但无论是分片链还是信标链,都有自己的epoch 0,且包含其创世区块。
验证者 (validators)、证明 (attestations) 和信标链
工作量证明(PoW)与矿工密不可分,而在以太坊2.0中,验证者 (validators) 便是权益证明 (PoS) 共识机制中的“虚拟矿工”。验证者这一概念在Eth2共识协议中应用率极高。相关激励机制稍后将在“信标链验证者奖惩制度”这一部分加以讨论。
区块提议者(block proposer)是被(伪)随机挑选出来生产区块的验证者。
大多数时候,验证者则充当证明人(attesters)的角色,对信标区块和分片区块进行投票。这些投票会记录在信标链上,用以决定信标链和分片链的头部 (heads)。
(随机验证者在每个slot中提议一个区块, 如果其他验证者投票赞成该区块,那么提议验证者将会获得奖励)
在每一个epoch中,一个验证者被(伪)随机分配到一个slot和分片中。该验证者参与到他所被分配的分片的共识中,从而他可以对该分片的分片头进行投票。然后验证者将该slot上的分片头和信标区块连接起来。
一份证明(attestation)则是验证者的一记投票,投票通过验证者的余额进行加权。除区块之外,证明也会由验证者在系统中进行广播。 验证者之间也会互相监督,通过举报其他验证者自相矛盾的投票或提议多个区块的行为,从而获得奖励。
信标链里主要记录了验证者的地址、每个验证者的状态、证明和分片的链接。验证者需经由信标链激活,也可以转变在线状态,稍后在“信标链验证者激活和生命周期”中有简单的介绍。
质押验证者:含义
验证者是虚拟的,并由质押者激活。在工作量证明 (PoW) 共识机制中,成为矿工需要购买挖矿硬件。而在以太坊2.0阶段,用户通过质押ETH来激活和管理验证者。
为了更清楚地理解质押验证者的含义,我们可以将质押者(stakers)和质押金 (stake),验证者 (validators) 和余额 (balance) 联系起来。每个验证者拥有的余额最多为32个ETH,不过,质押者可以质押他们所有的ETH。每质押32个ETH,一个验证者就会被激活。
验证者通过验证者客户端进行工作,而客户端借助信标(链)节点来运行。每个信标节点都有跟踪和读取信标链的功能。而每个验证客户端都可以执行信标节点的功能,或者调用信标节点。一个客户端允许一个或以上验证者执行验证职能。
交联 (crosslinks):分片扎根信标链
交联是指将一个信标区块和一个分片区块连接起来,在一个交联中,信标链紧跟分片链头。由于一个信标区块中有64个分片,因此至多可以容纳64个交联。如果在某个slot中,没有验证者为其他63个分片提议区块的话,在这个信标区块上可能只有一个交联。交联计划于eth2的阶段1实现,为的是将分片扎根在信标链中,为分片分叉选择、分片链最终确定性和跨分片通信打好基础。所有分片链全程都与信标链紧密相连。
委员会 (committees):介绍
一个委员会由一组验证者组成。为加强安全保障,每个slot(在信标链和每个分片里)的委员会至少由128位验证者组成。而一个恶意攻击者能够控制2/3委员会成员的可能性低于万亿分之一。
以太坊信标链这一名词,来源于随机信标(randomness beacon, 向公众提供随机数字)这一概念。信标链在一个伪随机的过程(RANDAO)中执行共识。
RANDAO根据验证者余额的权重,选择出区块提议者。在同一个slot中,一个验证者可以同时是区块提议者和委员会成员,但这并不是常态。出现这种情况的概率为1/32,因此我们大概会在每个epoch碰到一次。上图情景中的验证者不到8192个,不然每个slot就得至少包含两个委员会。
关于委员会,本文重点讲解信标链委员会:为信标链服务的验证者。一个(信标链)委员会将会被伪随机分配到一个分片上,将其交联到信标区块中。委员会成员不是固定不变的,负责交联的委员会都是逐块更替的。
分片委员会仅进行生产分片区块的工作,此话题留待日后讨论。
许多分片区块由分片链验证者生产,且不需要与信标链联系。然而,如果某个分片想要和其他分片通信,则需要借助信标委员会将其与信标区块进行交联。
上图综合描述了三个slot中发生的情况。在slot1中,有验证者提议出一个区块,该区块得到两个验证者的证明;而委员会A里的一个验证者离线了。Slot 1中的证明和区块被广播到网络上,许多验证者也收到了该信息。在slot 2中,又一个区块被提议出来,而委员会B的一个验证者错过了该信息,于是该验证者认为信标链头是slot 1中的区块。请注意,这个验证者跟slot 1的离线验证者有所不同。投票证明信标链头的这个过程被称为”LMD GHOST 投票”。在slot 3中,委员会C上所有的验证者都遵循LMD GHOST分叉选择规则,并独立地投票选出同一个信标头。
一名验证者在每个epoch中只参与一个委员会。一般来说,系统中的验证者会超过8192个,所以每个slot中会有一个以上委员会。所有委员会的规模都一样大,至少由128个验证者组成。当系统中的验证者少于4096个时,安全性就会打折扣,因为这意味着单个委员会的验证者将少于128个。
委员会 (committees):关键
在每个epoch中,验证者们被均匀地分配到各个slot中,然后进一步分配到规模相当的各委员会中。所有验证者都要在自己所在的slot中投票选出信标链头。每个委员会都要在自己所在的slot中尝试交联某个特定的分片。混洗 (shuffling) 算法会适时调整每个slot中委员会的数量,以保证每个委员会都至少有128名验证者。
举个例子,假定有16384名验证者,其中512名验证者被伪随机分配到slot 1中,另外512名被分配到slot 2中,以此类推。Slot 1中的512名验证者被进一步分成4个委员会,并被伪随机分配到分片中。
假设分片33、55、22、11是这四个委员会所分配到的分片。所有512名验证者都要在slot 1中发起LMD GHOST投票;其中一个委员会的 128 名验证者试图和分片33产生交联;另一个委员会的128名验证者试图与分片55产生交联;剩余两个委员会则试图与分片22和分片11产生交联。
在slot 2中,这个过程会重复一遍,512名验证者同样分成4个委员会,然后被伪随机分配到分片中。假定他们被分配到分片41、20、17、15中。所有的 512名验证者都要在slot 2中投票选出信标链头;同时这几个委员会也试图与分片41、20、17、15产生交联。
这个过程也会在该epoch剩下的slot中再三重复。每个验证者在自己所处的slot中,可以进行投票、证明以及交联。在该epoch结束之后,所有16384名验证者都已发出过投票并且和分片进行过交联。
但是,前面所提到的验证者投票都是针对slot的,而并非针对epoch。打个比方,其区别类似在地方选举和全国大选中进行投票。到目前为止,全体验证者还并未就同一个事物进行投票。
以下部分将进一步阐释检查点 (checkpoints) 和最终确定性 (finality),描述了各验证者处于分配的slot时,针对epoch发起的投票。也就是说,全体验证者在自己所处的slot中,还要为epoch的检查点投票。
信标链检查点 Beacon Chain Checkpoints
检查点 (checkpoints) 就是位于epoch第一个slot里的区块,如果这个slot内没有产生区块,则最近的前一个区块即为检查点。每个epoch都会有一个检查点区块;一个区块可能同时是多个epoch的检查点。
值得注意的是,从slot 65 到slot 128 之间是没有区块的。Epoch 2 的检查点本来应该是位于slot 128 处产生的区块,但因为该slot丢失了,所以epoch 2 的检查点还是slot 64 处产生的区块。Epoch 3 同理,slot 192 处是空块,因此epoch 3的检查点为slot 180处产生的区块。
时段边界区块 (epoch boundary block, EBB) 是一些文献 (比如 Gasper 论文,也是上图的来源) 中用到的术语,可以理解为“检查点”(checkpoint) 的同义词。
在发起一次LMD GHOST投票时,验证者也要为最近一个epoch的检查点投票,该检查点叫做 “目标检查点” ( target) 。该投票叫做Casper FFG投票,而且还包括对前一个检查点的投票,叫做“来源检查点“ (source)。
上图中,epoch 1中的一个验证者进行投票,将创世区块选为来源检查点,然后推举slot 64 处产生的区块为目标检查点。在epoch 2中,同一个验证者又为相同的检查点投票了。验证者只需为自己所分配到的slot发起LMD GHOST投票,但是每一个epoch上的所有验证者都要为epoch的检查点发起FFG投票。
绝对多数 supermajority
绝对多数(supermajority)是指某个投票获得了所有活跃验证者总余额2/3的支持。 简单来说,假设有 3 个活跃验证者,其中两个的余额是8 ETH,另一个验证者的余额为32 ETH。那么,那个拥有最多余额的验证者所进行的投票才是绝对多数;尽管另外两个验证者的投票可能不一样,但是他们的余额不足以形成绝对多数。
最终确定性 Finality
当一个epoch结束之后,如果其检查点得到了2/3余额票数,也就是形成了绝对多数,那么该检查点就被证明 (justified) 了。
如果检查点B已经被证明,且其下一个epoch的检查点也被证明了,那么B就被最终确定了 (finalized)。一般来说,一个检查点会在两个epoch内得以最终确定,即12.8分钟。
通常来说,用户交易发生在一个epoch的中间部分;那么距下一个检查点就还有半个epoch的时间,也就是说,一笔交易经过2.5 个epoch(16 分钟)便可得以最终确定 (finality)。在理想情况下,超过2/3的证明 (attestations) 将会被打包进某个epoch的第22个slot中。因此,交易得以最终确定的平均时长为14分钟(16+32+22个slot)。区块确认过程则经由区块证明 (attestations),到被证明 (justification),再到最终确定 (finality)。用户可以自己决定是否等到交易最终确定,还是说稍低一点的安全性也足够了。
为简要叙述,下文将假设所有验证者的余额相同。
信标链头发生了什么
在slot 96处,一个时段边界区块 (EBB) 被提议,且该区块还包含了对epoch 2中检查点的证明。Epoch 2检查点的证明投票现达到了2/3的绝对多数,意味着epoch 2的检查点被证明了。因此,上一个被证明的检查点,即epoch 1检查点,也获得了最终确定性。Slot 32处的区块一旦被最终确定,此前所有区块都会被最终确定。
在对检查点进行最终确定时,对同时可以得到最终确定的区块在数量上并没有限制。所以,虽然最终确定性仅在epoch边界的时候产生,但证明 (attestations) 是逐块累加的,下文的“从创世区块到区块链头会发生什么”提供了另一种解释。
从slot 1到slot 32的信标链区块所包含的所有交联,也会使分片链获得最终确定性。换句话说,当一个信标区块被最终确定时,与该块所交联的分片区块也能被最终确定。交联本身不足以使一个分片区块被最终确定,但是对分片链的分叉选择有所帮助。
从创世区块到区块链头会发生什么
采取同样的办法,我们可以观察到从创世区块开始的一条故事线:
从slot 1到slot 36,所有的提议者都提议了一个区块,且所有区块都被添加到链上。对于epoch 1的所有区块来说,其检查点 (slot 32 处的区块) 累积了55%的验证者证明。验证者在slot 64处提议区块时,同时也对epoch 1处的检查点发起投票。现在,有70%的验证者都证明了epoch 1的检查点,因此epoch 1检查点被证明 (justified)。Epoch 2结束后,epoch 2 的检查点 (slot 64处的区块) 累积了投票证明但还达不到2/3的多数要求。验证者在Slot 96处提议区块时,同时也对epoch 2处的检查点发起投票,所以这时候,epoch 2 检查点的投票达到了2/3的多数要求,也就是被证明了(justification)。Epoch 2的检查点被证明的同时,epoch 1的检查点以及所有此前的区块被最终确定了。
还有一种可能性,我们只考虑到epoch1。Epoch 2的检查点被提议出来之前,epoch 1的检查点可能已经获得了绝对多数投票。
譬如说,当slot 32和slot 54的区块被提议出来时,slot 32的检查点的证明投票可能已经达到多数要求了。因而在这种情况下,检查点可能在epoch 2之前就已经被证明了。最后一点,检查点可以在离其最近的epoch中被证明,但是至少隔一个epoch才能被最终确认。
有时,一个区块被证明意味着两个甚至多个epoch以前的区块被最终确定。Gasper论文里讨论了这种情况,只有在网络高延迟、网络隔离或遭遇强大攻击等个别情况下,才会出现这种状况。
最终确定性对于分片及以太坊区块上的用户来说是无比重要的,保证用户们的交易安全进行,不被纂改,并且降低了跨分片通信的复杂性。如果没有最终确定性,分片内部和分片之间的交易回滚会具有破坏性,或让分片的利好不复存在。
更加深入地了解证明 (attestations)
一则证明包含一个LMD GHOST投票和一个FFG投票。理想情况下,每个epoch中所有验证者提交一份证明。每一个证明有32个slot的机会被打包进链,这意味着在单个epoch,一名验证者可能有两份证明被打包上链。
如果验证者在其所分配的slot里发送证明,且该证明被打包上链,那么验证者获得的奖励为最大值;随后打包上链所获得的奖励就会不断减少。为了留给验证者准备的时间,他们被提前一个epoch分配到委员会中。一旦epoch开始,提议者只会被分配到各slot中。尽管如此,秘密领导人选举旨在降低攻击和贿赂提议者的风险。
委员会使得联合签名的技术达到最优化状态,将每一名证明者的签名聚合成一个签名。当验证者在同一个委员会中,并做出了同样的LMD GHOST和FFG投票时,他们的签名就可以被聚合。
信标链验证者奖惩机制
- 证明者奖励(attester rewards)
- 证明者惩罚(attester penalties)
- 质押者特有风险(typical downside risk for stakers)
- 罚没和吹哨者奖励(slashings and whistleblower rewards)
- 提议者奖励(proposer rewards)
- “不作为”惩罚(inactivity penalty)
当验证者所给出的证明 (LMD GHOST或FFG投票) 为其他大部分验证者所同意时,会获得奖励。在eth2的阶段1中,验证者也可以通过与分片产生交联而获取奖励。当区块被最终确定,奖励也随之确定。
相反,如果验证者没有提交证明,或者其投票选出的区块最终没有被确定,那么验证者就会受到惩罚。
在描述相对来说不那么常见的奖惩制度之前,你可能想知道成为一名质押者所面临的风险。作为一名质押者,损失ETH的风险与回报并存。如果一名验证者在一年中能赚取10%的报酬,那么一名工作表现差强人意的 (诚实) 验证者则面临10%的损失。比如说,一名验证者总是不在线,或者其投票的区块总是无法被最终确定,他将会受到惩罚,而罚款数额等于一名验证者投出有效区块所获得的奖励数额。
罚没的数额最少为0.5个ETH,最多则是一名验证者的所有质押金额。一名验证者如果受到了罚没 (slashing) 惩罚,其将至少损失余额的1/32,且会被停止继续参与工作。该名验证者所受惩罚的程度,与连续8192个epoch都离线的验证者所受的惩罚相当。基于同时受到罚没惩罚的验证者的数量,协议还会对验证者做出额外的惩罚。施以额外惩罚的基本公式是:“validator_balance3fraction_of_validators_slashed”。也就是说,如果1/3的验证者同时受到了罚没,他们会损失所有余额。而对罚没行为举报成功的验证者,则可以获取吹哨者奖励。
区块一旦得以最终确定,区块提议者便可以获得相当可观的奖励。一直在线且妥善完成工作的验证者,他们提议区块所能获得的奖励将提高1/8。如果发生罚没行为,提议者还可以将罚没证据打包进区块,从而获得少量报酬。在eth2阶段0,所有吹哨者的奖励实际上都归于提议者。
以太坊2.0这个系统里有许多机制,通过了解其作用,便可以更好地了解这些机制。这套奖惩制度里,最后一项便是“不作为”惩罚。
简单来说,如果有超过4个epoch没有获得最终确定性那么所有验证者都要受到翻倍的“不作为”惩罚,直到下一个检查点被最终确定。“不作为”惩罚的作用在于:如果50%的验证者掉线了,在21天后会再次重新对区块进行最终确定。
罚没 Slashing
如果出现以下这三种情况,要对验证者进行罚没惩罚:双重提议、FFG双重投票和FFG环绕投票。LMD GHOST投票不会受到罚没惩罚。
双重提议 (double proposal) 指一名区块提议者在他所分配到的slot里提议一个以上的区块。
双重投票 (double vote) 指一名验证者针对同一个目标检查点 (target),不同的源检查点 (source) 发起的两次FFG投票。
环绕投票 (surround vote) 指一名验证者发起的FFG投票环绕之前的FFG投票,或是被之前的FFG投票所环绕。
下面有两个例子,背景是一名验证者在epoch 5内,为slot 32处的源检查点和slot 128处的目标检查点发起了一次FFG投票:
- 在epoch 6内,为slot 64处的源检查点和slot 96处的目标检查点发起的FFG投票,被其在epoch 5中的投票环绕。
- 在epoch 6内,为slot 0处的源检查点和slot 160处的目标检查点发起的FFG投票,则环绕了其在epoch 5中的FFG投票。
在epoch 6内,针对slot 128目标检查点的FFG投票是双重投票,除非slot 32为源检查点,否则要受到罚没。相同的FFG投票不会遭到罚没。
针对同一个源检查点的两次FFG投票,不用受到罚没。这对系统的活性很重要。比如说,如果有两个分叉,每个分叉占有验证者50%的余额,那么协议需要鼓励 (而非惩罚) 验证者通过对同一个源检查点和一个不同的目标检查点发起投票,从而在分叉间转换。验证者可以在分叉之间安全地来回转换,并尝试达到2/3的绝对多数,以避免陷入僵局。
一名吹哨验证者提出举报时,需要打包冲突投票的相关信息来证明该验证者应受到罚没。要在一个庞大的记录系统里,有效地找出冲突投票,是对算法和数据结构的一项巨大挑战。“罚没检测工程挑战”正在寻求参与者。
验证者完全有能力使自己避免被罚没:只需要记住其对哪些证明和提议进行了签名。一名诚实的验证者不会因为其他验证者的行为而受到罚没。只要验证者没有对冲突的证明或提议进行投票,就不会受到罚没。
一个验证者客户端可以运行多个信标节点,从而延长系统的正常运行时间、增强信任和DoS攻击抵御。在运行节点或是运行备份验证者客户端时,用户需要注意,验证者有无对冲突的信息进行签名。
信标链验证者激活和生命周期
每一位验证者需要32个ETH才能激活。一个用户在以太坊主网的存款合约 (deposit contract) 里质押32个ETH,就会激活一位验证者。
当验证者的余额低于16个ETH时,信标链就会停止这些验证者的工作。质押者可以将剩余的验证者余额提出来,但目前无法在eth2的阶段中实现。
在2048个epoch,将近9天时间的工作之后,验证者还可以自愿选择退出。退出时,质押者需要等待4个epoch才能撤出其质押金在这4个epoch之内,验证者仍然有可能面临举报和罚没。一名诚实验证者大概27小时之后便可以提出其余额。然而,如果一名验证者受到了罚没惩罚,则必须等8192个epoch (大约36天) 之后才能够提出余额。
“以太坊2.0阶段0验证者生命周期”中有更详细的技术说明,内含以下示意图:
为了避免短时间内对验证者造成巨大的变动,存在一些机制对单位epoch上验证者激活和退出的数量进行限制。其作用之一在于使得很难在短时间内激活大量验证者对系统进行攻击。
信标链深度应用了有效余额 (effective balances) 的概念,这就使得验证者的余额变动范围更加小,以达到技术的最优化。
总结
在每个epoch,验证者们被均匀地分配到各个slot中,然后进一步分配到规模相当的各委员会中。各个验证者同时只能位于一个slot和一个委员会中。
总结几点:
- 同一个epoch里的所有验证者尝试最终确定同一个检查点:这是FFG投票;
- 所有验证者被分配到一个slot中,尝试投票选出同一个信标链头:这是LMD GHOST投票;
- 所有验证者被分配到一个委员会中,尝试交联某个分片。
采取最优行为的验证者获得的奖励最多。
激活信标链至少需要16,384个创世验证者。验证者的数量可能会因为罚没或者自动退出而减少,也会随质押者的激活而增加。当系统升级到eth2阶段1或以上时,将需要更多的验证者工作。信标链需要至少262,144个验证者 (质押金额将超过800万ETH) 来生产区块,每个区块包含64条交联。
历史上从来没有过为去中心化系统和应用搭建的扩容平台。如果你受到了启发,想要更深入地参与,“ETH2.0规范”里有权威的参考。其中包含信标链规范,还有其他关键资源以及赏金的相关问题。
目前来说,点对点网络层最亟待完善。来和我们一起参与这项挑战吧!更多技术细节请访问ethresear.ch或者Ethereum Magician’s forum,和我们一起创造历史吧!
感谢 Danny Ryan 对多个部分的审校和反馈,感谢 Momo Araki 的图表以及提供咨询的各位。标题图由 Hsiao-Wei Wang 的原作修改而来。如果读者朋友觉得本文对你有所帮助,请不吝分享!🙂
声明:ECN的翻译工作旨在为中国以太坊社区传递优质资讯和学习资源,文章版权归原作者所有,转载须注明原文出处以及ethereum.cn,若需长期转载,请联系ethereumcn@gmail.com进行授权。