工作量证明 PoW

工作量证明早期应用在抵抗网络攻击(例如 DDOS),中本聪首次把它应用到区块链技术中。比特币使用 Hashcash ,该算法可分解为如下步骤:

  1. 取一些公开的数据(在比特币中取区块头的数据)
  2. 给这个公开数据添加一个计数器。计数器默认从 0 开始(在区块链中计数器就是 nonce)
  3. 将 data(数据) 和 counter(计数器) 组合到一起,获得一个哈希
  4. 检查哈希是否符合一定的条件:
    • 如果符合条件,结束
    • 如果不符合,增加计数器,重复步骤 3-4

Hashcash 原始的实现要求一个哈希的前 20 位必须是 0 , 但在比特币系统中算 0 的位数为动态变化,保证每 10 分钟生成一个块。在编码实现时,我们需要把公开数据(在比特币中取区块头)加 nonce 做哈希运算,然后和设定的难度比较,小于难度值则认为运算正确。

...
// Run performs a proof-of-work
func (pow *ProofOfWork) Run() (int, []byte) {
    var hashInt big.Int
    var hash [32]byte
    nonce := 0

    fmt.Printf("Mining a new block")
    for nonce < maxNonce {
        data := pow.prepareData(nonce)

        hash = sha256.Sum256(data)
        fmt.Printf("\r%x", hash)
        hashInt.SetBytes(hash[:])

        if hashInt.Cmp(pow.target) == -1 {
            break
        } else {
            nonce++
        }
    }
    fmt.Print("\n\n")

    return nonce, hash[:]
}
...

股权证明 PoS

PoS 试图解决 PoW 中大量资源被浪费的缺点。它的安全性不是来自挖矿节点算力,而是来自提高经济损失的经济价值。

区块链维护一个验证人的集合,验证者轮流对块提名并投票,每个验证者的投票权重取决于其存款的大小。 持币的节点通过发送某种特定类型的交易把币作为锁定的保障金之后成为一个验证者,然后区块链当前有效的验证者基于某种共识算法产生并确认一个新块。

共识算法通过奖励验证者提高矿工的积极性,从算法层面可把这些共识算法分为:

  • 基于链的 PoS:在固定的时间周期内随机选定一个验证者并赋权于它新建一个块。新块(包含上个块的哈希值)被追加到当前最长链的父区块上。
  • 拜占庭容错的 PoS:基于BFT的PoS协议伪随机的安排一个验证者在多轮投票的过程中提出一个区块。但是,提交和最终确认的区块取决于大多数验证者的投票(所有验证者中2/3的验证者在提交的区块中签名)

当前实现了 PoS 的协议有 Casper 和 Tendermint ,他们最大的不同点如下:

这里比较简单的回答是 Casper 重点关注活跃度(可用性)和可以接受相对不实时的安全(正确性)。虽然 Tendermint 是一个伟大的项目,但他的缺点是,如果检查点没有得到三分之二的投票,那么链出块将会停止。这就是为什么以太坊选择在 Casper 上做工作而不是使用 Tendermint 的原因。

Tendermint 是基于拜占庭容错的 PoS 设计;Casper 有两种实现方式:

  • CTFG (由 Vlad Zamfir 带领研究的 Casper the Friendly Ghost)基于链的 PoS 设计
  • CFFG (由 Vitalik Buterin 带领研究 Casper the Friendly Finality Gadget)则混合了 PoW 和 PoS

开源代码

引申阅读