大牛证券欢迎你! 客服热线:4006-593-678
  公告 ​大牛证券老品牌,是您值得信赖的配资平台。大牛证券是证监会指定知名券商,严格遵守监管要求,保障资金安全无忧,提供一流投资体验。选对券商配资平台,让投资变得更加简单美好!用我们的智慧,为您创造财富。
资金保障
资金第三方监管,专款专用
真实交易
100%实盘,同步股市数据
快捷提现
闪电提现,最快三分钟到账
专业服务
客户体验至上为宗旨
按月配资

利率低至

100元/1万

独立成户

稳定高效

200万元
最高保证金
1000
起配金额
我要配资
资金三方托管/保险双保障/全实盘交易
按周配资

利率低至

30元/万

独立成户

稳定高效

200万元
最高保证金
1000
起配金额
我要配资
资金三方托管/保险双保障/全实盘交易
按天配资

利率低至

6元/1万

独立成户

稳定高效

200万元
最高保证金
1000
起配金额
我要配资
资金三方托管/保险双保障/全实盘交易
免息配资

不收取利息

全免

收益分成

盈利%归您

200万元
最高保证金
1000
起配金额
我要配资
资金三方托管/保险双保障/全实盘交易

领涨股

股票名称 当前价格 涨跌幅 市盈率
N新天 4.58 44.03% 13.07
N甘李 91.18 44.00% 30.66
硕世生物 261.08 12.34% 88
金晶科技 3.38 10.10% 73.26
安彩高科 4.69 10.09% 61.16
跨境通 5.90 10.08% 0
爱迪尔 5.90 10.08% 0
凯盛科技 5.91 10.06% 50.9
雪榕生物 11.94 10.05% 20.78
旗天科技 5.48 10.04% 0

领跌股

股票名称 当前价格 涨跌幅 市盈率
乐视退 0.35 -10.26% 0
中 关 村 11.12 -10.03% 130.88
恺英网络 3.50 -10.03% 0
新力金融 11.58 -10.02% 375.54
顺网科技 23.55 -10.01% 0
金运激光 44.01 -10.00% 863.75
天齐锂业 23.22 -10.00% 0
国药股份 44.57 -10.00% 21.7
汤臣倍健 19.81 -10.00% 0
神州泰岳 6.13 -9.99% 0

