涉及模块:智能合约、ERC-20 铸币、DEX 滑点、mempool/PBS、EVM/Gas(notes/07/08/09/10/14)

Q1

:关于合约、链上币的产生和约定或限制、交易、打包、竞争、确定、以及对应的交易中耗费和结果以及对应的数据和意义请做详细解释,为了方便解释可以直接输出html格式内容,这样方便在需要的地方样式布局及动态展示说明等。

输出为一份可交互的 HTML 讲解页("账本"视觉:暖色纸张底、宋体标题、藏青墨绿+铜色强调色), 按真实发生顺序组织成五节,永久保存在 2026-07-27-链上账本手记.html

  1. 合约:部署地址下的字节码 + 持久化 storage;核心约束是确定性执行(全网独立验证的前提), 所以合约不能有非确定性来源(时钟/随机数/HTTP),这是预言机存在的根本原因。
  2. 链上"币"怎么产生:两种机制(tab 切换对比)——
    • 原生币(协议层):比特币区块奖励每 210,000 块减半、总量趋近 2100 万;以太坊 PoS 发行量随质押量变化 + EIP-1559 base fee 销毁,净发行可能通缩。规则写在共识客户端里,改它要说服全网(硬分叉)。
    • 代币(合约层 ERC-20)mint() 只是把 balance 和 totalSupply 同时加一个数,纯粹的状态转移, 没有链层面的保证;给出真实 Solidity mint() 代码(onlyOwner + cap 检查)和约束模式对比表 (一次性铸完 > Capped > AccessControl 角色 > 单一 onlyOwner,可信度递减)。 关键结论:供给规则的可信度 = 这份合约代码(以及谁能升级它)的可信度,不是链本身赋予的。
  3. 交易的一生(5 步可点击 stepper):构造签名(nonce 严格递增)→ 竞价广播(EIP-1559 base fee 销毁 + priority fee 才是真正竞争的钱)→ 打包(builder 按总收益最大化排序,不是先来后到; PBS 拆分 proposer/builder)→ 执行(EVM 逐条 opcode,revert 已耗 gas 不退)→ 确认(PoW 概率性 / PoS epoch 终局性)。
  4. 耗费与结果:gas 三层账(起步价 21000+calldata 字节费 / opcode 计价,cold/warm SLOAD、SSTORE 写非零槽 20000 / 退款封顶实耗 1/5);可拖动滑块的实时 gas 计算器(调 base fee/tip/gasUsed/ 成功-失败,实时算出扣费拆解,明确"revert 也要付钱")。
  5. 数据与意义:交易收据字段(status/gasUsed/logsBloom);事件日志结构 (topics[0]=事件签名哈希,indexed 参数进 topics 最多 3 个可被哈希索引过滤,非 indexed 进 data 只能整段下载解码);这是区块浏览器/subgraph/套利机器人"看懂链上发生了什么"的唯一入口。

同步状态:✅ 已同步到 notes/07-EVM与Gas.md(gas 三层账/收据/日志)、notes/14-mempool与PBS.md (竞价打包/PBS)、notes/08-智能合约.md(合约确定性)、notes/09-ERC20与approve机制.md(铸币约束)—— 均为补充说明,未更正原有正文。原始 HTML 文件永久保存在本目录。


Q2

:其中单独添加一个部分结合底层和原理进行一个完整的解释说明和呈现,包括对应的链上以及实际调用数据还有实际交易中相关的种种,比如链的书写和部署、构造函数里面干了什么、ABI、data以及对应在实际部署链上进行函数匹配、参数传递和调用返回等,还有就是关于单一链上和交易双方的滑点、gas、竞价等细节。

在同一份 HTML 里新增第六节"底层解剖:一次调用到底怎么落地",作为对一/三/四节的"放大镜", 分七个部分(同步更新到 2026-07-27-链上账本手记.html):

A. 部署与构造函数:solc 编译产出运行时字节码 + 创建字节码(= 运行时字节码 + 只跑一次的构造逻辑)+ ABI;部署交易 to 留空,data = 创建字节码(构造参数编码后拼在末尾)。构造函数把参数写进 storage,或者直接烧进 immutable(编译期嵌进运行时字节码本身,读取不用 SLOAD,省 gas);跑完用 RETURN 把运行时字节码交出去,构造函数逻辑本身从此不再是这个地址代码的一部分。新地址算法: CREATE = keccak256(rlp([sender,nonce])) 后 20 字节;CREATE2 = keccak256(0xff++deployer++salt++ keccak256(initcode)) 后 20 字节——CREATE2 能在真正部署前就算出地址(Uniswap V2 pair、ERC-4337 智能账户 反事实部署都靠这个)。

B. ABI:链上只有字节码,没有函数名/参数类型这类人类可读信息,全部记在链下的 ABI JSON 里—— 这是未验证合约在 Etherscan 上读写面板是灰的的原因。编码规则:定长类型补零对齐 32 字节;变长类型用 "偏移量指针+长度+数据本体"三段式,本体统一堆在 calldata 尾部。

C. calldata 剖面:用真实的 swapExactTokensForTokens(uint256,uint256,address[],address,uint256) 拆解——选择器 = keccak256(函数签名)[:4] = 0x38ed1739,之后逐 32 字节给出 amountIn/amountOutMin/ path偏移量/to/deadline,path 数组真身(长度+每个地址)放在尾部;配一条颜色分段的可视化字节条 + 图例。

