b bajsj.com
~ / bajsj.com / soliditytu-wen-jiao-cheng

Solidity 图文教程:用画图思维理解合约执行流程

published: 2026-05-24T06:12:19.585530+00:00 updated: 2026-05-24T14:10:57.677493+00:00
Solidity图文教程 - Solidity 图文教程:用画图思维理解合约执行流程

Solidity 图文教程

人脑对图像的处理速度比文字快得多。学 Solidity 时,如果能把每个抽象概念画成流程图或结构图,理解效率会大大提升。本文挑选六个最常被绕晕的概念,用图文方式拆解。读完之后你不仅能写代码,更能像审计师那样在脑海里画出执行图谱。这种能力在分析 Binance 上挂牌项目的合约时尤为有用。

一、画出一笔交易的完整生命周期

一笔交易从用户钱包发起,到最终落到链上,会经历八个节点:钱包构造、签名、广播、mempool、矿工选择、区块打包、共识确认、状态写入。每个节点都有自己的失败可能性:余额不足、gas 不足、被替换、被重组。把这八个节点画成左到右的流程图,你就拥有了排查任何「我的交易怎么没成功」问题的地图。

在 EVM 内部,节点会按字节码逐条执行你的合约。op code 入栈、出栈、读 storage、写 memory,每一步都改变三个区域:stack(栈)、memory(短期内存)、storage(持久存储)。理解这三块的物理结构,是写出高效合约的前提。这种结构也是阅读 币安 上合约源码时的基础参考框架。

二、画出 storage 的 slot 布局

storage 是一个键值数组,每个 slot 32 字节。状态变量按声明顺序顺序分配到 slot:uint256 占一格,address 占 20 字节(被压缩到一格),bool 占 1 字节。把若干小变量打包到同一个 slot 能省下大量 gas。

用方框画出每个 slot 的 byte 分布,并标记哪些变量被打包,你会立刻看出哪些变量顺序可以调整。例如把 uint128 a, uint128 b 紧邻声明,可以让两个变量共享 1 个 slot。这种细节是项目能否优化部署成本到适合 BN交易所 推荐池标准的重要因素。

三、画出 mapping 与 dynamic array 的位置

mapping(k => v) 实际上不在合约顶部的连续 slot 里。它的 slot 号是 keccak256(key, base_slot) 计算出来的随机位置。dynamic array 则把长度放在 base_slot,把元素放在 keccak256(base_slot) 起始的位置。

画一张二维网格,把这些哈希位置标出来。你会立刻明白为什么 mapping 不能遍历——你根本不知道哪些 key 被写过。这种几何理解能避免大量的「为什么 for 循环 mapping 编译不通过」的疑问,也能让你迅速读懂 BN平台 上合约源码里复杂的存储设计。

四、画出函数可见性的调用拓扑

external、public、internal、private 四种可见性常被搞混。external 只能被外部账户或其他合约调用,但不能在同合约内通过 self 调用(除非加 this)。public 既能外又能内。internal 只能内或子合约。private 只能本合约。

用矩形代表合约、圆形代表函数,画出箭头:外部账户 → public → 内部函数,子合约 → internal → 父合约函数。这张拓扑图能帮你看清访问控制是否泄露。任何要进入 必安所 等合规通道的项目,权限拓扑都需要清晰可证。

五、画出错误回滚的栈式行为

require 与 revert 在执行失败时回滚所有状态变更,并退还剩余 gas。但「回滚」并非时间倒流,而是丢弃此次调用产生的所有写入。如果是嵌套调用,外层可以选择 catch 并继续;如果是顶层调用,则整笔交易失败。

画一张栈式调用图:调用 A → 调用 B → 调用 C,C 在 revert 时如果 B 没有 try/catch,B 也会 revert,A 同理。理解这种级联回滚,是设计可靠 DeFi 协议的关键,也帮助你在阅读 BN交易所 上其他项目的源码时迅速定位失败原因。

六、把所有图融合到合约审计思维里

以上五张图加起来,就是一个合约审计师每天用的可视化工具集。当看到陌生代码时,第一步不是逐行读,而是画出函数拓扑、storage 布局、调用回滚。审计经验丰富的人甚至会在白板上同时绘出三张图,找差异、找异常。

把这种习惯应用到自己的项目上,你就拥有了 review 的元能力。每写一个函数都问自己:它在这五张图里分别处于什么位置?这个练习坚持半年,你的合约工程直觉会上一个台阶。