Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
随机数对于区块链技术来说很关键。本质上,分布式账本的核心问题就是随机选择出块人的问题,这个随机性要能被全网确认,并且不能被操控,也不能被预测,否则恶意节点通过操控这个随机数就可以操控长链,从而实现双花攻击。
& E" n5 ~# z% k8 @; Q: _( r1 I, F
  Q; @4 e! B; `5 X4 W! c    PoW的方案是让大家进行算力竞赛,设置一个计算哈希的难题,谁先算出来谁赢,算力高的赢的概率高,算力低的赢的概率低,以这样的方式保证胜出者是随机的。投入的算力能够体现在哈希值上,这样全网能够验证,并选择包含最多算力的那条链。恶意节点只能通过提升自己的算力来增加攻击成功的概率。
7 G# q' x8 g# S( {0 C( b
- p7 y. H3 p5 _    PoS的方案是选举,大家不用浪费电力去进行算力竞赛,而是文明一点,随机选举一个节点来出块,并且被选中的概率和它拥有的份额相关。如果“随机”这一步没有问题的话,恶意节点只能通过增加自己的份额,增加自己被选中的概率,从而增加双花攻击的成功概率。这里有一点比PoW的方案要好就是,要实现攻击,先得成为持币大户,如果攻击成功币价大跌,攻击者也会承受最大的损失。而PoW方案中虽然算力要花钱,但是如果攻击者没有持币,那么他的利益和币价不一定是正相关的,不能排除仍然存在攻击的动力。) |8 A  o. v8 {8 m: z

8 O1 w! h3 c4 c6 X1 c: `    那么接下来的核心问题就是,这个不能被操控不能被预测的随机数从哪来。, l# E2 |' h+ ?# A

: \$ A8 I1 c3 g. Y7 u    传统地PoS方案尝试从链上现有的数据入手,比如使用上一个区块的哈希值,上一个区块的时间戳等等来作为随机数的来源,但这些会带来额外的安全风险。因为区块本身的信息就是节点写进去的,然后又要根据里面的信息来选举后续的出块者,存在循环论证的嫌疑,安全性不会太好。这也是传统地认为PoS方案不如PoW可靠的部分原因。) Q. G0 O' s2 l5 n; C( X
0 y( d2 q6 t( M* A! z) q
    Cardano项目采用的Ouroboros协议是被密码学界证明安全的一个PoS协议,也是唯一一个被工业界采用的可证明安全性的PoS协议。它采用密码学的手段来生成这个随机数。为了弄清楚这个过程,我们先从更基础的密码学工具开始:4 k" H6 _/ P4 e# N& _: v
' j" J( Z  F! c
    1.承诺(Commitment)和打开(Open)
9 Y  ]" G  x  r/ F7 o* ^+ N' v( |- E8 ^5 @7 n, h" R, _* n
    假设张三李四要玩剪刀石头布,用传统方式作弊者如果稍微出的晚一点,可以等看到对方的手势后再做选择。为了防止这种情况,他们:
' a+ [; c7 @1 s5 e4 \2 j% f5 I8 y, p. Q
    先各自做出选择,然后把自己的选择做个哈希;  r6 ~$ I+ N7 Q5 C6 n

