不可变智能合约去哪了?

不可变智能合约去哪了?

由英语翻译

当 DeFi 刚开始获得动力时,它最有力的卖点之一就是不可变性。倡导者会把智能合约与中心化服务(如交易所或赌场)进行对比。

叙述很简单也很有说服力。

  • 中心化交易所、赌场、支付处理商和类似服务需要信任其所有者。所有者可以冻结你的账户、更改手续费、卷款而逃,或在第一次要求时把你的加密货币交给政府。
  • 相比之下,DeFi 本应只需要信任智能合约代码的可靠性。智能合约被比作嵌入区块链混凝土中的自动售货机。它的规则事先已知,且无人——既不是开发者,也不是警察或法院——能在上线后更改它们。

几年过去了。今天,这一叙述实际上已经死去,即便很少有人公开承认这一点。绝大多数现代 DeFi 协议(Aave、Compound、Uniswap V3、Sky Protocol、各种跨链桥和 L2 解决方案)从技术角度看都是可升级的。它们的管理者持有的密钥可以把智能合约变成更像常规网页服务器的东西,其后端可以在任何时刻被更新。

这场悄无声息的革命是如何发生的?开发者究竟如何学会绕过区块链的不可变性?在我们仍称之为“去中心化金融”的世界里,是否还有任何真正不可变的东西?

控制的解剖:代理合约如何工作

很多读者此时可能会反驳:“等一下。DeFi 意识形态是在以太坊内兴起的。在争议性的 The DAO 事件 之后,没人敢再在那条链上改写任何东西了。因此任何智能合约的代码在部署后都必须保持不可变。”

这是真的。不仅是以太坊,任何区块链都是一个只追加的数据库。一旦合约被写入链上,就无法被抹掉。

然而,开发者找到了一种优雅的变通方法,最终成为行业标准:代理模式(Proxy Pattern)

想象一个应用不是由单个合约构成,而是由两个合约构成。

  • Proxy(代理) 是外部接口。它有一个固定的链上地址,用户与之交互,所有代币和余额记录都存储在那里。但这个合约故意很薄:它不包含核心金融逻辑。
  • Implementation(实现) 是内部机制。公式都在这里:如何计算利息、如何兑换代币、谁被允许提取多少。但这个合约本身不持有加密货币。

当你存入或提取代币时,你与 Proxy 交互。Proxy 使用一种低级指令 delegatecall 来读取 Implementation 合约并在 Proxy 自身的存储上下文中执行其代码。

在 Proxy 合约内部,有一个变量(通常通过一个内部的 _implementation 函数暴露)存储着当前 Implementation 的地址。还有一个只有管理员可访问的特殊函数:upgradeTo(newAddress)

代理合约

在任何时刻,Proxy 的管理员可以:

  • 将一个新的 Implementation 合约部署到区块链(例如加入新功能或修复漏洞);
  • 在 Proxy 上调用 upgradeTo 并指向新的 Implementation 地址。

之后,Proxy 立即开始使用新的逻辑。

从用户的角度看,一切似乎未变。合约地址相同,他们的加密货币仍存放在那里。但实际上,系统的规则可能已经完全改变。

如果管理员部署了一个恶意的 Implementation(例如允许管理员提取所有资金的实现),Proxy 会服从地交出所有加密货币——因为它会盲目地执行被指示使用的任何代码。

我们为什么同意这样做?

从不可变性转向可升级性并非出于恶意——它是由必要性驱动的。

首先,让我们回顾一下 The DAO 的故事。其智能合约中的一个漏洞让黑客抽走了大量资金。为了解回这些资金,以太坊节点运营者做了一件对加密纯粹主义者来说是异端的事:他们重写了区块链历史以撤销黑客的交易。整个事件说明了一点——不可变的代码意味着不可变的漏洞。如果合约有缺陷,就无法打补丁。那就只剩下两种选择:对整个网络实施中心化控制(如当时的以太坊所为),或对单个合约实施中心化控制。随着时间推移,行业选择了看起来较小的恶:允许在合约层面上保持中心化控制,同时在生态系统层面保留去中心化的外观。

