浅谈区块链(二)-以太坊基础

The foundation for our digital future

比特币作为第一个可靠的去中心化方案,将区块链技术首次运用在金融货币领域中。此后,人们试图将区块链技术应用于其他领域,2013年 Vitalik Buterin 发布了以太坊白皮书,提出了赋予区块链可编程能力,从而作为复杂商业逻辑运算的基础。白皮书中描述了基本协议栈与智能合约的框架,在语言层面实现了图灵完备,让以太坊真正具有了可编程能力,也让区块链世界进一步拓展。

以太坊继承了比特币的核心思想,例如分布式去中心化,无须信任系统,不可篡改等特性,围绕着如何更好更广阔利用区块链技术进行发展。以太坊中涉及的技术面非常广,在本文中主要围绕着两个核心技术「智能合约」和「POS」进行讲解,带领读者初步了解以太坊实现的原理以及以太坊的愿景所在。

智能合约

20 世纪 90 年代,Nick Szabo 首次提出了智能合约的理念,这是一种旨在以信息化方式传播、验证或执行合同的计算机协议。但是由于缺少可信的执行环境,智能合约并没有被应用到实际产业之中。随着区块链的诞生,人们认识到其独有的特性天生为智能合约提供了可信的运行环境,而以太坊就是第一个成熟将两者结合起来的项目。

图灵完备和 EVM

对于比特币,我们之前知道他的转账过程 UTXO 其实简化来看就是一个入栈出栈的过程,它不支持循环语句,从而避免产生循环交易等恶意攻击,但这样比特币也不是 图灵完备 的。以太坊支持了循环等操作,并能够在自定义的虚拟机中运行,由此成为图灵完备:

1
Y(S, T)= S'

给定一个旧的有效状态 S 和一组新的有效交易 T,以太坊状态转换函数 Y 产生新的有效输出状态 S’,因此以太坊不仅仅是一个分布式账本,而是更像一个分布式状态机。

正如 Java 程序通过编译为字节码后运行在 JVM 虚拟机上从而抹平不同硬件的区别,统一执行环境。以太坊也类似创建了一个虚拟机 EVM 来对智能合约的代码进行运行,EVM 基于堆栈,定义了各种基本操作码从而执行智能合约的逻辑。

Gas 机制

智能合约的每次计算都会消耗 Gas, 每次计算都需要收费,这样可以防止不良参与者对网络造成垃圾信息。 为了防止代码中出现无意或恶意的无限循环或其他计算浪费,要求每个交易对代码可以执行的计算步骤设置一个限制。

发起智能合约调用方会设置一个最大 Gas 限度,调用智能合约会消耗 Gas,如果顺利执行完,未使用完的 Gas 会退回给提交方:max fee - (base fee + tip)),如果调用产生异常或者最大 Gas 不够的话,执行失败,这些Gas会奖励给矿工。

智能合约的过程

  1. 智能合约对外也是一个账户的形式。存储有余额,智能合约的代码,以及该账户的状态数据。
  2. 部署智能合约:发起一笔不指定任何人的交易,其中包含了 Gas 费用和编译好的智能合约字节码,这就创建了一个合约账户(一般根据创建者的地址和nonce来决定合约地址)
  3. 调用智能合约:向智能合约地址发起一笔交易,带上调用参数,和费用 Gas等信息
  4. 执行智能合约:智能合约地址收到交易,解码传参执行函数,进行状态转换,执行完后扣除相应的 Gas。
  5. 同步结果:状态转换的结果会全网同步并验证,确保一致后记录到区块中,并更新状态数据

基于区块链中的去中心化,透明,不可否认的特性,形成了智能合约的可信运行环境,催化了区块链应用技术的进一步发展。

从 POW 到 POS

回顾POW

关于比特币的核心算法 POW 在上文 浅谈区块链(一)—比特币 中已经进行了详细解释,这里不再赘述,简单看下 POW 的优缺点

POW 的优点 POW 的缺点
算法简单 耗电,浪费能源
容易验证 矿池聚集算力,形成垄断
攻击成本大(51%攻击) 为了避免分叉概率过大,无法降低难度,也就是无法降低出块速率,也就是无法提高交易频率

POS 与币龄

POS:Proof of Stake 股权证明

我们知道 POW 挖矿的基本原理是,暴力寻找一个 nonce,使得 Hash (block_header) < Target 成立,对于全网的所有矿工的 Target 都一样,所以就是比每个矿工的算力,算了越强挖出矿的可能性也越高。

而对于 POS 公式可以简单理解类似为:Hash(block_header) < Target * CoinAge,而 CoinAge = 持有币数量 * 持有币的时间,举个例子:

全网目标值 4396,A 矿工币龄为 15,B 矿工币龄为 240,那么两个矿工的计算公式分别为:

  • A: Hash(block_header) < 0x0000FFFF
  • B: Hash(block_header) < 0x000FFFFF

B 直接少了个 0 ,所以 B 获得记账出块的概率肯定要比 A 大,从竞速计算到概率的计算,这显然节省了大量的能源。所以我们有了基本的方法去决定谁来记账出块,并获得记账的奖励。

