这是鼎叔的第一百三十篇原创文章。行业大牛和刚毕业的小白,都可以进来聊聊。
欢迎关注公众号《敏捷测试转型》,星标收藏,大量原创思考文章陆续推出。
本文深入聊聊以太坊和智能合约的原理、账户结构、挖矿算法以及权益证明。
相关文章:聊聊区块链和比特币 上,聊聊区块链和比特币 下
本文内容参考了肖臻的《区块链的技术和应用》。
以太坊是怎么异军突起的
比特币的平均出块时间 10 分钟,还是偏慢,满足不了现实社会的交易需求,而以太币大幅缩短了出块时间,能够做到 15 秒出一个块。
出块时间短会有什么风险么?
那就是更容易产生分叉,因为区块链的网络信息同步是比较慢的。
去中心化交易带来的弊端 - 性能慢,导致系统不可能同时满足一致性,及时性和分区容错性,这被称为分布式系统的 CAP 定理。
以太坊最小的货币是 1WEI,而比特币最小的货币是 1 聪。
智能合约 Smart Contract
以太坊最强大的特色功能就是实现智能合约,也是去中心化合约(decentralized contract),合约一旦入链,就无法取消和暂缓。
加密货币通过技术手段来代替现实社会中流通货币的职能。而智能合约就是通过区块链的不可篡改性来保障合同的执行,对于简单清晰的合同这是可行的。
正如比特币实现了跨国转账的便利性,智能合约也实现了全球生效,一开始就不可能违约,不怕对方不履行合同而打官司,起草合同的人也无法改变合同的履行。这在商业上是有巨大潜力的。
以太坊的账户
先说说比特币的隐私保护。它虽然效果好,但是体验挺别扭,和日常在银行体验不同。银行在用户存钱的时候要说明来源,但是花钱的时候不用。而你收到比特币后,将来要一次性花出去,花不完的可以转给自己(找零),转账要说明币的来源。
所以,比特币是没有账户概念的,每一笔转账都单独处理。
而以太坊是基于账户的模型,显式记录每个账户下有多少以太币。比特币要说明每个币的来源,以太坊则不用。以太坊账户有余额的概念,因此不用找零给自己。
这种机制天然可以防御双花攻击,因为消费后账户会被扣款,但是防御不了重放攻击,比如遇到不诚实的收款人。
以太坊的余额会在全节点记录,无法篡改。
以太坊在转账时会加一个计数器 nonce,把它包含在交易中并签名。
以太坊有两类账户,一类是普通用户拥有的外部拥有账户(EOA:Externally owned account),一类是智能合约账户。
EOA 由用户通过私钥直接控制,里面包含余额和 nonce。
智能合约账户中的 nonce 记录了调用次数,可以调用其他合约(知道合约地址就可以调用),但是不能发起交易。
智能合约账户和 EOA 的差别是前者包括了合约代码和存储空间。合约代码一旦部署就无法修改,它通过合约地址被访问,由以太坊虚拟机来执行。
以太坊创始人 Vitalik 支持智能合约的动机,很可能是希望参与合约的人有稳定的身份,进而可用智能合约做金融衍生品。
以太坊账户包含地址信息和状态信息,账户地址是 20 字节的唯一标识符(40 位 16 进制数)。
账户状态,包含 nonce,以太币余额,StorageRoot(合约账户存储空间 Merkle tree 的根哈希),合约账户的代码哈希。

以太坊发布的是账户状态,而不是交易。状态可以在本地维护,无需发布,在大多数情况下状态是不变的。
以太坊的数据结构
先回忆下比特币交易的 Merkle Tree,它是不会改动的,下次有新区块就重新构建。Merkle tree 本身也没有提供高效查找和更新的方法。
以太坊的核心数据结构是 Merkle Patricia Trie(MPT),它是一种结合了 Merkle Tree 和 Patricia Trie 的树形结构,用于高效存储和验证区块链的状态、交易和收据等数据。因此以太坊包含四棵不同类型的树,它们构成了智能合约生态的底层基石:
状态树(存储所有账户的全局状态)
存储树(单个智能合约内部的状态,每个合约拥有一颗存储树)
交易树(存储一个区块内的所有交易数据)
收据树(存储交易执行后的收据信息)
Patricia Trie 是一种压缩前缀树,通过压缩分支节点,减少了树的层数,节约了存储空间。