其次,许多 DeFi 项目本质上是创业公司。它们需要演进——添加新策略、支持新代币、修复边缘情况。没有代理合约,每次更新都会迫使用户从旧合约中取出资金并存入新合约。那既笨拙又昂贵,不利于用户采用。

第三,监管机构加入了讨论。DeFi 严重依赖稳定币,而监管者坚持这些必须包含诸如地址黑名单和可升级逻辑之类的功能以符合金融规则。即便是曾经作为去中心化稳定币代表的 MakerDAO,也不得不屈服于压力。在其以 Sky Protocol 重新品牌后,它在新稳定币 USDS 中加入了由管理员控制的功能。

用户呢?他们用钱包投票。高收益(APY)和华丽的界面对大多数人来说比抽象的去中心化理想更重要。

去中心化的幻觉:谁握着“红色按钮”?

许多项目仅仅因为其管理员密钥不由单一个人控制就声称自己是去中心化的。但这真的改变了什么吗?

当升级密钥由一个开发者持有时,这显然是最危险的情形。如果那个人被入侵或受到胁迫(无论是被迫还是法律压力),用户资金可能在瞬间消失。然而这种设置仍然很常见——尤其是在经常被当作不严肃项目的表情包币合约中。

有时密钥被拆分成多份——比如五个人(通常是创始人和早期投资者)各持一份,需要三签才能做出更改。但这仍然是中心化的。勾结是可能的,国家干预也是可能的。

一种稍微安全的选择是 Timelock(时间锁)机制。在这里,管理员可以安排一次升级,但它要在 24–48 小时后才生效。这给用户时间审查新代码并在更改恶意时取出资金。但实际上,没有人能全天候 24/7 监控合约。而在紧急情况下(例如正在发生的漏洞利用),24–48 小时足够攻击者抽走一切。

较小的恶是基于 DAO 的治理。在 Compound 和 Uniswap 等协议中,升级权限由与代币持有者投票相连的智能合约处理。只有在足够多的票数支持时,变更才会发生。从理论上讲,这是迈向真正去中心化的一步。但在实际中,大型风投基金(如 a16z 或 Polychain)持有如此多的治理代币,以至于它们几乎可以推动任何决策。此外,投票率通常很低,使得过程容易被控制。

不可变性的孤岛:谁依然保持不变?

是否仍有那些“代码即法律”的 DeFi 服务?有——但它们现在在生态系统中占据非常狭窄的利基市场。这些是真正不可变智能合约的少数例子。

Uniswap V1 / V2
这些版本的流动性池完全不可变。开发者、投资者甚至政府都无法提取资金、修改公式或更改规则。智能合约一经写入便已成定局——没有管理员密钥,也没有升级路径。

Liquity USD (LUSD)
LUSD 合约没有管理员密钥,也没有升级函数。系统参数在启动时被数学上硬编码,永远无法更改。这使它成为 DeFi 中最具弹性的稳定币之一。它的使用并不广泛——也许是因为人们认为它缺乏流动性。但那是个误解:

  • 在协议层面,每个 LUSD 始终可以兑换为支持它的 ETH。
  • 在 rabbit.io 上,LUSD 可以与任何加密货币进行无限制或不受限制的兑换。

Tornado Cash V1 / V2
Tornado Cash 的早期版本最初有管理员密钥——这是在实时环境中修补漏洞所必需的。但一旦协议被证明稳定,控制权就被放弃:管理员密钥被发送到 0x00...0000 地址,使合约完全不可变。

这一决定凸显了不可变性的一个根本真理:它可以防御治理攻击。

