以太坊 2.0作为世界**的公链项目,完全颠覆了以前的设计,旨在同时实现去中心化和扩展的目标。与以太坊 1.0的区别在于, 以太坊 2.0使用PoS(兴趣证明)算法来促进运行区块链,并通过“信标链+乘链”架构提高可伸缩性。
以太坊 2.0具有悠久的研发和部署计划的历史。在所有客户都成功实现了规范0.12.1的最终版本之后,将在6月底启动多客户端测试网,并在7月启动最终的公共测试网。此后,如果公共多客户端测试网的最终版本可以稳定运行两到三个月,则可以开始准备以太坊 2.0的发布。如果一切顺利,第0阶段将在11月上线。但是,如果仍然需要修订版本规范,并且所有客户端都需要再次实施新规范,则启动时间可能会推迟到2021年。
本文将向读者展示HashQuark研究团队从以太坊开始的2.0技术级别,详细解答了给出的最核心技术人员护理的四个问题。
如何成为验证者?
以太坊使用合约存款(deposit contract)作为以太坊 1.0与以太坊之间的桥梁,当用户32被存储在合约存款ETH之后,它可以用作以太坊参与验证者2.0,并获得以太坊 2.0奖励。
以pry官方网站教程为例,加入测试网络以直观地感受到如何成为验证者。
准备好工作了
pry的实现主要包括两个部分:信标链客户端和验证者客户端。前者负责信标链的状态管理,后者负责块生成和验证程序验证。为了简化此过程,pry提供了一个简单的脚本pry.sh进行下载和安装:
mkdir pry AMPLAMPL cd pry curlhttps://raw.githubusERContent.com/pryaticlabs/pry/master/pry.sh--outputpry.shAMPLAMPLchmod+xpry.sh
(向左滑动即可查看完整的代码)
上面的命令将在当前目录中创建一个新的pry文件夹,并下载可执行文件pry.sh。
此外,我们需要至少32 ETH 以太坊帐户和浏览器插件元掩码来发送交易。您可以在测试网站上申请一些测试币,如下图所示:
创建验证者密钥对
验证者需要创建两个密钥对,验证者使用一对来生成区块和见证人,另一对用于管理合同中存放的资金。运行以下命令来创建密钥:
./pry.sh验证者帐户创建
默认情况下,该命令将在〜/中创建两个密钥库格式的文件。 ETH 2alidators /目录,如下图所示:
前者用于资金管理,后者用于大宗生产。
创建密钥的命令将在终端中输出存款数据:
这是根据上述密钥对生成的交易信息,我们将其**到网页上的交易数据部分:
起始节点
使用以下命令在两个终端上启动信标链节点和验证者节点:
./pry.shbeacon-chain./pry.shalidator
发送存款交易
通过网页调用metamask填写上述存款数据,方便用户直接发送存款交易。
单击图片中的按钮,metamask将弹出一个确认对话框:
可以看出,总共32 ETH已发送到存款合同,并且交易的数据部分是我们**的存款数据。单击确认发送交易。成功发送后,请等待4-5个小时以成功激活验证器。
用代码解释成为验证者的过程
创建验证器的主要过程是创建密钥对,生成数据以调用合同,合同执行以及信标链处理。
创建密钥对
创建验证者密钥对时,通常需要两对密钥(使用BLS12-381曲线):验证者密钥对(验证者PubKey,验证者私钥)和入金提取密钥对(Withdrawal PubKey,Withdrawal PriateKey)。
生成数据调用合同
除了通常的合同地址和金额参数外,调用合同还需要构造要调用的合同方法的参数:pubkey(验证者公钥),drawing_credentials(以提取存款许可信息),签名(签名)和deposit_data_root(防止篡改徽标)。用户生成两对密钥后,他们可以生成上述参数以构造要发送的交易数据,请参见下图:
看得到:
pubkey是验证者PubKey,它也是创建的证明者的公钥标识符。
drawing_crendentials由具有固定前缀拼接的哈希组成Withdrawal PubKey(sha256)
金额是此合同中发送的金额,至少1 ETH
signature是使用Validator PriateKey的HashTreeRoot结果的签名,该签名是pubkey,drawing_credentials,金额的
deposit_data_root是前四个参数的哈希值(HashTreeRoot)
生成上述参数后,将根据合同界面将其编码为某种格式,然后发送到存款合同以完成通话。
合同执行
合同的主要方法存款定义了收到存款交易时如何处理。存款交易就是调用此方法来实现存款。
存款方法接受pubkey(验证者公用密钥),drawing_credentials(以提取存款许可信息),签名(签名)和deposit_data_root(以防止篡改身份)作为参数。它主要分为几个部分:参数基本验证,触发存款事件,验证数据完整性和更新数据结构,如以下代码所示:
@publicDeFideposit(pubkey:bytes [PUBKEY_LENGTH],withdrawal_credentials:bytes [WITHDRAWAL_CREDENTIALS_LENGTH],signature:bytes [SIGNATURE_LENGTH],deposit_data_root:bytes32):############# 1。参数验证# ############ A避免溢出Merkletree(并防止在计算self.branch中出现断言)assertself.deposit_count lt;MAX_DEPOSIT_COUNT#Checkdepositamountdeposit_amount:uint256 = msg.alue / as_wei_alue(1,“ gwei”)assertdeposit_POS_L )== PUBKEY_LENGTHassertlen(withdrawal_credentials)== WITHDRAWAL_CREDENTIALS_LENGTHassertlen(signature)== SIGNATURE_LENGTH ################################# #Emit`DepositEent`logamount:bytes [8] = self.to_little_endian_64(deposit_amount)############## 2。触发存款事件############### log.DepositEent(pubkey,withdrawal_credentials,amount,signature,self.to_little_endian_64(self.deposit_count))############ ## 3.验证数据完整性################## Computedepositdataroot(`DepositData`hashtreeroot)zero_bytes32:bytes32 = 0x0000000000000000000000000000000 000000000000000000000000000000000pubkey_root:bytes32 = sha256(concat(pubcat,slice(zero_bytes32, start = 0,len = 64-PUBKEY_LENGTH)))signature_root:bytes32 = sha256(concat(sha256(slice(signature,start = 0,len = 64)),sha256(concat(slice(signature,start = 64,len = 64,len = SIGNATURE_LENGTH-64),zero_bytes32)),))节点:bytes32 = sha256(concat(sha256(concat(pubkey_root,withdrawal_credentials))),sha256(concat(金额,切片(zero_bytes32,start = 0,len = 32-AMOUNT_LENGTH), signature_root))))#Verifycomputedandexpecteddepositdatadatarootatchassertnode == deposit_data_root ##################################### ################ 4.Update MerkleTree ############## ### Adddepositdataroot到Merkletree(updateasingle`branch`node)self.deposit_coun t + = 1size:uint256 = self.deposit_countforheightinrange(DEPOSIT_CONTRACT_TREE_DEPTH):ifbitwise_and(size,1)== 1:#gasgasefficientthan`size%2 == 1`self.branch(height)= nodebreaknode = sha256(concat(self.branch [ [高度],节点))size / = 2
(向左滑动即可查看完整的代码)
为了使上面第3部分中的数据完整性验证与事务数据的构造一致,验证的逻辑关系如下图所示:
可以看出,由于合同接收到的参数具有固定的格式和语义,因此将这些部分直接打包为32个字节,然后通过merkleize进行评估,**与接收到的deposit_data_root进行比较。如果相同,则表示数据未被篡改。
信标链处理
在以太坊 1.0链上成功执行存款交易后,如何处理以太坊 2.0信标的链接?
信标链将始终监视存款合同的DepositEent。如果有新的存款合同,则将启动相应的处理程序。以下是存款处理的规范:
DeFiprocess_deposit(状态:信标状态,存款:保证金)-gt;无:####################基本检查############验证Merklebranchassertis_alid_merkle_branch #######(= hash_tree_root叶(deposit.data),科= deposit.proof,深度= + DEPOSIT_CONTRACT_TREE_DEPTH。1,#Add1fortheListlengthmix国家inindex =。 ETH 1_deposit_index,根状态=。 ETH 1_data.deposit_root, )#Deposit必须按订单状态进行处理。 ETH 1_deposit_index + = 1pubkey = deposit.data.pubkeyamount = deposit.data.amountalidator_pubkeys = [.pubkeyforinstate.alidators] ifpubkeynotinalidator_pubkeys:#Verifythepositpositature(proofofsessionsession)未由正存储正数检查过的(positiepositiespositiespositiespositiespositiespositiesposities data.domain_posita = posit_posited = posit_posited_posited_posited_positiespositiesposities data.domain_posita = posit_positedsposities data.domain_posita = posit_positedposities data.domain_posita = posit_positedposities data.deposit_posita。 )#Fork-agnosticdomainsincedepositesareacrossaforksforsigning_root = compute_signing_root(deposit_message,domain)ifnotbls.Verify(pubkey,signing_root,#posit。#)####################### ######################################添加新验证器####### ############ Addalidatorandbalanceentriesstate.alidators.append(get_alidator_from_deposit(state,deposit))state.balances.append(amount)######### ####### ############################# else:###############同一验证者已存入许多次################# Increasebalancebydepositamountindex = ValidatorIndex(alidator_pubkeys.index(pubkey))increase_balance(state,index,amount)########### ######################### ##########
(向左滑动即可查看完整的代码)
可以看出,如果存款已经是验证者,则仅需要增加余额。如果存储了新的验证者,则经过必要的验证后,新的验证者将在全局状态下注册。
新验证者的设置如下:
DeFi get_alidator_from_deposit(状态:信标状态,存款:存款)-gt;验证程序:金额= deposit.data.amount#设置有效余额有效_expand = min(amount-amount%EFFECTIVE_BALANCE_INCREMENT,MAX_EFFECTIVE_BALANCE)#设置验证程序信息和与生命周期相关的参数返回Validator( pubkey = deposit.data.pubkey,drawing_credentials = deposit.data.withdrawal_credentials,actiation_eligibility_epoch = FAR_FUTURE_EPOCH,actiation_epoch = FAR_FUTURE_EPOCH,exit_epoch = FAR_FUTURE_EPOCH,withdrawable_epoch = FAR_FUTUREbalance)
(向左滑动即可查看完整的代码)
与验证程序生命周期相关的参数设置为FAR_FUTURE_EPOCH。
然后,将处理这些新注册的验证者:
DeFiprocess_registry_updates(state:BeaconState)-gt; None:#Processactiationeligibilityandejectionsforindex,alidatorinenumerate(state.alidators):#可以输入等待队列ifis_eligible_for_actiation_queue(alidator):alidator.actiation_eligibility_epid(actie_alidator)(actie_alidator)(alidator)(alidator) )andalidator.effectie_balance lt;= EJECTION_BALANCE:initiate_alidator_exit(state,ValidatorIndex(index))#限制每个周期的验证器数量#队列验证器有资格进行激活,但尚未排队等待激活15.actiation_queue = sorted(id_alidator(if_id(= n(= n)) alidateators [index] .actiation_eligibility_epoch,index))#已出队的alidatorsforactiationupcurnlimitforindexinactiation_queue [] get_alidator_state_id_alidator()tate))
(向左滑动即可查看完整的代码)
在处理新添加的验证程序时,将按一定百分比设置等待队列,这将限制可以同时添加的新验证程序的数量,还可以防止大量新验证程序涌入网络安全性和协议这样做的影响保证了一定的稳定性和安全性。
知识点
密钥对管理方案
验证者密钥对可以是两个随机生成的BLS密钥对,但是如果要创建多个验证者,太多的密钥对将很难管理。可选的解决方案是通过种子密钥派生一对相关密钥对,并且仅记录种子密钥。还可以通过将种子密钥映射到助记词来方便地进行记录和保存。 以太坊以太以太坊提案EIP2333和EIP2334给出了特定的规范。密钥派生图如下:
[m / 0]-[m / 0/0] / / / [m / 0/1] [m]-[m / 1] / ... [m / i]
另一方面,对于一对密钥对,直接比较存储的私钥,存储为密钥库密码身份验证加密格式,再加上更安全,更方便的存储,可以参考以太坊建议EIP2335给出的建议。
词汇表
哈希树根
HashTreeRoot提供了一种以某种格式构造对象的默克尔树并获取树的默克尔根值的方法。 HashTreeRoot可以按顺序排列对象的各个部分(位,字节,向量,列表,容器等),并构造默克尔树以获得根值。参考规范:HTTPS://github.com/ ETH ereum / ETH 2.0-specs / BLOB / de / SSZ / simple-serialize.md
具体来说,在为pubkey,drawing_credentials,金额,签名计算HashTreeRoot时,将经历以下过程:
对pubkey,drawing_credentials,金额,签名执行HashTreeRoot以获取deposit_data_root
对于整个HashTreeRoot,实际上是分别为每个部分获取HashTreeRoot,**一起进行Merkleize
每个部分的HashTreeRoot实际上是先打包然后对结果进行Merkleize
如何包装?
如您所见,Pack会根据一定的长度削减值。如果不够,将以零字节补充。这将得到一个按顺序排列的32字节数据块,并为下一个Merkleize提供初始数据。
如何执行Merkleize?
可以看出,Merkleize是上一步生成的数据块,根据二进制树从底部的两个或两个哈希值进行评估,然后逐层计算根值,因此HashTreeRoot本质上就是数据根据一定的长度排列,然后逐层评估默克尔,直到获得最上层的根值为止。
探索信标链共识
信标整个链以太坊核心2.0,这是当前以太坊平行PoW独立的一条链。它负责存储和维护验证程序注册表,处理分片链和信标链之间的交叉链接,并完成信标链共识。要了解信标链的共识过程,您需要了解最重要的概念:缺口(时隙),期限(Epoch),验证者(Validator),证明消息(证明),验证者委员会(委员会),检查点,正当理由,最终确定的是Casper FFG(Casper,友好最终小工具),LMD GHOST分叉规则。
基础知识
时段和时代
SLoot和Epoch代表信标链块生成时间和共识结算周期。根据**的信标链技术规范0.12,插槽时间为12秒。每个纪元由32个插槽组成,大约需要6.4分钟。也就是说,在通常情况下,信标链每12秒产生一个块。每6.4分钟是一个新的共识周期。
资料来源:https:// ETH os.de/beacon-chain/
验证器
当信标链开始时,至少需要16,384个验证器(总计524,288 ETH )才能成功激活信标链。验证者负责对信标链和分片链的**区块(目前未实现,并将在第一阶段中实现)进行投票。
验证委员会(委员会)
在每个纪元开始时,信标链将通过RANDAO伪随机算法选举一个由至少128个信标链和分片验证程序组成的委员会。每个插槽都有一个委员会和一个提议者,以完成区块生成。
资料来源:https:// ETH os.de/beacon-chain/
出勤新闻(Attestation)
验证者的投票在信标链中称为身份验证消息(Attestation)。在标准中,身份验证消息由三票组成:
使用LMD Ghost fork算法选择主链。
使用Casper FFG完成检查点。
表决分片链(Crosslink)的状态(在阶段0中尚未实现)
LMD GHOST和CasperFFG
所有PoS类的区块链都面临两个最重要的安全问题:
一无所获
在PoS共识机制中,矿工可以在不花任何钱的情况下进行所有挖矿,从而使收益**化。
远程攻击(远程攻击)
攻击者首先获取一些私钥。只要这些私钥获得了足够的公平性,它们就可以从这一刻开始发起51%的攻击以创建叉链。由于PoS块生成不需要工作证明,因此攻击者可以使重写历史的分支链在短时间内赶上原始主链,从而造成PoS链和安全威胁。
以太坊 2.0是通过LMD GHOST和Capser FFG共同确保在链上达成共识的。
LMD幽灵
在比特币 PoW共识算法中,分叉规则遵循链数**的原则,即算力最强的链,也称为主链。其他被称为叉链。随着共识的不断发展,主链积累的算力也可能被其他分支所超越,成为分支链。
LMD使消息起作用,也就是说, 以太坊 2.0链的最终以太坊**消息。消息是证明。总而言之,票数**的叉子链将被视为主链。
上图显示了由**消息驱动的分叉选择规则:绿色方框代表已通过LMD GHOST分叉选择规则认证的方框,笑脸符号表示**证明,方框中的证明总金额(笑脸)是方块的重量,以方块中的数字表示。
尽管上面的分叉链是最多的链,但下面的绿色区块组成的链是主链,因为绿色区块包含的证据最多,即验证者投票最多。
卡斯珀FFG
卡斯帕FFG被称为“卡斯帕的友好终结小工具”,它是由Vitalik的建议POW/ POS混合算法,目的是让ETH ereum平稳地过渡到纯销售点。
Vitalik总结了这四个规则,任何违反这四个规则的行为都将要求删除保证金。
提交(commit_req):只有从2/3节点收到初步消息后,您才能提交。
准备(prepare_req):每个准备消息只能指向某个高度(Epoch),该高度也具有2/3个节点准备消息,并且这些准备消息必须全部指向相同的高度。
准备提交一致性(prepare_commit_consistency):任何新的准备消息只能指向**提交的高度或其他更高的高度。
无重复准备(no_double_prepare):您不能在同一高度发送两个准备。
这四个规则可以进一步简化为两个:
验证节点不得发布两个不同的投票:lt;ν,s1,t1,h(s1),h(t1)gt;和
lt;ν,s2,t2,h(s2),h(t2)gt;,并满足以下任一条件:
1. h(t1)= h(t2)
验证节点一定高度不能发出两个不同的票。
2. h(s1)lt;h(s2)lt;h(t2)lt;h(t1)
验证节点不得投出与另一个投票高度高度相关的投票。
卡斯珀FFG操作
Casper FFG通过合理和最终检查点完成了共识。
在达成共识的过程中,除了每个插槽的共识构建模块外,验证程序还会对Epoch的检查点(通常是第一个插槽的模块)进行投票。每个验证节点必须为检查点投票。投票的内容是一个包含两个纪元检查点的链接。连接的起点称为源,终点称为目标。如果您投票如果连接的投票数超过2/3,则该连接称为**多数链接(Supermajority Link)。
从根检查点开始,如果连接是**多数连接,则连接的目标进入“已调整”状态,连接的源进入“已完成”状态。进入最终状态的交易是不可逆的。
信标链激励机制
信标链的奖励包括五个部分:
证书包含在**块中
投票包括正确的检查点投票
证书包含正确的**块
证书很快被包括在链中
证书包含正确的分片块(Phase1阶段实现)
DeFi get_attestation_deltas(state:BeaconState)-gt; Tuple [Sequence [Gwei],Sequence [Gwei]]:“”“返回每个验证者的认证奖励/罚分。”“” source_rewards,source_penalties = get_source_deltas(state)#计算检查点源奖励和惩罚target_rewards,target_penalties = get_target_deltas(state)#计算检查点目标奖励和惩罚head_rewards,head_penalties = get_head_deltas(state)#计算**的区块奖励和惩罚状态)rewards = [source_rewards [i] + target_rewards [i] + head_rewards [i] +范围内的i的include_delay_rewards [i](len(state.alidators))]罚分= [i]范围内的i的[source_penalties [i] + target_penalties [i] + head_penalties [i] + inactiity_penalties [i] state.alidators))]返回奖励,罚款
(向左滑动即可查看完整的代码)
上面的代码段是信标链的**标准。验证奖励人实际上构成了奖励,是通过基本奖励(B)*来何一对投票权(P)的确认比例,任何没有投票权的何一人都将受到-B的惩罚。这样,进行正确投票的人越多,每个人将获得的奖励越多,从而抑制了恶意投票。
确定验证者基本奖励的公式如下:
DeFi get_attestation_component_deltas(状态:BeaconState,证明:Sequence [PendingAttestation])-gt; Tuple [Sequence [Gwei],Sequence [Gwei]]:“”“具有共享逻辑的帮助程序,供get source,target和head deltas函数使用”“ “奖励= [Gwei(0)] * len(state.alidators)罚金= [Gwei(0)] * len(state.alidators)total_balance = get_total_actie_balance(state)unslashed_attesting_indices = get_unslashed_attesting_indices(state,attests)attesting_balance(get, )对于get_eligible_alidator_indices(state)中的索引:如果index在unslashed_attesting_indices中:增量= EFFECTIVE_BALANCE_INCREMENT#如果is_in_inactiity_leak(state),则从余额总计中扣除以避免uint64溢出:#因为基本奖励**参与在这里获得了全部基本奖励补偿。 rewards [index] + = get_base_reward(state,index)否则:reward_numerator = get_base_reward(state,inde x)*(attesting_balance //增量)rewards [index] + = reward_numerator //(total_balance //增量)else:罚金[index ] + = get_base_reward(状态,索引)
(向左滑动即可查看完整的代码)
核心代码行:
reward_numerator = get_base_reward(state,index)*(attesting_balance //增量)rewards [index] + = reward_numerator //(总余额//增量)
(向左滑动即可查看完整的代码)
在理想状态下,验证者的收入是BaseReward的4倍,BaseReward的计算公式如下:
DeFi get_base_reward(状态:信标状态,索引:ValidatorIndex)-gt; Gwei:total_balance = get_total_actie_balance(state)Effectie_balance = state.alidators [index] .effectie_balance return Gwei(effectie_balance * BASE_REWARD_FACTOR // integer_squareroot(total_balance)// BASE_REWARDS_ACH 64个PER_TOR_PER #BASE_REWARDS_PER_EPOCH =每个纪元4基本奖励#有效余额验证者的有效余额#整数平方根(total_balance)所有有效余额的平方根
(向左滑动即可查看完整的代码)
区块生产者将获得BaseReward / 8奖励:
DeFi get_proposer_reward(state:BeaconState,attesting_index:ValidatorIndex)-gt; Gwei:返回Gwei(get_base_reward(state,attesting_index)// PROPOSER_REWARD_QUOTIENT)
(向左滑动即可查看完整的代码)
参考资料:
https://www.chainnews.com/articles/502750353901.htm
https://prylabs.net/participate
https://github.com/ ETH ereum / ETH 2.0-specs / blob / de / deposit_contract / contracts / alidator_registration.y
https://github.com/ ETH ereum / ETH 2.0-specs / blob / de / specs / phase0 / beacon-chain.md
https:// ETH os.de/beacon-chain/
文章标题:深度舒以太坊 2.0 以太坊四问硬核
文章链接:https://www.btchangqing.cn/44301.html
更新时间:2020年06月26日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。