注册会员                            操盘达人

  • 181******9373 近期已注册成功

  • 137******9382 近期已注册成功

  • 158******6154 配资17万实盘资金盈利1.7万

  • 159******5485 近期已注册成功

  • 151******0018 配资6万实盘资金盈利1.62万

  • 132******3168 今日已注册成功

  • 166******5345 配资5万实盘资金盈利0.8万

  • 138******7588 近期已注册成功

  • 138******7391 配资61万实盘资金盈利4.88万

  • 156******5123 近期已注册成功

  • 199******2805 配资420万实盘资金盈利85.6万

  • 181******1852 近期已注册成功

  • 138******3045 配资300万实盘资金盈利69万

  • 150******9863 配资500万实盘资金盈利86万

  • 135******7455 近期已注册成功

  • 155******1706 配资150万实盘资金盈利40.5万

  • 182******1863 近期已注册成功

  • 185******4308 配资200万实盘资金盈利72万

  • 166******0551 今日已注册成功

  • 199******5159 配资6万实盘资金盈利1.28万

  • 191******9632 近期已注册成功

  • 131******2999 配资5万实盘资金盈利0.8万

  • 131******8352 今日已注册成功

  • 185******8221 配资320万实盘资金盈利62.4万

  • 139******5255 近期已注册成功

  • 152******9898 配资60万实盘资金盈利20.4万

  • 130******9884 近期已注册成功

  • 139******0801 配资40万实盘资金盈利14万

  • 188******1522 今日已注册成功

  • 155******8738 配资10万实盘资金盈利3.5万

  • 199******5056 近期已注册成功

  • 187******9215 配资80万实盘资金盈利19.84万

  • 131******8833 近期已注册成功

  • 186******9968 配资15万实盘资金盈利2.79万

  • 188******1137 近期已注册成功

  • 136******8585 配资6万实盘资金盈利1.62万

  • 152******2109 近期已注册成功

  • 158******5644 配资6万实盘资金盈利1.28万

  • 150******3576 今日已注册成功

  • 189******2269 配资88万实盘资金盈利22.88万

  • 182******5918 近期已注册成功

  • 139******8785 配资1万实盘资金盈利0.2万

  • 177******1164 近期已注册成功

  • 182******6642 配资6万实盘资金盈利0.9万

  • 155******3146 近期已注册成功

  • 132******1610 配资5万实盘资金盈利0.76万

  • 134******5511 近期已注册成功

  • 158******8288 配资140万实盘资金盈利23.8万

  • 155******5889 今日已注册成功

  • 136******3707 近期已注册成功

  • 132******6836 近期已注册成功

  • 132******2723 近期已注册成功

  • 189******9580 今日已注册成功

  • 136******2065 近期已注册成功

  • 152******5842 配资150万实盘资金盈利15.6万

  • 131******5815 近期已注册成功

  • 175******0811 近期已注册成功

  • 135******1754 配资128万实盘资金盈利23.8万

  • 136******1578 近期已注册成功

  • 182******2958 近期已注册成功

  • 132******2107 今日已注册成功

  • 130******6638 近期已注册成功

  • 131******7885 近期已注册成功

  • 131******2903 近期已注册成功

  • 131******2777 近期已注册成功

  • 177******4007 配资340万实盘资金盈利48.8万

  • 182******0177 今日已注册成功

  • 181******8866 近期已注册成功

  • 188******8888 近期已注册成功

  • 180******9917 近期已注册成功

  • 131******0999 今日已注册成功

  • 180******1021 配资320万实盘资金盈利35.5万

  • 151******9159 今日已注册成功

  • 182******0067 近期已注册成功

  • 133******8624 今日已注册成功

  • 158******8169 配资320万实盘资金盈利42.3万

  • 130******0484 今日已注册成功

  • 136******4975 今日已注册成功

  • 135******9423 近期已注册成功

  • 151******2879 近期已注册成功

  • 177******6131 今日已注册成功

  • 159******4118 配资140万实盘资金盈利23.8万

  • 158******9118 近期已注册成功

  • 139******3227 近期已注册成功

  • 183******8335 今日已注册成功

  • 151******1984 近期已注册成功

  • 180******2351 近期已注册成功

  • 178******2673 今日已注册成功

  • 130******9138 配资130万实盘资金盈利15.8万

  • 171******2580 近期已注册成功

  • 199******7655 近期已注册成功

  • 151******6075 今日已注册成功

  • 135******8235 近期已注册成功

  • 189******9473 近期已注册成功

  • 182******1545 今日已注册成功

  • 181******7858 配资140万实盘资金盈利23.8万

  • 133******6978 近期已注册成功

  • 180******1006 近期已注册成功

  • 181******2802 今日已注册成功

  • 159******2693 近期已注册成功

  • 135******5138 近期已注册成功

  • ****** 近期已注册成功

  • 189******4599 近期已注册成功

  • 181******7758 今日已注册成功

  • 138******7615 近期已注册成功

  • 135******7379 近期已注册成功

  • 130******6335 今日已注册成功

  • 134******0851 配资88万实盘资金盈利22.88万

  • 139******8324 近期已注册成功

  • 133******4242 今日已注册成功

  • 182******8973 今日已注册成功

  • 176******4530 近期已注册成功

  • 131******2408 今日已注册成功

  • 180******2505 近期已注册成功

  • 131******7128 今日已注册成功

  • 182******0146 今日已注册成功

  • 132******3348 近期已注册成功

  • 199******3524 今日已注册成功

  • 151******9799 今日已注册成功

  • 137******3128 今日已注册成功

  • 139******1068 近期已注册成功

  • 136******5241 近期已注册成功

  • 185******5993 今日已注册成功

  • 159******3747 近期已注册成功

  • 180******4237 今日已注册成功

  • 189******7060 近期已注册成功

  • 178******3968 今日已注册成功

  • 150******7995 配资15万实盘资金盈利2.6万

  • 136******7531 今日已注册成功

  • 183******8054 今日已注册成功

  • 151******4649 近期已注册成功

  • 135******8524 近期已注册成功

  • 150******2560 今日已注册成功

  • 138******5656 配资88万实盘资金盈利22.88万

  • 188******2998 近期已注册成功

  • 182******6642 近期已注册成功

  • 180******0890 今日已注册成功

  • 137******9294 近期已注册成功

  • 157******4398 近期已注册成功

  • 176******5644 近期已注册成功

  • 181******2084 近期已注册成功

  • 139******0705 近期已注册成功

  • 159******4556 今日已注册成功

  • 178******2863 配资12万实盘资金盈利1.88万

  • 188******0599 近期已注册成功

  • 134******2519 近期已注册成功

  • 151******2517 近期已注册成功

  • 176******6380 今日已注册成功

  • 171******0415 配资66万实盘资金盈利12.88万

  • 187******7849 今日已注册成功

  • 147******0207 近期已注册成功

  • 152******5759 近期已注册成功

  • 137******1716 今日已注册成功

  • 139******7659 配资2万实盘资金盈利0.25万

  • 176******5727 近期已注册成功

  • 158******7206 近期已注册成功

  • 152******2755 近期已注册成功

  • 152******3704 今日已注册成功

  • 138******0046 配资41万实盘资金盈利8.3万

  • 156******3551 近期已注册成功

  • 181******2156 今日已注册成功

  • 186******9264 今日已注册成功

  • 157******9210 近期已注册成功

  • 155******6668 配资7万实盘资金盈利0.65万

  • 152******7565 今日已注册成功

  • 180******3836 近期已注册成功

  • 153******7450 今日已注册成功

  • 153******0999 近期已注册成功

  • 188******5236 今日已注册成功

  • 136******6512 配资7万实盘资金盈利0.8万

  • 131******1412 近期已注册成功

  • 186******5079 近期已注册成功

  • 159******1377 近期已注册成功

  • 171******2698 今日已注册成功

  • 198******8562 近期已注册成功

  • 188******6391 今日已注册成功

  • 157******3520 配资4万实盘资金盈利0.42万

  • 177******5399 近期已注册成功

  • 136******3926 近期已注册成功

  • 177******9495 今日已注册成功

  • 135******2033 近期已注册成功

  • 185******0404 近期已注册成功

  • 159******4466 配资35万实盘资金盈利2.8万

  • 135******4047 近期已注册成功

  • 138******0409 近期已注册成功

  • 180******9805 配资6万实盘资金盈利0.3万

  • 131******0763 近期已注册成功

  • 182******6031 近期已注册成功

  • 130******7319 近期已注册成功

  • 178******1103 配资45万实盘资金盈利2.6万

  • 131******0371 配资32万实盘资金盈利3万

  • 182******4448 近期已注册成功

  • 178******0907 配资50万实盘资金盈利4.6万

  • 189******6979 近期已注册成功

  • 189******1260 近期已注册成功

  • 178******8920 配资12万实盘资金盈利1.2万

  • 186******6161 近期已注册成功

  • 183******1018 配资8万实盘资金盈利0.88万

  • 151******1978 近期已注册成功

