这是鼎叔的第一百三十篇原创文章。行业大牛和刚毕业的小白,都可以进来聊聊。
欢迎关注公众号《敏捷测试转型》,星标收藏,大量原创思考文章陆续推出。
本文深入聊聊以太坊和智能合约的原理、账户结构、挖矿算法以及权益证明。
相关文章:聊聊区块链和比特币 上,聊聊区块链和比特币 下
本文内容参考了肖臻的《区块链的技术和应用》。
以太坊是怎么异军突起的
比特币的平均出块时间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%,表明多数投资者接受权益证明的经济模型。
下文我们聊聊智能合约历史上的黑客攻击事故,以及加密货币行业的反思。

4767

被折叠的 条评论
为什么被折叠?



