3.1 引言
比特币等加密货币以及拜占庭共识中存在的问题:
比特币交易确认时间太长,1小时
比特币新用户很难实现安全自举,因为区块链可能分叉,并且用户可能被网络隔离
拜占庭容错协议需要服务器集合是事先确定且固定的
拜占庭共识协议需要2/3服务器是诚实的
面临的三个挑战:
避免女巫攻击,即攻击者伪造多个身份来参与共识
可扩展到百万用户
抵抗DDoS攻击
目标与假设:
Safety:若一个诚实的用户接受了交易A,则未来被其他诚实用户接受的交易都出现在包含A的日志中。
Liveness:在1分钟以内达成关于新交易的共识。
假设:
诚实用户所拥有的货币大于2/3
为实现活性,假设强同步,大多数诚实用户可在有限时间内将消息发给大多数诚实用户
为实现安全,假设弱同步,网络可以在长时间不同步,但有界
假设所有用户之间有松散的时钟同步,可以在弱同步之后恢复活性
Overview
每个有一个公钥,每个交易都有被某个用户签名,交易组成区块写入区块链
用户之间通过gossip协议来通信,传播新的交易
BA协议按步骤(step)执行,负责对区块达成共识:final,或tentative
在强同步下,tentative之后会达成final
在弱同步下,tentative之后,网络变成强同步,达成final
Gossip协议:与Bitcoin类似,每个用户随机挑选若干其它用户来传递消息,每个消息只转发一次
区块提议:所有用户执行密码学抽签(cryptographical sortition)来确定是否被挑选来提议区块;需要根据优先级,并提供对优先级的证明
被提议的区块被广播给所有用户,通过BA*来达成共识:在强同步下,需要4步达成共识;在最差情况下需要13步
3.2 密码学抽签(Sortition)
Verifiable random function (VRF): 一个伪随机函数并提供一个证明,其输出的正确性可公开验证。 y = F s k ( x ) y = F_{sk}(x) y=Fsk(x),其中 s k sk sk 是私钥;证明 π = p s k ( x ) \pi = p_{sk}(x) π=psk(x) 可以用公钥 p k pk pk 来验证。VRF提供了一种确定性的事前承诺,稍后通过私钥产生的证明来揭示。不同于数字签名(输出就是证明),VRF中证明无法伪造,不会遭到原象攻击。
抽签方法:
每个用户
i
i
i 赋予一个权重
w
i
w_i
wi,所有用户的总权重
W
W
W ,用户
i
i
i 被选择的概率与
w
i
/
W
w_i/W
wi/W 成正比;
每个权重单位对应一个子用户,每个用户对应
w
i
w_i
wi 个子用户;
抽签就是从
W
W
W 个子用户中选出
τ
\tau
τ 个用户;一个用户被选中,如果他的一个子用户被选中;
抽签的随机性来自于一个公开的随机种子
s
e
e
d
seed
seed;
VRF的输入是
s
e
e
d
seed
seed 和角色
r
o
l
e
role
role(区块提议,BA*成员等);输出
h
a
s
h
hash
hash 和证明
π
\pi
π;
每个用户来计算自己的
w
w
w 个子用户们被选中的次数
k
k
k,即计算被选中概率
p
←
τ
W
p \gets \frac{\tau}{W}
p←Wτ 下,
w
w
w 次抽签成功
k
k
k 次的概率分布(贝努利分布);
每个用户独立运行抽签算法,被抽中子用户个数
j
j
j 由
h
a
s
h
2
h
a
s
h
l
e
n
\frac{hash}{2^{hashlen}}
2hashlenhash来确定;
验证过程就是先验证
h
a
s
h
hash
hash 的正确性,然后计算
j
j
j;
选择随机种子:
每一轮
r
r
r 的种子
s
e
e
d
r
seed_r
seedr 由前一轮
r
−
1
r-1
r−1 确定:当一个用户
u
u
u 提议一个新区块时,也提议一个种子:
<
s
e
e
d
r
,
π
>
>
←
V
R
F
s
k
u
(
s
e
e
d
r
−
1
∣
r
)
\left< seed_r, \pi> \right> \gets VRF_{sk_u}(seed_{r-1}| r)
⟨seedr,π>⟩←VRFsku(seedr−1∣r) ;
s
k
u
sk_u
sku需要在之前就确定,来保证种子的为随机性;(略)
种子被包含在每个提议的区块中,所以一旦在
r
−
1
r-1
r−1 轮达成共识,则确定了第
r
r
r 轮的种子;
若区块有错误,则
s
e
e
d
r
=
H
(
s
e
e
d
r
−
1
∣
r
)
seed_r = H(seed_{r-1}| r)
seedr=H(seedr−1∣r);
初始种子由初始参与者通过分布式随机数生成来产生(略);并且每
R
R
R 轮,重新选择之前的种子;
3.3 区块提议
提议用户数量的阈值
τ
P
R
O
P
O
S
E
R
\tau_{PROPOSER}
τPROPOSER ; 当
τ
P
R
O
P
O
S
E
R
=
26
\tau_{PROPOSER}=26
τPROPOSER=26 时,实际的提议用户数量以很高的概率在1和70之间;
用抽签哈希值和子用户索引
i
i
i 的哈希值
H
(
h
a
s
h
∣
i
)
H(hash| i)
H(hash∣i) 对区块提议进行优先级排序;
用户会丢弃小于当前优先级的区块提议;
传播一种消息不包含区块内容,只包含优先级和证明,让大多数用户知道最大优先级的提议者,同时丢弃其它提议;
区块等待时间,
λ
S
T
E
P
V
A
R
+
λ
P
R
I
O
R
I
T
Y
\lambda_{STEPVAR} + \lambda_{PRIORITY}
λSTEPVAR+λPRIORITY,即完成BA最后一步的时间差,加上传播优先级消息的时间;即便这个估计不准确,safety仍然满足;
在最坏情况下,恶意提议者会向不同用户提议不同的区块,导致BA*在空区块上达成共识;
用户计票超过阈值
T
⋅
τ
T\cdot \tau
T⋅τ ,则输出该票的值,否则在等待一段时间后返回超时;
3.4 BA
BA执行包含两个阶段:第一阶段中,BA将对一个区块达成共识的问题转化为一个对二选一达成一致的问题;第二个阶段中,BA将达成一致:或者同意一个区块,或者同意一个空块。
每一个阶段包含若干步骤:第一阶段包含2步;第二阶段在最好情况下,即最高优先级提议者是诚实的,包含2步;否则,最坏情况下预期需要11步。
每一步中,每个被选出的委员会成员投票,所有用户计票;接收到超过阈值票数的用户(若被选为委员会成员)为下一步投票;否则,用户超时,根据步骤编号来为下一步投票。
当网络强连通时,达成最终共识;否则达成临时共识。
一个关键设计是除了用户私钥,没有秘密,这使得任何用户都可以“被动参与”:验证签名,计票,达成一致。
3.5 自举(Bootstrapping)
系统自举:一个创世块,以及一个初始选举种子,这个种子在初始参与者的公钥和权重公开后生成
新用户自举:为每个区块产生一个证书(certificate),包括BinaryBA*()的上一步的所有投票,帮助新用户来达成相同的投票结论
3.6 通信
假设被抽签抽中的用户可以在攻击者实施DoS攻击之前把区块传播出去
网络形成一个随机图,直径为规模的对数,因此传播时间也随着规模的对数增长