今日充值

  • *********8021 充值2000元

  • *********4203 充值500元

  • *********4538 充值500元

  • *********7181 充值600元

  • *********1535 充值5000元

  • *********7728 充值2000元

  • *********7088 充值1000元

  • *********7092 充值100元

  • *********8863 充值100元

  • *********2920 充值100元

  • *********7666 充值1000元

  • *********2738 充值1000元

  • *********0559 充值500元

  • *********4799 充值5000元

  • *********8283 充值10000元

  • *********3920 充值1000元

  • *********9770 充值1000元

  • *********9991 充值51000元

  • *********0782 充值500元

  • *********0747 充值500元

  • *********1318 充值100元

  • *********2408 充值500元

  • *********3185 充值1000元

  • *********2790 充值10000元

  • *********3114 充值10000元

  • *********6623 充值1000元

  • *********2815 充值1000元

  • *********1266 充值2000元

  • *********5453 充值100元

  • *********2699 充值10000元

  • *********4588 充值1000元

  • *********8768 充值888元

  • *********3323 充值10000元

  • *********0638 充值10000元

  • *********1999 充值5019元

  • *********7433 充值1000元

  • *********1976 充值2000元

  • *********5351 充值10000元

  • *********7668 充值100000元

  • *********3279 充值100元

  • *********8029 充值20000元

  • *********3557 充值50000元

  • *********7190 充值100元

  • *********6730 充值100元

  • *********2494 充值100000元

  • *********6823 充值1500元

  • *********2659 充值100元

  • *********3332 充值2000元

  • *********3098 充值1000元

  • *********5609 充值20000元

  • *********2172 充值150元

  • *********6039 充值110元

  • *********0670 充值200元

  • *********5276 充值15000元

  • *********2570 充值500元

  • *********9529 充值1000元

  • *********3557 充值50000元

  • *********0826 充值5000元

  • *********5268 充值2200元

  • *********6248 充值1000元

  • *********5676 充值1000元

  • *********8882 充值1342元

  • *********3689 充值1000元

  • *********7308 充值500元

  • *********4150 充值100元

  • *********6630 充值800元

  • *********5245 充值1000元

  • *********3518 充值1000元

  • *********0869 充值100元

  • *********0966 充值10000元

  • *********9829 充值10000元

  • *********8700 充值4799.5元

  • *********7309 充值1000元

  • *********6366 充值1000元

  • *********3249 充值100元

  • *********8369 充值50000元

  • *********9183 充值1000元

  • *********6195 充值2000元

  • *********0999 充值100元

  • *********8007 充值1000元

  • *********0021 充值1000元

  • *********6727 充值500元

  • *********4086 充值50000元

  • *********1837 充值50000元

  • *********8445 充值5000元

  • *********9509 充值1000元

  • *********2445 充值12000元

  • *********0930 充值10000元

  • *********2297 充值5112元

  • *********1314 充值5000元

  • *********3057 充值50000元

  • *********8131 充值100元

  • *********0899 充值10000元

  • *********1012 充值1000元

  • *********1922 充值5000元

  • *********0234 充值1000元

  • *********6858 充值3000元

  • *********1687 充值500元

  • *********0999 充值2000元

  • *********5138 充值10000元

  • *********5858 充值10000元

  • *********0769 充值1000元

  • *********6437 充值10000元

  • *********9303 充值100元

  • *********1409 充值1000元

  • *********4240 充值1000元

  • *********8376 充值10001元

  • *********2231 充值1000元

  • *********6595 充值500元

  • *********1126 充值100元

  • *********0259 充值10000元

  • *********6164 充值100元

  • *********5727 充值10000元

  • *********7399 充值100元

  • *********3196 充值100元

  • *********2280 充值1000元

  • *********6425 充值5000元

  • *********4505 充值111元

  • *********2488 充值5000元

  • *********0595 充值500元

  • *********2122 充值5000元

  • *********5079 充值20000元

  • *********5481 充值2000元

  • *********9572 充值1100元

  • *********4259 充值10130元

  • *********5180 充值10080元

  • *********3777 充值10120元

  • *********7589 充值3000元

  • *********7742 充值1000元

  • *********2096 充值2000元

  • *********6188 充值3000元

  • *********3506 充值1000元

  • *********0733 充值1000元

  • *********7888 充值5068元

  • *********0573 充值10000元

  • *********8559 充值1000元

  • *********5805 充值100元

  • *********0603 充值1000元

  • *********7681 充值300元

  • *********1757 充值50000元

  • *********4860 充值1000元

  • *********3285 充值1000元

  • *********9598 充值1000元

  • *********2252 充值500元

  • *********5916 充值10000元

  • *********8631 充值1009元

  • *********0277 充值500元

  • *********6694 充值2000元

  • *********3105 充值10012元

  • *********6359 充值100元

  • *********0999 充值2000元

  • *********6292 充值1000元

  • *********8765 充值10000元

  • *********8329 充值10003元

  • *********7967 充值11000元

  • *********9394 充值1000元

  • *********1353 充值100000元

  • *********3335 充值1000元

  • *********2227 充值1012元

  • *********9728 充值1000元

  • *********0088 充值2000元

  • *********7116 充值3000元

  • *********7330 充值10000元

  • *********9671 充值1000元

  • *********5283 充值2000元

  • *********0467 充值5000元

  • *********5006 充值500元

  • *********0678 充值10000元

  • *********8715 充值1000元

  • *********1885 充值500元

  • *********2689 充值500元

  • *********2954 充值1000元

  • *********6619 充值1000元

  • *********0072 充值500元

  • *********7398 充值466元

  • *********7085 充值500000元

  • *********4458 充值1000元

  • *********8115 充值666元

  • *********5509 充值10000元

  • *********5493 充值1800元

  • *********6225 充值1000元

  • *********0621 充值2000元

  • *********3066 充值1000元

  • *********9822 充值100元

  • *********1115 充值100元

  • *********8873 充值1000元

  • *********4731 充值1000元

  • *********9816 充值1000元

  • *********9967 充值1000元

  • *********9859 充值1000元

  • *********6411 充值1000元

  • *********9016 充值1000元

  • *********3342 充值10000元

  • *********0845 充值100元

  • *********2460 充值100元

  • *********2921 充值10000元

  • *********3502 充值100元

  • *********4565 充值1000元

  • *********3558 充值5000元

  • *********8987 充值1000元