在以太坊网络中,节点间同步时仅需传输和验证变更部分的节点数据,而非完整的全局状态,这种局部更新特性显著减少了数据冗余,加速了新区块的发布。
多个区块的状态树共享节点,新发布区块只是改变状态的节点需要新建分支,其他节点沿用现有结构。
以太坊的分叉与奖励
由于以太坊产生区块速度很快,所以临时分叉成为常态,系统需要保存历史状态,以便智能合约回滚到正确的链路上。
以太坊区块收取的交易手续费被称为 “汽油费”-gas,以太坊运算各种指令就要消耗汽油费。
以太坊为了解决频繁分叉带来的挖矿作废负面效果,还引入了叔叔节点(Uncle)的概念,就是产生分叉后,没有成为最长合法链的区块也能获得不小的奖励,被称为 uncle reward。
叔叔区块就是未进入主链的临时分叉区块,但被后续主链区块引用。因为以太坊出块太快,如果不对叔叔区块奖励,会带来矿工的不满。
以太坊每挖出一个区块有 2 个以太币奖励,每个叔叔区块可以获得 87.5% 的主链出块奖励(即 2*0.875 以太币)。
而以太坊为了鼓励主链的矿工引用叔叔区块,每引用一个叔叔区块,主链矿工额外获得 0.0625 以太币,但最多可以设置两个叔叔区块,如果设置太多可能导致以太币贬值。

考虑到这种机制下第三个叔叔区块仍然可能一无所获,又或者主链连续挖出两个新区块导致叔叔区块无法被引用,以太坊又规定了在近七代以内被主链引用的叔叔区块,都能获得奖励,但是奖励系数递减,从 7/8 一直递减到 2/8。也就是说叔叔区块可以不只是上一辈的,可以是上六辈的。

