敏捷测试转型 聊聊以太坊和智能合约 终篇

鼎叔 · November 26, 2025 · 10 hits

这是鼎叔的第一百三十一篇原创文章。行业大牛和刚毕业的小白,都可以进来聊聊。
欢迎关注公众号《敏捷测试转型》,星标收藏,大量原创思考文章陆续推出。
继承上文 聊聊以太坊和智能合约 上,我们聊聊以太坊和智能合约发生的著名漏洞,以及对区块链应用行业的一系列反思。
这也是区块链分享文章四部曲的最终章。

对加密货币耗电的反思

对工作量证明最大的质疑是耗电。挖一个比特币的能耗是一千度,前几年比特币的年总收入 60 多亿美金,耗电 150TWE,占全世界耗电量的 0.31%,相当于阿根廷一年的能耗,其利润率能到 57%(还是挺赚钱的)。

而以太坊总耗电量 20TWE,相当于肯尼亚一年的能耗,占全世界耗电量的 0.09%,收入 50 多亿美金,费用是 24 亿美金。每挖一个以太币的耗电是 25 度电,耗电低的原因是出块速度快。但以太币消耗能源还是比信用卡公司高出几个数量级。

但我们再深入想想,加密货币耗电真的就不好么?

世界电能本来就是难以存储的,如果把过剩电能转化为比特币资产,也不失为一种节约。

如果我们采取虚拟挖矿会怎么样?就是把钱投入到加密货币的开发中,配合智能合约,按收入多少来分配收益。

这种方法理论上可行,但是把开发各项工作进行货币化还是很困难的,项目不同阶段的需求权重也不同,开发者也有可能操纵分配规则或者集中抛售,这些都是顾虑点。
权益证明的安全性
权益证明面临内部威胁和外部威胁。
内部验证者利用权益证明中生成区块无需算力成本的特性,同时在多条分叉链上验证区块以获取多重收益。持币大户也可通过垄断投票权修改协议规则,形成利益联盟。
外部攻击者通过购买或租赁代币控制超过 51% 的活跃权益,实现双花或交易回滚,无需长期持有代币。
因此,提高权益证明安全性的方法,就是对作弊的验证者给出处罚,比如没收两边下注者的保证金,对于不投票不作为的人也要进行一定处罚。
验证者要有任期,任期满了以后要过一段检查期后再退还保证金。

智能合约的执行
比如一个拍卖的智能合约,它是被设置成 PAYABLE 的地址,可以接受外部转账。每个参加拍卖的人都会转账定金给这个智能合约并被锁定,拍卖时间结束后价高者得,没有竞拍成功的人会被退还定金。

以太坊的 Solidity 语言是专为智能合约设计的图灵完备编程语言,其核心特点紧密围绕区块链环境的安全性、确定性和资源约束展开,比如原生 Solidity 不支持传统的 try-catch,其错误处理哲学是 “快速失败,状态回滚”。

那么,智能合约遇到程序死循环怎么办?

那就是利用汽油费限制(gas limit),这个是以太坊的核心防护能力。每个操作都会扣掉汽油费,直到超出限制可回滚交易,但是花掉的汽油费不退还(合理!)。

上篇说过,全节点里面有三棵树,状态树,交易树和收据树。矿工在构造候选区块时,先筛选未执行的原始交易数据,按汽油费排序打包至候选区块,然后执行交易并计算三棵树的 Hash,通过尝试不同 nounce 值达成难度目标后,矿工将有效区块广播至网络。其他全节点通过验证三棵树的 hash 确认结果和难度符合要求。如果成功添加到最长链后,交易状态才最终生效。

执行错误的交易也要发布区块链,因为形成共识才能收到汽油费。

智能合约的执行支持并发么?不。

solidity 不支持多线程,状态性必须是完全确定性的,通过 “先执行后挖矿” 的设计,确保所有节点对状态变更达成共识,这也是去中心化信任的基石。

多核对内存访问顺序不同,执行结果可能是不确定的,而造成执行结果不确定的操作都不支持。智能合约不能产生真正的随机数,但可用伪随机数。

智能合约的实际应用中,代码只负责执行,对外宣传得靠自己,比如把合约二维码到处贴。

所谓 Code is law,智能合约一旦发布就不可篡改,坏处是如果实现规则有漏洞,谁也改不了。比如代码缺陷可能发生把收到的定金永远锁住的情况,所以测试非常重要。

黑客可能利用执行漏洞反复提取定金,直到合约中的汽油限制被耗尽。所以在处理逻辑上,判断条件后要先修改状态,再进行交互处理。

历史上最著名的以太坊分叉就是因为上述漏洞被黑客利用导致的。

DAO 的硬分叉事故

DAO(decentralized Automonous Organization),去中心化自治组织,其组织规章制度由代码执行。

The DAO 是以太坊的众筹基金项目,通过智能合约众筹了 1.5 亿美金。既然是众筹,就涉及到如何收回收益的问题。该基金是通过 Split DAO 拆分权益后,把相应份额投到投资人自己的子基金,这个过程无法撤销。拆分前有 7 天冷静期,后面有 28 天锁定期。

遗憾的是由于智能合约的设计缺陷,the DAO 只存活了 3 个月,看下面的代码,犯了 “先转账后清零” 的逻辑顺序错误。攻击者通过递归调用,在账户余额未被清零前反复执行转账操作,最终盗取 360 万枚 ETH(当时价值约 6000 万美元,占以太币全流通量的 15%)。

这个漏洞是代码的一部分,如何解决这个漏洞,引起了巨大争议。

有些人认为这个不违法,不应该回滚交易,强行回滚退钱和去中心化理念不符。