区块链新闻资讯
数字货币投资分析

最受技术人员关心的四个「以太坊2.0 Staking」硬核问题

本文将展示HashQuark研究团队从以太坊2.0技术层面出发、对最受技术人员关心的四个硬核问题给出的详细回答。

作为广受瞩目的全球顶尖公链项目,以太坊2.0完全颠覆了从前的设计,旨在最大程度地同时实现去中心化和扩容目标。与以太坊1.0不同的是,以太坊2.0使用 PoS (权益证明)算法来推动区块链的运行,并通过「信标链+多分片链」 的架构来提高可扩展性。

以太坊2.0 的研发和部署计划历时已久。在所有客户端均顺利实现规范的最终版本 v0.12.1后,6月底将启动一个实现最终版本规范的多客户端测试网,7月则可启动最后的公共测试网。此后,最终版本的公共多客户端测试网若能稳定运行两至三个月,则可开始准备以太坊2.0的主网启动工作。若一切顺利,阶段0将于11 月上线。但若版本规范仍有待修复,且所有客户端需再次实现新规范,则上线时间可能推迟到2021年。

本文将为读者展示 HashQuark 研究团队从以太坊2.0技术层面出发、对最受技术人员关心的四个硬核问题给出的详细回答。

如何成为验证人?

以太坊采用存款合约(deposit contract)作为以太坊1.0与以太坊2.0之间的桥梁,当用户向存款合约存入32 ETH后,便可以作为以太坊2.0的验证者参与工作,并获得以太坊2.0奖励。

以 prysm 官网教程为例,加入测试网来直观感受下如何成为验证人。

准备工作

prysm 的实现主要包含两部分: 信标链客户端和验证者客户端。前者负责信标链的状态管理,后者负责验证者的出块和⻅证。为方便这一流程,prysm 提供了简易脚本 prysm.sh 来下载安装:

mkdir prysm && cd prysm   curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh --output prysm.sh && chmod +x prysm.sh

(向左滑动,查看完整代码)

上述命令会在当前目录新建 prysm 文件夹,并下载可执行文件 prysm.sh。

除此之外,我们还需要至少32 ETH 的以太坊账户和浏览器插件 metamask 以便发送交易。可以在测试网上申请一些测试币,如下图所示:

最受技术人员关心的四个「以太坊2.0 Staking」硬核问题

创建验证者密钥对

一个验证人需要创建两对密钥对,一对用作验证人出块和见证,另一对用于管理存入合约的资金。运行如下命令来创建密钥:

./prysm.sh validator accounts create

命令将默认在~/.eth2validators/ 目录下创建两个 keystore 格式的文件,如下图所示:

前者用于资金管理,后者用于出块等。

创建完密钥的命令会在终端输出 Deposit Data:

最受技术人员关心的四个「以太坊2.0 Staking」硬核问题

这是根据上面的密钥对生成的交易信息,我们将它复制到网页上的交易数据部分:

最受技术人员关心的四个「以太坊2.0 Staking」硬核问题

启动节点

采用如下命令在两个终端分别启动信标链节点和验证者节点:

./prysm.sh beacon-chain./prysm.sh validator

发送存款交易

通过网页调用 metamask 填充上面的 Deposit Data,方便用户直接发送存款交易。

最受技术人员关心的四个「以太坊2.0 Staking」硬核问题

点击图中按钮,metamask 会跳出确认对话框:

最受技术人员关心的四个「以太坊2.0 Staking」硬核问题

可以看出共发送了32 ETH 给存款合约,交易的 Data 部分正是我们复制的 Deposit Data。点击确认发送交易,发送成功后等待 4-5 小时即可成功激活验证人。

用代码解读成为验证人的过程

创建验证人的主要过程为创建密钥对生成数据调用合约合约执行信标链处理

创建密钥对

创建验证者密钥对时,通常需要两对密钥(采用BLS12-381曲线):验证者密钥对(Validator PubKey, Validator PrivateKey)和提取存款的密钥对(Withdrawal PubKey, Withdrawal PrivateKey)。

