Solidity安全入门指南:新手开发者必须建立的五个安全直觉
区块链合约一旦部署就近乎不可撤回,安全意识必须在写第一行代码时就建立起来。这篇入门指南不堆砌专业术语,而是用五个核心直觉把 Solidity 安全的基本盘讲透,让你少踩 90% 的新人坑。
一、外部调用是「与陌生人交易」
任何一次外部 call、delegatecall、staticcall 都要假设对方是恶意合约。这意味着:在外部调用之前必须先更新自己的 state;外部调用之后不要再依赖该地址返回的数据;如果可能就用 pull-payment 替代 push-payment。
这条直觉直接对应「Check-Effects-Interactions」模式。在 Binance Smart Chain 历史上多起重入事件,本质都是开发者在外部调用后才扣减余额。
二、整数运算必须显式管理
0.8 之前必须用 SafeMath;0.8 之后默认 checked,但 unchecked block 需要谨慎。不要因为代码看起来「应该没问题」就放任溢出可能。
涉及 USDT 余额、利率、份额的计算尤其敏感。一笔 underflow 可能导致用户余额瞬间变成天文数字,造成无限提款漏洞。新手要养成「每次算术都问一下溢出风险」的习惯。
三、不要相信链上随机数
块哈希、时间戳、blockhash 都不是真正的随机数。矿工或验证者可以在某种程度上影响这些值。任何涉及奖励分配、抽奖、罕见品产出的合约,都不能用这些值做核心随机源。
正确的做法是使用 Chainlink VRF、RANDAO 或商业可信随机数预言机。在 ETH 主网上有数十个项目因「便宜随机数」被精准套利,新手务必引以为戒。
四、签名验证三件套:domain、nonce、replay
如果你的合约接受 ECDSA 签名授权,必须做到三件事:使用 EIP-712 domain separator 防止跨合约重放;维护 nonce 防止单合约重放;明确签名内容包含目标 chainId 防止跨链重放。
少做任何一项都可能导致严重事故。在 BTC 跨链与多链桥这类场景,签名重放是最容易被攻击者利用的薄弱点。
五、权限模型不可省略
onlyOwner、AccessControl、Pausable 不是装饰,而是协议守护神。任何敏感参数变更(铸币、提款、参数调整)都必须经过受控的权限路径。
更进阶的做法是把核心权限放到多签或时间锁里,确保即使私钥泄露也有缓冲时间。新手项目最常见的错误是把所有权限给一个 EOA,私钥一旦泄露协议立即归零。
结语
这五个直觉看上去简单,但真正内化进每一行代码并不容易。把它们贴在显示器旁,写代码时主动复盘,你会发现自己的 Solidity 安全水平在几个月内就有质的飞跃。