智能合约
运行在区块链上的代码,确定性执行,一经部署便不可更改(除非你设计成可升级)。
智能合约是被部署到一条区块链上的程序。一经部署,它的字节码不可变,它的状态对公众可读,它的执行由没人能凌驾的共识规则治理。这种永久性既是特性也是风险:生产里的 Bug 永远是 Bug,除非你内置了升级机制(而升级机制本身就是一个漏洞面)。
多数生产级智能合约系统不是单一合约,而是一组:一个 Proxy 实现可升级,一个 Implementation 合约承载逻辑,常常还有一个访问控制合约承载治理。这种模式对任何做过版本化 API 的人来说都不陌生;只是出错的代价更高。
为什么部署纪律不同于普通软件,举个实际例子:在一个 SaaS 后端发布一个 Bug,你打个补丁、一小时内重新部署。在一个持有用户资金的合约里发布一个重入 Bug,攻击者能在你反应过来之前把它掏空,因为没有回滚,而且价值从第一个区块起就在线。这就是为什么问题不是「我们要不要审计」,而是「我们如何安全地结构化升级」。常见答案是把 Proxy 模式放在一个时间锁和一个多签之后:即时升级权威是一个单点故障,没有升级路径让你被第一个 Bug 困死,而对用户透明的时间锁升级是大多数生产系统收敛到的中间地带。
诚实的取舍与创始人常犯的错误:创始人把合约当作一个功能、把审计当作一个可选的报价项。对任何持有非琐碎价值的合约,审计是你能买到的最便宜的保险,通常是 Build 预算里的 1 到 2 周,对着全部在险价值。Wavect 用 Solidity 写 EVM 链上的合约,用 Rust 写 Solana、Near 和 ICP 上的合约,而语言是「你的 web3 用例要求哪条链」的下游产物,不是一种偏好。我们建议在主网之前对任何要紧的东西做第三方审计,我们也已经把审计过的合约部署到生产。跳过审计,正是团队以昂贵的方式学到这一课的方式。