最受技术人员关心的四个「以太坊2.0 Staking」硬核问题

生成数据调用合约

调用合约除了通常的合约地址、金额参数外,还需要构造要调用的合约方法的参数:pubkey(验证者公钥)、withdrawal_credentials (提取存款权限信息),signature(签名)和deposit_data_root(防止篡改标识)。在用户生成两对密钥后,就可以生成上面这些参数来构造要发送的交易数据,参考下图:

最受技术人员关心的四个「以太坊2.0 Staking」硬核问题

可以看到:

  • pubkey 是 Validator PubKey,这也是创建的验证者的公钥标识
  • withdrawal_crendentials由一个固定前缀拼接 Withdrawal PubKey 的哈希(sha256)构成
  • amount 是本次合约发送的金额,至少为1 ETH
  • signature 是采用 Validator PrivateKey对pubkey、withdrawal_credentials、amount 的哈希(HashTreeRoot)结果的签名
  • deposit_data_root 是前面4个参数的哈希(HashTreeRoot)

在生成上述的参数后,会按照合约接口编码成一定的格式,然后发送给存款合约完成调用。

合约执行

合约的主要方法 deposit,定义了收到一笔存款交易时如何处理,存款交易正是通过调用这一方法来实现存款。

deposit 方法接受 pubkey(验证者公钥)、withdrawal_credentials(提取存款权限信息),signature(签名)和 deposit_data_root(防止篡改标识)作为参数。主要分成参数基础校验、触发存款事件、检验数据完整性、更新数据结构几个部分,如以下代码所示:

  @public    def deposit(pubkey: bytes[PUBKEY_LENGTH],                withdrawal_credentials: bytes[WITHDRAWAL_CREDENTIALS_LENGTH],                signature: bytes[SIGNATURE_LENGTH],                deposit_data_root: bytes32):            ############## 1. 参数基础校验 ################        # Avoid overflowing the Merkle tree (and prevent edge case in computing `self.branch`)        assert self.deposit_count           # Check deposit amount        deposit_amount: uint256 = msg.value / as_wei_value(1, "gwei")        assert deposit_amount >= MIN_DEPOSIT_AMOUNT            # Length checks for safety        assert len(pubkey) == PUBKEY_LENGTH        assert len(withdrawal_credentials) == WITHDRAWAL_CREDENTIALS_LENGTH        assert len(signature) == SIGNATURE_LENGTH        #########################################            # Emit `DepositEvent` log        amount: bytes[8] = self.to_little_endian_64(deposit_amount)                    ############## 2. 触发存款事件 ################        log.DepositEvent(pubkey, withdrawal_credentials, amount, signature, self.to_little_endian_64(self.deposit_count))                    ############## 3. 校验数据完整性 ################        # Compute deposit data root (`DepositData` hash tree root)        zero_bytes32: bytes32 = 0x0000000000000000000000000000000000000000000000000000000000000000        pubkey_root: bytes32 = sha256(concat(pubkey, 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=SIGNATURE_LENGTH - 64), zero_bytes32)),        ))        node: bytes32 = sha256(concat(            sha256(concat(pubkey_root, withdrawal_credentials)),            sha256(concat(amount, slice(zero_bytes32, start=0, len=32 - AMOUNT_LENGTH), signature_root)),        ))        # Verify computed and expected deposit data roots match        assert node == deposit_data_root        ###########################################                    ############## 4. 更新Merkle Tree ################        # Add deposit data root to Merkle tree (update a single `branch` node)        self.deposit_count += 1        size: uint256 = self.deposit_count        for height in range(DEPOSIT_CONTRACT_TREE_DEPTH):            if bitwise_and(size, 1) == 1:  # More gas efficient than `size % 2 == 1`                self.branch[height] = node                break            node = sha256(concat(self.branch[height], node))            size /= 2 

(向左滑动,查看完整代码)

对于上述第3部分数据完整性的校验与构造交易数据一致,校验的逻辑关系参考下图:

最受技术人员关心的四个「以太坊2.0 Staking」硬核问题

可以看到,由于合约接收的参数是固定的格式和语义的,所以直接将各部分 pack 成32 bytes,然后做 merkleize 求值,最后与接收到的 deposit_data_root 进行比较,如果相同则说明数据没有被篡改。

信标链的处理

当存款交易成功被以太坊1.0链上执行后,以太坊2.0的信标链接下来如何处理?

信标链会一直监听存款合约的 DepositEvent 事件,如果存在新的存款合约,那么会启动相应的处理程序。以下为规范上对 deposit 的处理:

  def process_deposit(state: BeaconState, deposit: Deposit) -> None:            ##################### 必要检验 ###################        # Verify the Merkle branch        assert is_valid_merkle_branch(            leaf=hash_tree_root(deposit.data),            branch=deposit.proof,            depth=DEPOSIT_CONTRACT_TREE_DEPTH + 1,  # Add 1 for the List length mix-in            index=state.eth1_deposit_index,            root=state.eth1_data.deposit_root,        )            # Deposits must be processed in order        state.eth1_deposit_index += 1            pubkey = deposit.data.pubkey        amount = deposit.data.amount        validator_pubkeys = [v.pubkey for v in state.validators]        if pubkey not in validator_pubkeys:            # Verify the deposit signature (proof of possession) which is not checked by the deposit contract            deposit_message = DepositMessage(                pubkey=deposit.data.pubkey,                withdrawal_credentials=deposit.data.withdrawal_credentials,                amount=deposit.data.amount,            )            domain = compute_domain(DOMAIN_DEPOSIT)  # Fork-agnostic domain since deposits are valid across forks            signing_root = compute_signing_root(deposit_message, domain)            if not bls.Verify(pubkey, signing_root, deposit.data.signature):                return        #################################################                ##################### 添加新验证人 ###################            # Add validator and balance entries            state.validators.append(get_validator_from_deposit(state, deposit))            state.balances.append(amount)        #################################################        else:            ################ 同一个验证人多次存入 ###############            # Increase balance by deposit amount            index = ValidatorIndex(validator_pubkeys.index(pubkey))            increase_balance(state, index, amount)        ################################################# 

