POS 共识算法
1. POW有什么问题?
PoW
其实就是由所有的节点相互竞争,提交一个难于计算但是容易验证的计算结果,任何节点都可以验证这个这个结果的正确性。但是,
PoW
极度浪费算力,只有挖出区块的节点算力有效,其他节点算力都作废。PoW
除了使恶意攻击者不能轻易地伪装成几百万个节点和打垮比特币网络,并没有更多实际或科学价值。- 随着比特币产量的不断降低, 矿工人数也会越来越少, 比特币网络的健壮性会越来越低。
鉴于以上问题,POS股权证明
诞生了。
2. POS股权证明
权益证明( Proof of Stake,PoS) ,最早在 2013 年被提出,最早在 Peercoin
系统中被实现,类似现实生活中的股东机制,拥有股份越多的人越容易获取记账权(这些人更希望网络运作正常) 。
PoS
要求参与者预先放一些代币在区块链上,类似将财产存储在银行,这种模式会根据你持有数字货币的量和时间,分配给你相应的利息。同时也可以引入奖惩机制,使节点的运行更可控,同时更好地防止攻击。
在股权证明模式下, 有一个名词叫币龄, 每个币每天产生1币龄, 例如,你持有100 个币, 总共持有了 30 天, 那么, 此时你的币龄就为 3000, 这个时候, 如果你发现了一个PoS
区块, 你的币龄就会被清空为 0。 你每被清空 365币龄, 你将会从区块中获得0.05个币的利息( 可以理解为年利率5%) , 那么在这个案例中, 利息=3000×5%/365=0.41
个币。
3. POS工作机制
开始竞争出块记账前,节点质押一部分的币,同时身份变为验证者,PoS机制根据验证者下注的多少,采用随机的方式选出一个记账者进行出块记账。这个随机并不是真正的随机,一般跟下注的权益成正比,谁的权益多,谁获取记账权的概率就越大。如果选出的记账者在一段时间内没有记账,PoS机制重新选择记账节点,当出块完成,开始进入下一轮的记账。
以太坊PoS过程如下:
-
将自己的以太币( 32 个以太币)抵押(Stake)到系统中,获得相应的权益证明,并成为验证器 (验证者需要有三个客户端:执行客户端、共识客户端和验证者客户端)。验证器会把接受到的区块中的交易重新执行,并且对区块签名进行检查以确保区块是有效的, 然后验证者在整个网络上发送验证结果。
-
成为决议者。权益证明中,以太坊中的时间分为时隙(12 秒)和时段(32 个时隙)。 在每个时隙中随机选择一位验证者作为区块决议者,伪随机,权益越高几率越大。
问题:以太坊如何保证所有节点在每个时隙选出的决议者一致,毕竟以太坊有成千上万的节点?
答:在每一个时段,伪随机过程 RANDAO 会达成共识,并选出所有时隙的决议者。
-
决议者将交易打包为一个区块、执行交易并生成一个区块哈希(执行客户端),并将它们加入信标区块,共识客户端通过区块广播协议广播区块。
-
其他验证器在共识层广播网络上接收新的信标区块, 并将其传递给它们的执行客户端。在执行客户端上,交易在本地重新执行以确保提议的状态更改有效。 然后,验证者客户端证明该区块是有效的,该块被添加到证明它的每个节点的本地数据库中。
PoS
工作流程如图1所示。
验证者是否诚实?
运行验证者是一种承诺。 验证者应当保持足够的硬件和连接,来参与区块的验证和提出。 作为回报,验证者将获得以太币(他们的质押余额增加)。
主要有两种行为被视为不诚实:
- 在一个时隙中提出多个区块(模棱两可)
- 提交相互矛盾的认证
这些异常会在其他验证码验证的时候被发现。则不诚实的节点被罚没以太币的金额取决于大致同一时间受到罚没的验证者数量。 这称为“相关性惩罚”(opens in a new tab)↗。这个惩罚可能很小,也可能很大(销毁全部的质押货币)。
分叉选择
由于网络延迟或因为区块提议者提议多个区块(模棱两可),验证者可能看到不同的链头视图。 因此,共识客户端需要一种算法来确定支持哪一个区块。 权益证明以太坊中使用的算法称为 LMD-GHOST(opens in a new tab)↗。它的工作原理是确定其历史记录中具有最大证明权重的分叉。
4. PoS的优缺点
4.1 PoS的优点
- 节能环保,不需要无用计算;
- 性能高;
- 更加安全;
- 人人可挖矿(获得利息),不用担心算力集中导致中心化出现;
- 避免货币紧缩
为什么PoS更加安全?
在指定时间内,在POS体系中,即使你拥有了全球51%的算力,也未必能够进行51%攻击,因为,有一部分的货币并不是挖矿产生的,而是由利息产生(利息存放在POS区块中),这要求攻击者还需要持有全球超过51%的货币量。这大大提高了51%攻击的难度。
在PoS机制下,持有币越多,越容易获得记账权,接近于赢家通吃的感觉,但持有的币越多,越接近于一个诚实的节点,因为破坏整个网络带来的损失也越大,即假设富人不会做恶,毕竟做恶的目标是钱,若你富有,自然就没有做恶的动力。
4.2 PoS的缺陷
- 囤币获取记账权。从PoS的实现算法公式可以分析到,币龄其实就是时间*代币,一旦挖矿者囤积一定的币,很久很久之后发起攻击,这样他也将很容易拿到记账权,所以我们得给每个币设计一个时间上限。
- 给代币造成流通上的缺陷。币的数量这个因素还是会影响我们拿到记账权,很多挖矿者还会囤积代币,并且质押的以太币不可用。
- 富者更富,中心化程度提高。如果排名前几的富人联合起来,分别分时段质押货币获得权益,那么散户将很难获得记账的机会。并且这些大型验证器的权力更加集中,可能会导致网络的中心化风险。
思考:
pow比较类似农耕社会,谁劳动力多,谁就更容易获利。
而pos类似资本主义社会,代币越多,权利越大。
5. 实验代码
PoS共识算法 - Hello World (oacyq.com)
func TestPos(t *testing.T) {
//初始化区块链
bc := CreateBlockchain()
prevBlock := bc.DB[bc.L]
// 创建一组验证器
validators := []*Validator{
{"addr1", 1000, nil},
{"addr2", 2000, nil},
{"addr3", 3000, nil},
}
// 选择下一个出块的验证器
timestamp := int64(123)
validator := ChooseValidator(validators, timestamp)
fmt.Printf("Selected validator: %s\n", validator.Address)
// 生成新的区块
data := validator.Address + "data"
newBlock := NewBlock([]byte(data), prevBlock.Hash, prevBlock.Height+1, *validator)
// 验证区块的合法性
// isValid := block.validate()
hash := newBlock.GetHashString()
bc.DB[hash] = *newBlock
bc.L = hash
bc.SaveBlockchain()
//验证器 权益清空
validator.Stake = 0
//获得收益
//validator gets profit
bc.Print()
for i, validate := range validators {
fmt.Printf("%v-validate: %v\n", i, validate)
}
}