2 D& H' h7 Q9 @2 b    交换这个哈希;
, s$ [+ N. G; A( Y! J( D# y) _# I- X! Q4 ~; Q- o% X9 z  `
    等双方都收到对方的哈希后,再交换双方的选择;
8 r7 S2 X2 [6 |* w( H+ l; y7 [; \1 g# F$ z2 M4 B  e) @) k+ [  G
    验证对方的选择和之前的哈希一致;
7 T3 U: \, a) D- p# I8 k! e
1 O2 ~! D0 T$ _6 k/ K* }* f    这样双方都知道了对方的选择,也能确认对方的选择是提前就做好的。这个哈希值就叫做承诺,因为它里面包含了保密信息,但又没有泄漏保密信息,而最终发送对应的保密信息,就叫做打开承诺。+ u9 l5 S* m. {/ y! U1 b0 O/ u  N
4 i2 r  y# `3 r* J; t, }0 }
    承诺和打开是一种模式,哈希只是实现手段之一。, x/ h9 M8 m. l; {

& D; r; U& {8 m& I. A    简单随机数协议(Coin-Tossing)
/ ~* M; Q; R8 r" X6 [) I
, _; N2 L- N0 _8 p7 G" M    现在我们可以设计一个多方生成随机数的协议:
7 z- M0 K/ S: Q: g. ^$ G' _" k8 ?- J% x( x# H+ a
    每个节点在本地产生一个随机数,并把它的承诺广播给其他人0 O$ b& i. [5 u# y) a5 G9 i
0 H8 Q6 P" W+ O5 q' D' |
    当它收到所有人广播的承诺后,再把打开也广播给其他人。
1 e* D) s& [; s# c& Y! ]3 H" A; d+ P! N" J$ H5 h6 I4 U
    最后大家把得到的随机数异或到一起,因为异或操作满足交换律和结合律,所以操作顺序不影响结果。) q1 M6 g* @/ {8 F2 C  G5 {

* W. r* ]$ I9 |; {3 R% J* t+ W/ C0 y    最终大家都得到了一个一致的无法被操纵的随机数。但这个简单协议的问题在于,恶意节点可以选择终止协议,也就是不发送自己的打开,会使得其他人无法进行下去。要解决这个问题,我们还需要另一个工具。
2 y' s2 s0 X) ^8 g/ Q7 |8 c; ?" Y8 u$ u) Y7 a7 c# n& m
    2.可验证秘密共享(VerifiableSecretSharing)7 n3 z4 ^; z: N2 r
$ f' ~7 |. h* I4 H% g7 r
    秘密共享是说,一个人可以把一个需要保密的信息,拆分成n份,分别发送给n个人,只要恶意节点不超过一定数量,最终大家可以综合各自的信息片段把原始信息还原出来。并且就算分发者如果作弊,大家也可以检查出来。具体的实现方式也有多种,这里就不深入了。
, H9 G% C7 N1 Z% F1 `( w
. y4 M7 A. c, ]    有了这个工具,就算恶意节点不发送打开,我们也能根据拆分信息还原出他的随机数,如果他想在拆分信息上作弊,大家也能检查出来并把他踢掉。
3 e3 }7 g7 l- _9 g& x4 \* F
' ~' C# ~; S7 F' ]: c( V0 z! i    结合这几个技术,我们就可以有一个完整的随机数生成协议了。最后,因为我们本来就是个区块链,所以协议过程中需要广播的信息,我们可以直接写到链上去,这样可以简化实现,并且也不需要所有投票节点同时在线,并且如果有人作弊,作弊的记录将会永远保存在链上。* d! M0 G2 Y1 t; M

1 w9 C# b& f! }# X" r. ]& J7 Q    最后综合一下整个协议流程:/ |$ c- g+ V  L& u0 `9 M
2 a  H! w% z  H5 |; Z
    在提交阶段,每个节点本地生成随机数和对应的承诺,同时把随机数拆成n份匹配其他的投票节点,并且用相应投票节点的公钥对每一份信息进行加密,保证它只能被对应的节点解密,然后把承诺和加密后的拆分信息一起广播给区块链。
5 ]# k% b; n* J- e3 E* \
! Z! C+ E5 w- |9 U) K7 G- d    当大家收到大部分节点的承诺和拆分信息后,就进入打开阶段,每个节点把自己的打开发到链上。5 X, @8 N$ O2 D

. A- Y; {; j4 X* l+ e/ L: F    然后是恢复阶段,每个节点检查是否有节点发送了承诺但没有发送打开,如果有,则解密自己对应的那份拆分信息并发布,然后根据大家发布的拆分信息恢复出该节点的随机数。
* D4 C: G5 z3 I0 i7 ~5 ?" n4 s) Q* u" \! j8 X
    现在大家就有了所有节点的随机数,把它们异或到一起,最终得到了一个一致的随机数,并用它来选择下一轮的出块人。( x4 H, t. y( w/ U' `* G

& c. x! i1 ~+ _, k% l7 E$ _. ^3 e3 W6 R    最后,这个随机数不光可以用来选择出块人,也可以给智能合约用,这是PoS另一个好处;而PoW体系虽然出块人是随机的,但并没有产生一个具体的随机数,所以智能合约要用随机数,还是得从区块链本身的数据里面去获取了。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

刘艳琴 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    3