这种机制的好处是通过激励递减来鼓励尽早合并分支,同时节点维护状态可控。
另外,汽油费只有主链区块矿工可以获得,叔叔区块是没有的。但是汽油费占比很小,类似比特币的交易手续费(占比仅出块奖励的 1%)。
以太币的出块奖励也不像比特币是每四年减半,它没有人为去制造货币的稀缺性,只是为了挖坑的公平性一次性地调整奖励。
当叔叔区块被引用后,它里面的交易要执行么?
不执行。因为不同分叉上的交易可能冲突,形成非法交易。
叔叔区块后面的子区块也不会有任何奖励了,否则,发动分叉攻击就太容易了,失败了也没啥代价,反正都有奖励。
这个以太坊的激励设计就是一出罗生门啊!
总结:以太坊的矿工有三份收入:出块奖励,作为叔叔区块被招安的奖励,汽油费。
挖矿算法
加密货币的安全性主要由合理的挖矿算法所保障的。比特币至今很成功,因为它的挖矿算法没有捷径。
曾经在市场上排名第二的莱特币,为了克服比特币中 ASIC 矿机占便宜的现状,采用了对内存要求高的哈希函数,挖矿难度会大幅提高,这样更好地利用普通计算机(大内存)参与挖矿。
但是莱特币对轻节点是有弊端的,占用内存太大。最终莱特币并没有成功,因为它并没有阻止 ASIC 芯片成为主流,不过冷启动问题解决得不错。参与挖矿的人太少,这是有很大安全隐患的,太容易发生恶意攻击。
加密货币还需要做到:尽管挖矿难度大,但验证容易。以太坊的算法是怎么做的呢?
以太坊的挖矿算法 Ethash 主要依赖 GPU,通过生成大规模有向无环图(DAG)数据集来增加挖矿的内存密集性,从而限制 ASIC 矿机的效率优势,具体过程是:
每个区块的种子(seed)由前一个区块的哈希值计算得出,确保每个 epoch(30,000 个区块,约 5 天)生成唯一的种子。由种子生成初始缓存(初始 16MB,每 epoch 增加 128KB)用于快速验证。DAG 数据集通过缓存逐层扩展生成,初始大小为 1GB,每年增长约 7GB。DAG 的每个元素依赖缓存中的 256 个元素,形成复杂的依赖关系。
矿工需从 DAG 中随机选取数据,结合区块头信息进行多次哈希混合运算(循环 64 次),最终生成满足难度条件的哈希值。验证节点则通过缓存快速计算 DAG 指定位置的数据,无需存储完整 DAG,实现高效验证。
DAG 的规模随时间线性增长(目前约 2GB),迫使矿工依赖高带宽内存而非纯算力,显著增加了矿工尝试 nonce 的难度和资源消耗。Ethash 通过 DAG 的随机数据选择机制,确保算力竞争公平性。
权益证明与 GPU 挖矿
比特币工作量证明的模式带来了 ASIC 芯片作为计算主流的优势,它只有挖特定矿的单一功能,饱受 “计算资源浪费” 的质疑,同时 ASIC 矿池也是集中在少数矿主手里,有中心化垄断的倾向。
以太坊则希望找到限制 ASIC 计算效力的挖矿机制(ASIC resistance),而权益证明(PoS:Proof of Stake)就是这样的机制,股东根据手上的权益证明来行使投票权,并获得相应比例的收益。
但是以太坊直到 2021 年还没有真正实施 PoS,当时时机还不成熟。在 2022 年 9 月终于完成了从 PoW 到 PoS 的合并,能耗也随之大幅降低。
不需要挖矿就可以投票,可以节约大量计算资源。这个动向可以吓唬行业不要再定制新的 ASIC 芯片了。
从工作量证明转向权益证明
在彻底转向 PoS 之前,以太坊使用具有内存硬性的工作量证明算法 Ethash,通过强制矿工频繁访问大容量内存,而内存访问速度和带宽的提升成本远高于计算单元(如 ASIC 的电路),从而保持挖矿的去中心化,让普通用户的 GPU 也能参与挖矿。
以太坊采用了预挖矿 Pre-mining 的机制,一开始就预留给早期开发者和基金会一些代币,用于解决早期设备和资金投入问题,有点像风投。然后通过公开销售(ICO)吸引外部投资人,筹集了数千万美元。这个机制看起来有点毁三观,确实也被很多加密货币利用来割韭菜。
有些人认为用通用计算机挖矿反而更不安全,容易让加密货币贬值,而且大互联网公司可能会占便宜,比如利于自己的云服务集群达到牟利目的。
以太坊的难度调整分为基础难度调整和难度炸弹两部分,目标是维持平均出块时间稳定在 15 秒左右,难度调整粒度为 1/2048 的整倍数,出块时间短于 15 秒则加大难度,慢于 15 秒则降低难度。以太坊遵循与比特币类似的 “最长合法链” 规则,但更强调总难度最大的链为合法主链。
系统会基于一个完整周期(2048 个区块)内的出块时间加权平均值,重新计算下一周期的难度目标,将叔叔区块也纳入难度计算。
难度炸弹则是以太坊向权益证明过渡的核心设计,通过指数级增加挖矿难度迫使矿工放弃工作量证明。因开发进度延迟,以太坊通过多次升级推迟难度炸弹生效时间。
以太坊从工作量证明转向权益证明后,尽管初期存在矿工抵制(如部分转向分叉的旧链 ETC,以抗议挖矿收益暴降),但多数投资者和开发者支持这一变革,因为其显著降低能耗(减少 99%)并提升交易效率。
截至 2025 年,以太坊质押率超过 30%,表明多数投资者接受权益证明的经济模型。
下文我们聊聊智能合约历史上的黑客攻击事故,以及加密货币行业的反思。