在两派的争议下,以太坊就硬分叉了。

其实这是智能合约自己的问题,不是以太坊的问题,但攻击后果太严重了,合约只能作废。这些钱落到黑客手里,投资人的利益怎么办?

这里体现了去中心化软件的任重而道远:小合约除了错没人管,大合约出了问题则不能倒(too big to fall)。

最终决策要硬分叉和交易回滚的是早期团队,而不是普通代币持有者,这何尝不是中心化的体现。

以太坊要回滚的话,黑客攻击事件以后的交易都需要回滚,系统强行设置挖到 192 万块区块时自动执行,再针对黑客交易的账户进行清退,凡是和 DAO 有关的交易都不允许了。

因为新增的这些逻辑判断增加了汽油费,以太坊上还出现了很多否定交易攻击。

智能合约的反思
1 大多数人投票同意就是对的么?
在以太坊硬分叉后,人数被分流。人数少的分叉,竞争也小,并不是坏事。
至今仍有很多人在旧链(ETC)上挖矿,让旧链的算力也提高了很多倍。还是那句话,有些人是基于信仰,有些人是为了投机。
这个硬分叉还带来了一个不良后果,因为两个分叉中的交易数据很相似,导致重放攻击增多,后来通过增加 chainID 来解决这个问题。
2 智能合约真的智能么?
智能合约可以做任何事,但真还没啥智能的。
3 不可篡改性是优点么?
它实际上是双刃剑。软件要做硬分叉需要给所有人广播理由,就势必把黑客背后的做法公之于众,这又会导致一些投机者模仿黑客的手段来牟利。
作为 the DAO 的普通投资人,发现有问题就应该赶紧通过新合约把资产转移到安全的账户。
不可篡改不代表着不能退款。就像银行转错了钱,能够强行再发起一笔转出操作,来实现 “交易撤销”。
4 智能合约的编码语言是反自然的。语言表达能力太弱、太强都不好,太弱没有办法实现合约逻辑,太强就增加了引入致命漏洞的机会。
5 去中心化和分布式有什么区别?
去中心化不等于分布式。只有在互不信任的实体之前保障共识,才需要智能合约。互不信任的实体本来就没法交易。
区块链的去中心化集群很慢,而互联网公司的分布式系统很快,而且运行的都是中心化应用。
分布式系统都是各自完成一定的计算任务再汇总,而区块链的去中心化节点的状态机不是为了快,而是为了容错,系统比单个机器的性能更慢。类似的容错场景还包括航天控制,交通控制,股票交易等。
区块链应用的透明和开源,好处是可以增加公信力,不然就 “没人玩了”。但是开源软件并不意味着比闭源软件安全。
回到上面的案例,去中心化的以太坊没法强迫大家接受结果,所以允许分叉就是民主理念的表现。

智能合约的后继发展
以太坊的智能合约给各种新出现的代币提供了帮助,ICO(首次代币发行)应运而生。一些加密货币没有自己的基础链,借助智能合约完成以太币和新代币的认购。各种智能合约发行也逐步形成了标准-ERC20。
如果不检查数值运算的边界条件,攻击者可能通过构造极端参数绕过合约逻辑限制,比如 Value 乘法溢出这个曾导致代币凭空增发的致命漏洞。
Solidity 中的无符号整数有固定取值范围。当乘法运算结果超过该范围时,数值会循环归零(上溢)或跳变至最大值(下溢)。导致代币价值瞬间归零。所以用乘法一定要反向运算检测溢出。
前些年智能合约在保险理赔领域有不少应用,但是理赔的慢并不是计算能力的问题,而是人工审核慢,智能合约同样搞不定真实世界的溯源和互动,没有这个环节,写入智能合约的就是假合同或调包合同。

系列文章的总结
区块链的去中心化,不等于用到区块链技术的平台也是去中心化的,去中心化本来就不是一个绝对词。
去中心化不一定都是好事,有利有弊,过度追求去中心化可能引发系统性风险,“代码即法律” 的特性也将一处漏洞的风险成指数级扩散。
而中心化社会的监管,就一定是坏事么?当然不是,监管能够保护大量粗心的用户。但是这种保护已经不是技术层面讨论的话题了。
比特币也不会和当前的交付方式进行竞争。当年用来买披萨的轶事更多是个噱头,目前的支付方式其实没有用户痛点,不过在跨境支付上还有痛点,货币价值交换并没有跟上互联网的发展,支付方式没有和信息传播紧密融合在一起。
再说回本文开头 - 加密货币的效率,能耗大是个问题(虽然在向降低能耗演进),但降低能耗不是加密货币的目标。我们要从历史观来看待这个问题,特定历史时期货币的能耗是不同的,人们更关心货币是否有足够长的生命周期,是否能够低成本触达。
比特币目前的主要功能还是储值增值,而不是为了消费支付。如果它的发展影响了政府的税收,就很难在阳光下发展。

最后,胡思乱想一个问题
目前的 AI 平台都是中心化运营的平台,基于区块链和智能合约机制的 AI 服务,是不是就可以脱离人类掌控?
AI 自己对这个假想的回答是,基于区块链运行的 AI 服务确实有新的挑战,但并非完全不可控:
分布式区块链服务节点无法把单一数据中心进行电源关闭,但是可以把关闭服务的控制逻辑内置在协议里,比如建立智能合约熔断机制。也可以采用经济惩罚杠杆来罚没恶意行为的收入,让要被消灭的服务无人问津,自行灭亡。
果然,用区块链基于人性的魔法打败不能人为关闭的魔法。

No Reply at the moment.
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up