Nothing at Stake 和 Casper 算法

在 POW 中最长链决定了哪些区块是被确认的,在 POS 中新的区块经过广播后,经过验证人投票验证,获得投票量超过 2/3 质押总量(不是投票人数量),则验证通过后,区块就得到了确认。

但是基础的 POS 没有例如 POW 那样有大量的挖矿成本(大量的Hash运算),那么当一个验证者遇到分叉(由于网络,恶意传播等)时,因为没有什么挖矿成本,那么他就可以同时在多个链上进行挖矿/投票验证来保证其获得最大的利益,造成链的系统混乱也就是 Nothing at Stack 问题,以及非常容易产生的 双花问题 :

为了解决这个无成本攻击的问题,以太坊设计了 Casper 算法来进行处理。简单来看就是通过质押资产来参加挖矿,当验证者挖矿投票时有恶意行为和消极行为就会进行处罚。

Casper的两条铁律是:

  • 验证者不得发布同属与同一个高的的两个不同投票。
  • 验证不能在已投票的区间内再次投票。

当不超过 1/3 的总押金的的验证者违反这两个条件之一,就能得到Casper ffg的两个特性:

  • 不可能确认两个冲突的的检查点
  • 保证了合理的活性

当违反这两个铁律,那么违规验证着就会被罚没所有的押金(具体实现会有所不同,比如是根据全网恶意节点的数量来做处罚大小的调整),押金的价值是远远大于挖矿的收益的,从而避免了无成本攻击的问题。

具体证明:Casper the Friendly Finality Gadget详解Casper FFG共识算法

设 a[m](有合理的直接孩子 a[m + 1])和 b[n](有合理的直接孩子 b[n + 1])是不同的最终检查点,如图 3 所示。现在假设 a[m]和 b[n] 冲突,并且不失一般性 h(a[m]) < h(b[n])(如果 h(a[m]) = h(b[n]),则很明显 1/3 验证者违反了条件I【译者注:这里解释一下:投票要求 2/3 多数才能定下 a 或者 b,既然现在两个都被确定了,说明总共有 4/3 的投票,那么必然有 1/3 的验证者投了重票】)。设 r→b [1]→b [2]→···→b [n] 为检查点链,使得存在绝对多数链 r→b [1] ,… b [i]→b [i + 1] ,… b [n]→b [n + 1]。 我们知道没有 h(b[i]) 等于 h(a [m]) 或 h(a[m + 1]),因为这违反了属性(iv)。 令 j 为使得 h(b[j]) > h(a [m + 1]) 的最小整数,那么有 h(b[j -1]) < h(a[m])。 然而,这意味着存在从具有小于 h(a[m]) 的纪元数的检查点到具有大于 h(a[m + 1]) 的纪元数的检查点的超大多数链接,这与从 a[m] 到 a[m + 1] 的绝对多数链不兼容。【译者注,也即违反了条件2】

检查点的投票过程类似于:

  1. r 根节点默认合理 justified 的,然后 r 到 b1之间的验证者投票,总量超过 2/3,b1 之间的变为合理的。
  2. 同理 b2 得到 b1 到 b2 之间的验证者超 2/3 投票,则 b2 变为合理的,同时 b1,以及 b1 到 b2 之间的节点变为确认的(也就是不可否认的,除非有超过 1/3 总量的恶意攻击)

当离线的投票人超过 1/3,那么没办法投票超过 2/3 没发最终确认,以太坊通过处罚减少离线的验证者的质押,逐渐让在线质押重新大于 2/3

分叉选择和 LMD-GHOST 算法

Casper算法只是告诉了我们如何最终确认,但是没有告诉我们如何选择哪条链。对于网络延迟,或者有不诚实的区块创造提议这,则会产生分叉(同时以太坊的出块频率远远高于比特币,所以更容易产生分叉,如果依然采用最长连规则,那么必然需要有人放弃自己的利益),对于以太坊采用的是 GHOST 算法:

  • 对叔块进行一定的奖励来鼓励小分叉的矿工放弃,例如:W1 获得 B1 作为叔块的出块奖励 5 * 7 /8
  • 同时自己也获得了接受叔块的奖励,例如:W0 获得 C 的 5(挖矿)+ 接受两个叔块(5 * 1/32)*2 + 交易费用

由此,小矿工也能获得利益,可以迅速让分叉合并回去,不在自己的分叉链上继续挖矿了。Ghost本身是在1.0使用。

在2.0后增加了 LMD,也就是验证者只接受最新的一条消息,也就是在 POS 中接受最重权重的链是权威链

总结回顾

通过以上各种的算法设计,以太坊也逐渐从 POW 挖矿算法迁移到更具未来可行性的 POS 算法,让以太坊智能合约生态更加繁荣,为了将以太坊带入人们的主流视野以造福全人类,以太坊团队努力让以太坊变得更可扩展、更安全和更可持续。各种新技术也在融入以太坊中,分片存储、零知识证明、协议去中心化等等技术得在探索中不断发展,所以对于致力于建设去中心化世界的极客们,未来依然有着无限的可能!

参考资料