D. 链上函数匹配(dispatch):运行时字节码开头是编译器生成的分派表——CALLDATALOAD 读前 4 字节,一串 EQ+JUMPI(或二分查找式跳转)比对已知 selector,命中就跳到对应函数体; 全不命中且带 calldata 走 fallback(),纯 ETH 空 calldata 走 receive()

E. 参数传递与返回值解码:编译期已经把每个参数在 calldata 里的字节偏移算死,函数体直接用 CALLDATALOAD/CALLDATACOPY 按偏移取值;返回值编码后写进 memory,RETURN(offset,length) 交还, 调用方必须按自己预期的类型解码,链不会替你检查对不对。eth_call(只读模拟,不花 gas)和真正发交易 走同一套匹配/执行逻辑,差别只在结果要不要写回状态、要不要收费。

F. 滑点:精确定义 = 预期价格与实际成交价格之差;两种成因——机制性滑点(AMM 按 x·y=k 曲线定价,交易本身相对池深越大、价格被推得越远,跟有没有人抢跑无关)vs 时间差滑点 (报价到落地之间被别人的交易先改变了价格,直接关联竞价排序)。amountOutMin 就是滑点容忍度在 calldata 里的具体字节,实际输出低于它整笔 revert(gas 依然扣)。三明治攻击 = 竞价排序权(D 篇/ 第三节)+ 滑点容忍空间(F)拧在一起的具体机制:攻击者用更高 priority fee 把买单排到你前面推高价格, 吃掉你的 amountOutMin 容忍空间,随后反向卖出获利——滑点容忍度设得越宽,可被榨取的空间越大, 这是"滑点不是设越大越安全"这个反直觉结论的根源。

G. 完整剖面表:把选择器/滑点参数/路径参数/竞价/执行匹配/成功结局/失败结局,逐行对应回 一/三/四节的具体章节和这一次调用的具体字节/参数/判断,作为收尾串联。

同步状态:✅ 已同步到 notes/08-智能合约.md(部署/构造函数/CREATE2/ABI/calldata/dispatch/ 参数传递)和 notes/10-DEX与AMM.md(滑点机制性 vs 时间差、三明治攻击串联),均为补充说明, 未更正原有正文。原始 HTML 文件(含新增第六节)永久保存在本目录,同一路径覆盖更新。


Q3

:F滑点部分更细致的讲解为什么买卖和价值高低会有关系,这里需要结合币的数量、公认以及竞争机制和 对应的买卖价格对链上的币或价值的影响,直接写入到对应的md和html文件中。

在 HTML 第六节 F 里插入四段新内容,把"滑点为什么发生"往前推到"价格从哪来"这个更根本的问题 (同步更新到 2026-07-27-链上账本手记.html):

价格不是被写进去的,是被"算"出来的公认值:AMM 池子没有任何地方存"当前价格"字段,只存两种代币各自的 数量(reserves),价格 = reserve_USDC / reserve_WETH 现算出来的比例。没有人"公告"这个价格——它是 全网每一笔历史成交共同留下的残留物:谁愿意用多少 A 换多少 B,成交完这两个数量就永久变一点,下一个人看到的 "当前价格"就是所有前人交易行为叠加后的比例快照。这就是"公认"在链上的准确含义:不是投票表决,是用真金 白银的成交历史"投票"出来的,且这份记录本身写在链上账本里,人人可读可验证,不需要权威机构宣布。

数量怎么决定价格冲击(公式 + 实测表)x·y=k 恒定乘积下,投入 Δx 换出 Δy = y·Δx/(x+Δx),有效成交价 = (x+Δx)/y,现货价 = x/y,价格溢价 = Δx/x——交易数量占池子已有数量 的比例越大,溢价越大,接近线性关系(小额时)。用具体池子(1,000,000 USDC / 500 WETH,现货价 2000)实测: 投入 1,000(占比 0.1%)少拿 0.1%;投入 100,000(占比 10%)少拿 9.1%;投入 500,000(占比 50%)少拿 33.3%——池子越浅、交易量相对越大,"少拿"比例越夸张,纯几何/代数关系,跟有没有人操纵无关。

竞争机制怎么把"公认价格"拉回外部市场:池子价格和外部(交易所/其他池子)价格不一致时出现套利机会, 套利者的买卖动作本身就是公式里的"Δx 投入",把数量比例推回"正确"方向直到两边对齐——池子价格能跟上外部 市场,靠的是套利这个财务动机自动驱动的,不是任何人维护。多个套利者同时盯着同一价差,靠 priority fee 竞速(回到第三节的竞价机制),谁的交易先打包谁吃到差价,池子价格因此常在一个区块内被拉回去。

买卖为什么会反过来影响链上"币的价值"本身:在没有外部预言机时,一个代币在链上的"价值"不是被写进链上的 既定事实,而是完全由买卖双方的交易数量史构造出来的可读数值——每一次买卖不仅让发起人自己承受滑点,还 永久性地重写下一个人将看到的"公认价格"。"价格发现"这个词用在 AMM 上格外贴切:价格不是被发现了一个 客观外部真相,是被每一笔实际发生的买卖持续构造出来的。

三明治攻击的表述相应更新为"数量→价格冲击"公式和竞价排序权拧在一起的具体机制(用的是同一个价格溢价公式)。

同步状态:✅ 已同步到 notes/10-DEX与AMM.md(在今日已有条目基础上补一条深化记录:价格=数量之比的 "公认"框架 + 价格冲击公式与实测表 + 套利竞争闭环 + "价格是被构造而非被发现"的结论),未更正原有正文。 HTML 文件同步更新,同一路径覆盖。