Tornado Cash V3 为例作为警示。该版本引入了改进:灵活的存款规模(不再仅限 0.1、1、10 或 100 ETH)和通过 Gnosis Chain 的 L2 私密转账系统。为了让如此复杂的协议能够升级和打补丁,治理被交给了一个 DAO——具体来说,是持有 TORN 代币的人。

在 2023 年,一名攻击者提出了一个看似无害的治理更新。隐藏在代码中的是一个后门。一旦通过,它就赋予攻击者对 DAO 的完全控制。他们劫持了合约逻辑并窃取了一部分治理代币。

在不可变版本中,这类攻击从物理上来说是不可能发生的。没有升级路径。没有投票。没有红色按钮。

以太坊之外:其他生态如何处理合约升级

代理合约已成为 EVM 兼容区块链的事实标准。但非 EVM 生态呢?

Solana
在很多情况下,不可变性比以太坊更弱。默认情况下,Solana 智能合约可以使用一个 Upgrade Authority 进行升级。开发者可以 放弃 这一权限以使程序不可变,但在 Solana 那种快速发展、以创新为先的文化中,如此做法很少见。Near Protocol 也有类似情况,可升级性同样是常态。

Polkadot 和 Cosmos
这些生态采取不同的方法:更新不是通过合约内的管理员函数发生的,而是通过验证者层面的治理来实现。当你在这些网络的智能合约中存入资金时,你信任的不是合约管理员,而是整个链的验证者会诚实行事。

Cardano
Cardano 支持几类智能合约,但主要的是 Plutus 脚本,它们构建在严格的不可变模型之上。

  • Plutus 脚本绑定到特定的 UTXO,其代码被哈希进地址本身。
  • 一旦部署,代码就无法更改——绝对不能。
  • 如果开发者需要修复漏洞或修改业务逻辑,他们必须部署一个具有不同哈希的新脚本并手动迁移资金。
  • 由于这种架构,代理模式是不可能的。

从技术上讲,Cardano 也支持链下逻辑合约,这些合约可能被用于构建带有管理员控制的可升级系统。但在实践中,这类设计很少见——不像在 EVM 链上那样普遍。

比特币生态
是的,比特币也有智能合约协议。

  • RGB
    在这里,智能合约和代币状态都本地存储在用户设备上,而不是链上。没有一个可以由管理员升级的集中合约。如果代币发行方发布新规则,用户必须选择是否接受更新——就像在你的设备上升级应用一样。没有办法对所有用户同时强制变更。
  • Stacks
    Stacks 中的所有智能合约在部署后都会变得不可变。更新只能通过模块化架构引入:新功能通过与原始合约交互的独立合约添加,但它们不能覆盖或更改现有规则。换句话说,任何更新都是一种补充,而不是修改。原始逻辑保持完整并可强制执行,部署后的合约任何部分都不能被追溯性更改。
  • Elastos 和 Rootstock
    这些是 EVM 兼容的侧链,这意味着它们遵循与以太坊相同的升级模式。开发者可以实现代理合约并保留管理员控制,就像在任何 EVM 链上一样。

因此,即便在传统上比灵活性更重视不可变性的比特币社区中,现在也有允许服务运营者在接受用户资金后修改规则的智能合约协议。

代码即法律

结论

看起来“去中心化应用”这一术语往往不过是一个营销噱头。这并非必然是坏事:在发现漏洞时,可更新智能合约的能力已挽救了数十亿美元。但用户必须理解其中的风险:

  • 在传统的中心化服务中,你可能会因为不持有钱包私钥而失去加密资产。
  • 在现代的DeFi 中,你可能会因为管理员能改变锁(即智能合约的规则)而失去加密资产。

真正的不可变性仍属于像 Tornado Cash ClassicLiquity 以及 Cardano 或基于 比特币 的原生解决方案等保守协议,它们为安全牺牲了灵活性。其他一切最终都归结为信任——对隐藏在光鲜“DAO” 标签背后的团队的信任。