(向左滑动,查看完整代码)

可以看到,如果存入的已经是一个验证者,只需增加其余额便可。如果存入的是新的验证者,会在进行必要的校验后,在全局状态注册一个新的验证者。

新建验证者的设置如下:

def get_validator_from_deposit(state: BeaconState, deposit: Deposit) -> Validator:      amount = deposit.data.amount  
# 设置有效余额 effective_balance = min(amount - amount % EFFECTIVE_BALANCE_INCREMENT, MAX_EFFECTIVE_BALANCE)
# 设置验证者信息和生命周期相关参数 return Validator( pubkey=deposit.data.pubkey, withdrawal_credentials=deposit.data.withdrawal_credentials, activation_eligibility_epoch=FAR_FUTURE_EPOCH, activation_epoch=FAR_FUTURE_EPOCH, exit_epoch=FAR_FUTURE_EPOCH, withdrawable_epoch=FAR_FUTURE_EPOCH, effective_balance=effective_balance, )

(向左滑动,查看完整代码)

验证者生命周期相关参数均设置为 FAR_FUTURE_EPOCH。

之后再处理这些新注册的验证者:

  def process_registry_updates(state: BeaconState) -> None:        # Process activation eligibility and ejections        for index, validator in enumerate(state.validators):                # 可否进入等待队列            if is_eligible_for_activation_queue(validator):                validator.activation_eligibility_epoch = get_current_epoch(state) + 1                # 可否成为活跃的验证者            if is_active_validator(validator, get_current_epoch(state)) and validator.effective_balance               initiate_validator_exit(state, ValidatorIndex(index))            # 限制每周期成为验证者数量        # Queue validators eligible for activation and not yet dequeued for activation  15.      activation_queue = sorted([            index for index, validator in enumerate(state.validators)            if is_eligible_for_activation(state, validator)            # Order by the sequence of activation_eligibility_epoch setting and then index        ], key=lambda index: (state.validators[index].activation_eligibility_epoch, index))        # Dequeued validators for activation up to churn limit        for index in activation_queue[:get_validator_churn_limit(state)]:            validator = state.validators[index]            validator.activation_epoch = compute_activation_exit_epoch(get_current_epoch(state)) 

(向左滑动,查看完整代码)

在处理新增加的验证者时,会按照一定比例设置一个等待队列,这会限制同一时间可以增加的新的验证者数量,也能够防止一瞬间涌入的大批新的验证者对于网络安全和协议的影响,保证一定的稳定和安全性。

知识点

密钥对管理方案

验证者密钥对可以是随机生成的两对 BLS 密钥对,但若要创建多个验证人,密钥对数量过多则会难于管理。一个可选的解决方案是通过一个种子密钥来衍生出一对对相关的密钥对,只记录这个种子密钥即可。也可以通过将种子密钥映射成助记词来方便记录和保存。以太坊提案 EIP2333 和 EIP2334 给出了具体的规范说明。密钥衍生示意图参考如下:

      [m / 0] - [m / 0 / 0]     /        \    /           [m / 0 / 1][m] - [m / 1]    \     ...      [m / i]

另一方面,对于单独的一对密钥对,相比直接存储私钥,存储成 keystore 格式加上密码验证加密更加安全,存储也更加方便,可以参考以太坊提案 EIP2335 给出了相关建议。

名词解释

哈希方法HashTreeRoot

HashTreeRoot 提供了将一个对象按一定格式构建默克尔树、并求得树的默克尔根值的方法。HashTreeRoot 可以将一个对象(bit、bytes、vector、list、containers 等等)的各个部分按序排列然后构建默克尔树,获得根值。具体规范参考:https://github.com/ethereum/eth2.0-specs/blob/dev/ssz/simple-serialize.md

具体来讲,在对 pubkey、withdrawal_credentials、amount、signature 求取 HashTreeRoot 时,会经历以下过程:

  • 对pubkey、withdrawal_credentials、amount、signature 进行 HashTreeRoot,求得 deposit_data_root

最受技术人员关心的四个「以太坊2.0 Staking」硬核问题

  • 对于整体的 HashTreeRoot,实际上是对各个部分分别求取 HashTreeRoot,最后一起 Merkleize

最受技术人员关心的四个「以太坊2.0 Staking」硬核问题

  • 每个部分的 HashTreeRoot 实际上是先 Pack 再将结果 Merkleize

最受技术人员关心的四个「以太坊2.0 Staking」硬核问题

  • 如何进行 Pack?

可以看到,Pack 会把值按照一定长度切割,如不够就用零字节补充,这样会得到一个个按序排列的32字节的数据块,也为接下来的 Merkleize 提供初始数据。

最受技术人员关心的四个「以太坊2.0 Staking」硬核问题

  • 如何进行 Merkleize?

