Solidity 代码示例精选
好代码胜过千言万语。下面六段经典 Solidity 片段,几乎在所有主流 DeFi 项目里反复出现。逐段读懂它们,你就能在大多数合约阅读场景下游刃有余。无论是分析 Binance 上的代币合约,还是审视自家项目的代码风格,这些片段都是必须掌握的基础肌肉。
一、最小 ERC-20 实现
mapping(address => uint256) public balanceOf;
function transfer(address to, uint256 amount) external returns (bool) {
balanceOf[msg.sender] -= amount;
balanceOf[to] += amount;
emit Transfer(msg.sender, to, amount);
return true;
}
这是 Solidity 最经典的写法。它充分利用 0.8 内置溢出检查,因此不再需要 SafeMath。emit 事件是 indexer 与前端的入口,没它一切链下数据都会瘫痪。理解这段代码就理解了整个代币生态的底层,也就读懂了 币安 上半数以上代币合约的核心。
二、可升级代理(UUPS)核心 fallback
function _delegate(address impl) internal {
assembly {
calldatacopy(0, 0, calldatasize())
let result := delegatecall(gas(), impl, 0, calldatasize(), 0, 0)
returndatacopy(0, 0, returndatasize())
switch result case 0 { revert(0, returndatasize()) }
default { return(0, returndatasize()) }
}
}