区块链/等级 IX · 速度与奇观/9.2 公平的市场/课程 2
管理员密钥与不可篡改性
合约盗窃的根源,以及终结它的密封金库
材料具备合约查询功能的区块浏览器(例如 Solscan 或 Etherscan)SPL Token 关于权限字段的文档OpenZeppelin 代理升级文档经过审计的智能合约的源代码
好奇
- 什么是铸币权限?它允许持有者做什么?
- 为何可升级的代理既能成为安全功能,又会变成后门?
- 如果移除管理员密钥虽然能防止攻击,但也会阻碍问题的解决,那么由谁来决定社区应承担哪种风险呢?
探索
- 许多跑路事件都可追溯到某种被保留的权限。铸币权限让持有者可以随意增发无限量的代币并卖入市场。冻结权限或黑名单可以阻止特定持币者转移余额。所有者可自行设置的交易税可以把卖出手续费提高到100%,把流动性困在原地。每一项都是某个人手中握着的一把密钥,而每一项都可能被用来对付它本应服务的那些人。
- 可升级代理将存储与逻辑分离:状态保存在一个地址中,而代码则从另一个地址执行,管理员可以随时替换后者。这样可以在发现漏洞时打补丁,但也意味着代币的规则可能对所有持币者追溯性地改变。在 DeFi 攻击事件中,代理升级曾被滥用,在部署后转移资金或改变协议行为。鱿鱼游戏代币(2021年11月)展示了保留控制权会导向何处:其合约允许任何人买入,却阻止普通持币者卖出;当创建者套现后,价格在几分钟内就跌至几乎为零。
- 这种权衡是结构性的。移除铸币密钥,就没有人能增发代币;移除池子流动性的提取路径,就没有人能抽走储备。代价是,开发者、审计方或社区成员都无法修复漏洞、应对紧急情况,也无法在条件变化时调整参数。在无需许可的市场中,每一项管理权限同时既是攻击面,也是维护工具。它为哪一方服务,取决于密钥持有者是否善意行事并妥善保管密钥。
- 钱包层的防护措施无法替代合约层面的设计。用户可以撤销代币授权、避免签署未知交易,并在交互前核实合约地址,但这些做法对正在被使用的铸币权限,或在交易中途改变规则的代理升级毫无作用。在 SPL 代币中,铸币权限总是在创建时设定,并一直有效,直到被设置为 None;冻结权限是可选的,如果创建时未设置,之后就永远无法添加。无论哪种情况,只要权限仍然有效,它就能发挥作用,与用户是否谨慎无关。
- OpenZeppelin的代理文档清晰地说明了其架构:实现合约负责处理逻辑,而代理则负责管理状态,并通过delegatecall将所有调用转发给实现合约。升级操作只需将代理指向新的实现合约地址即可。虽然这是团队发布修复补丁的方式,但也意味着任何拥有升级权限的人都可以通过单次交易来替换整个规则集。所谓“修补”与“盗窃”的区别纯粹是行为上的差异,而非技术层面的差异。
- 检查代币的合约可以看出哪些密钥仍然有效。在 EVM 链上,要检查合约是否存在所有者(owner)角色,以及它是否部署在可升级代理之后;在 Solana 上,要检查铸币权限和冻结权限,以及永久委托、转账钩子或转账费等 Token-2022 扩展。每一项缺失或已被撤销的权限,都会消除相应的一类攻击。剩余的风险则转移到人身上:网络钓鱼、冒充身份和社交操纵完全发生在代码之外。
- 许多智能合约在发布后仍可被修改。在 Solana 上,程序默认可以通过“升级权限”密钥进行升级;而在以太坊等 EVM 网络中,除非采用将执行任务转发给可替换实现合约的代理模式,否则这些合约是不可更改的。这种设计虽然便于修复漏洞和添加新功能,但也意味着用户今天使用的代码可能与昨天看到的代码不同。
- 可变性的风险在于信任的集中。如果开发者持有管理密钥,理论上可以随时更改代币供应量、冻结用户账户或抽干流动性池。这相当于一种“上帝模式”,与区块链的去中心化理念背道而驰。2016年6月The DAO遭黑客攻击后,以太坊社区曾争论是否通过硬分叉来撤回被盗资金——这一举措最终使链分裂为以太坊和以太坊经典。该事件凸显出,即便是网络层面的变更也伴随着深远的治理风险。
- 不可变性彻底消除了这一风险。通过撤销所有管理权限——例如 Solana 上的铸造、冻结和程序升级权限,或在 EVM 链上不使用代理、不设所有者角色进行部署——合约就成了一座密封的金库。部署之后,任何人都无法再更改规则。线上运行的代码只需与经过审计的代码比对一次,此后便始终保持不变。这消除了内部人员滥用权力的威胁,但也会把任何潜在漏洞永久固定下来。
- 不可变性的代价是永久性。如果存在严重漏洞,就没有补丁可打,只能通过迁移到新合约或进行网络分叉来解决。这提高了发布前验证的重要性。团队必须在部署前大量投入于形式化验证、大规模模糊测试和多方审计。负担从发布后的维护转移到了发布前的严谨把关。任何一个被忽略的边缘情况,都会成为系统的永久特性。
- 比特币是“可信中立”的参照标准。其规则只能通过数千个独立节点之间的广泛共识来修改,而非由某个单一实体决定。不存在能够更改区块奖励或交易有效性的管理密钥。正是这种刚性,使许多人认为比特币具有可信中立性:没有任何一方能够改写它的规则。
- 对于代币设计者而言,选择不可变性表明了对透明度的承诺:用户可以验证已部署的代码不会被修改。但这一选择也意味着必须接受错误不可逆转。其中的权衡很明确:要么获得用户可验证的可预测性,要么保留灵活性,代价是引入单点故障和潜在的滥用风险。
部分 I管理员密钥:合约盗窃的根源
部分 II不可变性与无管理密钥
关键事实
- 铸币权限允许其持有者创建新代币;如果被保留,就可能被用来稀释所有现有持币者。
- 鱿鱼游戏代币(2021年)允许任何人买入,却阻止普通持币者卖出。
- 可升级代理将状态与逻辑分开存储,使管理员密钥既能用来打补丁,也能追溯性地修改规则。
- 将所有者控制的卖出税设置为100%,就相当于貔貅盘:持币者不触发这笔费用就无法退出。
- 在部署时放弃铸币、冻结和升级权限,可以消除这几类攻击,但也会彻底失去未来的维护能力。
- SPL 铸币权限会一直有效,直到被设置为 None;冻结权限如果在创建时设置,会一直有效,直到被撤销。
- 在 Solana 上,一旦某个程序的升级权限被撤销,该程序就会变得不可更改;而代币的铸造与冻结权限则可以分别被撤销。
- 未使用代理模式部署的 EVM 合约在部署后无法升级。
- 2016年6月发生的DAO黑客攻击导致了一次硬分叉,使得以太坊分裂为两条链。
- 比特币的规则只能通过分布式节点之间的广泛共识来修改,而非通过管理密钥。
- 不可变性消除了内部人员滥用系统的风险,但也会使得产品在发布后无法进行错误修复。
- 由于不可变合约具有永久性,形式化验证与大量测试对其至关重要。
练习 九、六、三、一
9收集列出9个代币合约或协议部署。逐一注明其铸币权限、冻结权限和升级代理是分配给了某个地址,还是已被放弃。
6归类按照各自保留了哪些管理权限,将这9个归为6组。
3提炼根据被保留的权限是否可能在没有社会或法律救济途径的情况下被用来对付持币者,将这6组归纳为3类。
1凝结用一句话说明:从技术上讲,维护权限与攻击面之间有什么区别(如果有的话)。
事实核查
日期、数字及数据均依据下方列出的已发表资料进行核实。
- Solana Program Library, SPL Token documentation
- OpenZeppelin, 'Proxy Upgrade Pattern' documentation
- Contemporary reporting on the Squid Game token collapse (November 2021)
- Chainalysis, Crypto Crime Report (2024)
- Solana documentation: deploying programs (upgrade authority)
- V. Buterin, 'Credible Neutrality as a Guiding Principle' (2020)