最受技术人员关心的四个「以太坊2.0 Staking」硬核问题

可以看到,Merkleize 是上一个步骤产生的数据块按照二叉树的方式从底部两两哈希求值再拼接,一层一层向上计算得到根值,所以 HashTreeRoot 本质上讲是数据按照一定长度排列,然后一层一层默克尔求值,直到获得最上层的根值。

探秘信标链(Beacon Chain)共识

信标链是整个以太坊2.0的核心,它是一条与当前以太坊 PoW 链并行的一条独立链。它负责存储和维护验证者注册表,处理分片链和信标链之间的交联(Crosslink),以及完成信标链共识。想要了解信标链的共识过程,就需要了解最重要的几个概念:间隙(Slot)、时段(Epoch)、验证人(Validator)、⻅证消息(attestation)、验证人委员会 (Committee)、检查点(Checkpoint)、合理化(justified)、敲定的(Finalized)、Casper FFG(Casper, the Friendly Finality Gadget)、LMD GHOST 分叉规则。

基础知识

间隙(Slot)和时段(Epoch)Slot 和 Epoch 表示信标链的出块时间和共识结算周期。按最新的信标链的技术规范v0.12,一个 Slot 的时间是12秒。每一个 Epoch 由32个Slot组成,大约6.4分钟。也就是说在正常情况下,信标链每12秒就产出一个区块。每6.4分钟是一个新的共识周期。

最受技术人员关心的四个「以太坊2.0 Staking」硬核问题

来源:https://ethos.dev/beacon-chain/

验证人(Validator)

信标链启动时需要至少16,384个 Validator(一共524,288个 ETH),才能成功激活信标链。验证人们负责对信标链和分片链(目前未实现,将在 Phase1实现)的最新区块进行投票共识。

验证人委员会(Committee)

每一个 Epoch 开始时,信标链都会通过 RANDAO 伪随机算法为信标链和分片选举出由至少128个验证人组成的 Committee。每一个 Slot 都会有一个 Committee 和一个出块者 (Proposer)共同完成出块。

最受技术人员关心的四个「以太坊2.0 Staking」硬核问题

来源:https://ethos.dev/beacon-chain/

⻅证消息(Attestation)

验证人的投票在信标链中称为⻅证消息(Attestation),在标准中一条⻅证消息由三个投票组成:

最受技术人员关心的四个「以太坊2.0 Staking」硬核问题

  • 使用 LMD Ghost 分叉算法,选出主链。
  • 使用 Casper FFG 进行检查点(Checkpoint)的敲定。
  • 对分片链状态(Crosslink)的投票(在 Phase 0 阶段还没有实现))

LMD GHOST和Casper FFG

所有 PoS 类型的区块链都面临着两个最重要的安全问题:

  • 无利害关系(Nothing-at-Stake)

在 PoS 共识机制中,矿工可以在所有分叉上进行挖矿而没有成本,从而达到收益最大化。

  • ⻓程攻击 (Long-Range-Attack)

攻击者首先获得一些私钥,只要这些私钥曾获得足够多的股权,便可以从这一时刻开始分叉进行 51% 攻击,制造一条分叉链。而由于 PoS 的出块不需要进行工作量证明,攻击者可以短时间内让重写历史的分叉链追赶上原本的主链,从而造成 PoS 链和安全性威胁。

以太坊2.0就是通过 LMD GHOST 和 Capser FFG 一起来保证链上的共识的完成。

LMD GHOST

在比特币PoW共识算法中,分叉规则遵循的是最⻓链原则,即积累算力最多的链,也称为主链;其他则被称为分叉链。随着共识的不断进行,主链积累的算力也有可能被其他分叉超过,成为分叉链。

LMD 让消息 (messages)发挥了作用,即以太坊 2.0 链上的最终性是由最新消息驱动的。消息即证明 (attestation),总结来说,拥有最多投票的分叉链将被认为是主链。

最受技术人员关心的四个「以太坊2.0 Staking」硬核问题

上图体现了由最新消息驱动的分叉选择规则:绿色区块表示经由 LMD GHOST 分叉选择规则证明了的区块,笑脸符号表示最新的验证者证明 (attestations),某个区块中的 证明总量 (笑脸总数) 就是该区块的权重,用区块中的数字表示。

尽管位于上方的分叉链是最⻓的链,但下方由绿色区块组成的链才是主链,因为绿色区块包含了最多的证明,也就是拥有最多的验证者投票。

Casper FFG

Casper FFG 全称为「Casper the Friendly Finality Gadget (Casper 友好的最终性小工具)」 ,是 Vitalik 提出的一个 PoW/PoS 混合的算法,目的是使 Ethereum 平滑过渡到纯PoS。

Vitalik 总结了四条规则,任何违反此四条规则的行为都要被取走押金。

  • 提交(commit_req):收到 2/3 节点的预备讯息后才能提交。
  • 预备(prepare_req):每个预备讯息只能指向某个也具有 2/3 节点预备讯息的高度(Epoch),且这些预备讯息也必须都指向同一个高度。
  • 预备提交一致性(prepare_commit_consistency):任何新的预备讯息只能指向最后一个已提交的或其他比其更新的高度。
  • 不重复预备(no_double_prepare):不能在同一个高度送出两次预备。

这四条规则可以进一步简化为两条:

某验证节点 v 必不可发出两个相异的投票: 及

, 且使下列任一条件成立:

1. h(t1) = h(t2)

验证节点必不可对某高度发出两个相异投票。

2. h(s1)

验证节点必不可投出高度围绕/被围绕于另一投票高度的投票。

Casper FFG 运作

Casper FFG 通过检查点(Checkpoint)的合理化(Justified)和敲定(Finalized))来完成共识。

在共识的过程中,验证人除了对每个 Slot 进行共识出块,还要对 Epoch 的检查点进行投票,Epoch 的检查点一般为第一个 Slot 的区块。每个验证节点都要对检查点进行投票,投票的内容是由两个Epoch的检查点组成的连接(Link),连接的起点称为源头(Source),终点称为目标(Target);若投票给某个连接的票数超过2/3,则该连接被称为绝对多数连接(Supermajority Link)。

最受技术人员关心的四个「以太坊2.0 Staking」硬核问题

由根检查点开始,若某连接为一个绝对多数连接,则该连接的目标进入为已合理化(Justified)状态,该连接的源头进入已敲定(Finalized)状态。进入敲定状态的交易不 可逆。

信标链的激励机制

信标链的奖励由五部分组成:

  • ⻅证被包含在最新的区块中
  • ⻅证中包括了正确的检查点的投票
  • ⻅证中包含了正确的最新区块
  • ⻅证被很快地包含到链上
  • ⻅证包含正确的分片区块(Phase1阶段实现)
def get_attestation_deltas(state: BeaconState) -> Tuple[Sequence[Gwei], Sequence[Gwei]]:      """     Return attestation reward/penalty deltas for each validator.     """      source_rewards, source_penalties = get_source_deltas(state)  # 计算检查点source奖惩      target_rewards, target_penalties = get_target_deltas(state)  # 计算检查点target奖惩      head_rewards, head_penalties = get_head_deltas(state)  # 计算最新区块奖惩      inclusion_delay_rewards, _ = get_inclusion_delay_deltas(state)  # 计算入块延迟奖惩      _, inactivity_penalties = get_inactivity_penalty_deltas(state)  
rewards = [ source_rewards[i] + target_rewards[i] + head_rewards[i] + inclusion_delay_rewards[i] for i in range(len(state.validators)) ]
penalties = [ source_penalties[i] + target_penalties[i] + head_penalties[i] + inactivity_penalties[i] for i in range(len(state.validators)) ]
return rewards, penalties

(向左滑动,查看完整代码)

上面的代码段就是信标链最新的标准。验证人的奖励实际上奖励由基础奖励(B) * 执行正确投票的验证人比例(P)构成,任何一个没有正确投票的验证人都将受到-B的惩罚。这样一来,做出正确投票的人越多,大家得到的奖励就会越多,从而抑制作恶的投票。

目前决定一个验证人基础奖励的计算公式如下标准代码所示:

def get_attestation_component_deltas(state: BeaconState,                                       attestations: Sequence[PendingAttestation]                                       ) -> Tuple[Sequence[Gwei], Sequence[Gwei]]:      """     Helper with shared logic for use by get source, target, and head deltas functions     """      rewards = [Gwei(0)] * len(state.validators)      penalties = [Gwei(0)] * len(state.validators)      total_balance = get_total_active_balance(state)      unslashed_attesting_indices = get_unslashed_attesting_indices(state, attestations)      attesting_balance = get_total_balance(state, unslashed_attesting_indices)      for index in get_eligible_validator_indices(state):          if index in unslashed_attesting_indices:              increment = EFFECTIVE_BALANCE_INCREMENT  # Factored out from balance totals to avoid uint64 overflow              if is_in_inactivity_leak(state):                  # Since full base reward will be canceled out by inactivity penalty deltas,                  # optimal participation receives full base reward compensation here.                  rewards[index] += get_base_reward(state, index)              else:                  reward_numerator = get_base_reward(state, index) * (attesting_balance // increment)                  rewards[index] += reward_numerator // (total_balance // increment)          else:              penalties[index] += get_base_reward(state, index) 

(向左滑动,查看完整代码)

核心代码行:

reward_numerator = get_base_reward(state, index) * (attesting_balance // increment)   rewards[index] += reward_numerator // (total_balance // increment)  

(向左滑动,查看完整代码)

在理想状态下验证人的收益就是4倍的 BaseReward ,而 BaseReward 的计算公式如下:

def get_base_reward(state: BeaconState, index: ValidatorIndex) -> Gwei:      total_balance = get_total_active_balance(state)      effective_balance = state.validators[index].effective_balance      return Gwei(effective_balance * BASE_REWARD_FACTOR // integer_squareroot(total_balance) // BASE_REWARDS_PER_EPOCH)      # BASE_REWARD_FACTOR = 64 基础奖励倍数      # BASE_REWARDS_PER_EPOCH = 4 每个Epoch的基础奖励      # effective_balance 验证人的有效余额      # integer_squareroot(total_balance) 所有有效余额的开平方

(向左滑动,查看完整代码)

出块人将会得到 BaseReward / 8的出块奖励:

def get_proposer_reward(state: BeaconState, attesting_index: ValidatorIndex) -> Gwei:    return Gwei(get_base_reward(state, attesting_index) // PROPOSER_REWARD_QUOTIENT)
未经允许不得转载:三链财经 » 最受技术人员关心的四个「以太坊2.0 Staking」硬核问题

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
链才网 信用卡积分兑现

联系邮箱:2868023681@qq.com

© 2021 三链财经   网站地图