区块链(19):revert 以后为什么仍要核算 Gas 与 nonce
交易先经过签名、余额和 nonce 等可接收性检查,执行中还要为每一步消耗 gas。eth_estimateGas 是在给定当时的状态和参数下模拟,后续实际状态、排序和费用环境可能变化;“估算成功”不是“上链执行成功”,模拟时的读数据可能被其他交易改写。区块链(18):EVM 执行后哪些状态进入状态根中的 revert 撤销执行帧的状态效果,不能据此推断发起者完全不付费用。 flowchart TD S[签名与 nonce 有效] --> I[被纳入区块] I --> E{EVM 执行} E -->|成功| C[状态变化 + 用气 + 回执成功] E -->|revert/耗尽 gas| F[业务状态未按预期改变,仍有费用] C --> B[再检查区块与最终性] F --> B EIP-1559 风格费用把协议动态调整的基础费与交易提出的费用上限、小费上限联系起来;基础费按规则处理,不应简单写成全部支付给验证者。应用实际支出要从回执用气量与生效单位价格复算,不能把 maxFeePerGas × gas...
区块链(18):EVM 执行后哪些状态进入状态根
Bitcoin 的输入消耗产生新输出;EVM 的世界状态主要描述账户的 nonce、余额、代码与存储承诺。合约调用携带发送者、目标、value、calldata 与可用 gas,在给定初始状态和规则版本下按确定性执行产生新状态、日志、gas 消耗及成功或失败结果。区块链(17):执行、共识客户端与验证者怎样拼成一个节点的 CL 不替 EL 重演每一步执行,但最终能否认可载荷依赖执行验证。 flowchart LR I[前状态根 + 签名交易 + fork 规则] --> E[EVM: 栈、内存、storage 与调用帧] E --> A[账户余额/nonce/代码/存储变化] A --> R[后状态根] E --> L[日志与回执: 单独承诺对象] E --> X[revert: 调用帧效果撤销,费用另算] 栈用于操作数,内存是调用期间的临时字节区域,storage 是合约持久化的键值空间;一次调用的中间值不自动变成永久链上状态。外部调用可以转移执行控制,必须区分调用失败返回与 revert 传播、内部状态撤销与发送者实际消耗的费...
区块链(17):执行、共识客户端与验证者怎样拼成一个节点
钱包发送交易到执行客户端(EL)的 RPC,不表示共识客户端(CL)已经选它所在的链头。EL 负责 EVM 执行、状态和交易入口;CL 负责共识网络、头选择与最终性判断;验证者客户端持有签名职责并参加提议/投票。两端通过 Engine API 协作:共识端请求构建执行载荷,并让执行端验证收到的载荷,不能只启动其中一个进程就称作完整的 PoS 节点。 先修区块链(16):Gasper 中链头与终局是两次不同判断。在私网里还须冻结执行与共识客户端的兼容版本、chain ID、genesis、fork 时间表、认证材料、验证者存款与网络连接;否则“节点同步”可能只是一端准备就绪,甚至连接了另一条链。Engine API 的认证材料是本地进程凭据,不可纳入博客素材。 sequenceDiagram participant U as 钱包/应用 participant EL as 执行客户端 participant CL as 共识客户端 participant V as 验证者 U->>EL: 提交签名交易 CL->>EL: Engine ...
区块链(16):Gasper 中链头与终局是两次不同判断
买方问“交易在哪个最新区块?”与卖方问“何时不再因正常分叉而撤销?”必须给出两种答复。Gasper 把 LMD-GHOST 风格的叉选择与 Casper FFG 检查点最终性组合起来:最新的有效投票影响当前 head,满足协议门槛并按规则链接的检查点可逐步得到 justified、finalized 状态。head 改变不等于已 finalized 的检查点被常规改写。 flowchart LR V[验证者最新可用投票] --> H[LMD-GHOST: 选择当前 head] H --> T[新交易暂时纳入] V --> J[FFG: 检查点投票] J --> F[justified → finalized] F --> A[应用按预先约定的终局策略兑现] T -.不能自动推出.-> A 最终性不是“有任意大比例在线节点的一条多数意见”,需核对投票源/目标检查点、权重与历史链接;头部选择也不是只找高度最大或只看最近一笔投票。永久不稳定的网络可以阻止足够投票达成最终性,安全性与活性不能互换论证。长期离线的新节点还涉及弱主观...
区块链(15):PoS 权重、普通惩罚与可罚没行为
区块链(14):PBFT 的法定集合为何需要换主证明的成员集合由参与方事先确立。PoS 引入以质押及协议规则确定验证者参与资格和权重的机制,并不凭这三个字母给出唯一的排序协议或最终性。攻击者不能靠复制网络身份自动增加权重,却可能控制多个验证者、串谋、长期离线或使用被盗密钥双签;系统分别规定奖励、普通罚分和可罚没行为。 flowchart TD D[存入并成为候选] --> A[激活: 权重按协议计算] A --> V[提议/投票与获得奖励] V -->|短暂离线| P[普通惩罚或漏奖] V -->|可罚没冲突证据| S[slashing 与退出后果] V --> E[自愿退出: 等待协议约束] S --> E 不能把任何未按时出块都叫 slashing;离线处罚、持续不活跃导致的 leak、双签或冲突投票的可罚没条件针对不同故障。处罚是否发生还取决于证据能否及时进入链,应用端仅发现两条签名消息不等于协议已执行罚没。退出与取回资产有生效时间、排队、风险保留期等版本相关规则,不能从“停止运行验证者”直接推断即时无风险。安全性...
区块链(14):PBFT 的法定集合为何需要换主证明
先修区块链(01):两份签名都正确,账本仍会冲突的成员问题,以及旧文分布式系统(33):PBFT、恶意节点与信任边界的认证副本。经典 PBFT 把服务限制在已知成员的确定性复制状态机中:n=3f+1,最多 f 个 Byzantine 副本;正确副本的密钥不泄露,网络可延迟与分区。任意两个大小 2f+1 的证书至少相交 f+1 个成员,交集中至少一个正确副本。这个算术只给同槽不双投提供基础,不是完整的换主安全证明。 flowchart LR C[客户端请求] --> P[primary: 分配 view 和序号] P --> PP[PRE-PREPARE] PP --> PR[PREPARE: 检查是否矛盾提议] PR --> CO[COMMIT: 传播锁定证据] CO --> EX[按序执行并回复] P -->|失联或作恶| VC[换主: 携带已准备证据] VC --> PP 恶意 primary 可对两个副本发不同请求摘要;副本通过准备阶段互核 (view, sequence, digest),不能把普通多数...
区块链(13):沿交易和候选块追踪 Bitcoin 总体架构
把钱包、节点、矿工、矿池和链外支付网络画成同一个“区块链服务”,会在故障时找不到责任主体。沿合成订单的支付意图追踪:钱包选币、检查卖家与找零、签署交易;RPC 接收原始字节;网络与本地交易池处理传播和策略;候选块生产者选择交易;独立全节点按共识规则验证块并更新持久化状态。这个顺序不意味着每次提交都成功走到最后一步。 先修区块链(06):Bitcoin 原始交易如何花费、找零和付费到区块链(12):全节点、裁剪节点与轻客户端查的不是同一件事。钱包可与节点同机,也可以只连接远端 RPC;系统部署关系不改变职责分界。开发 RPC 不应默认开放给公网,钱包密钥不应仅因想查询区块而进入节点进程。 flowchart LR W[钱包: 密钥/描述符、选币/PSBT] -->|原始交易| R[RPC 边界] R --> M[P2P + mempool: 接收策略/临时视图] M --> T[挖矿模板: 候选交易和 coinbase] P[矿池: 协调工作分配及结算] --> K[矿工: 搜索有效 PoW] T --> K K --> ...
区块链(12):全节点、裁剪节点与轻客户端查的不是同一件事
04 篇的 Merkle 包含证明只说明叶与某个根相符。让一个轻客户端把这条证明当作支付完成依据,还要回答:根对应哪个区块、区块头链从哪里来、哪条链被选择、交易是否违反当前规则。全节点从可信软件规则与初始化起点出发,自行接收和验证区块;依赖他人提供头与路径的客户端缩小了下载范围,也扩大了必须明示的信任边界。 先修区块链(11):重组时撤销的不是一个确认数字。完整验证需要按规则执行区块及 UTXO 状态变化;裁剪节点完成验证后可删除部分旧块体以节省本地空间,仍不等于停止验证新块。裁剪对历史重新提供、任意旧交易查询、重新扫描钱包和索引可用性有额外约束;不能承诺“开裁剪就有全部链上索引”。SPV 风格检查头链与包含路径,不运行所有交易脚本,因此其安全含义与完整节点检查不同。 flowchart TD P[网络提供头和块体] --> F[全节点: 规则执行与 chainstate] F --> K[裁剪: 已验部分旧块体可移除] P --> L[轻观察端: 头链与包含路径] L --> Q[条件: 根可信、链选择假设、重组策略] K -->...
区块链(11):重组时撤销的不是一个确认数字
一份订单支付曾在 A 分支入块,后台将它标为“可交付”;恢复连接后节点改选另一条有效分支,支付离开当前规范链。旧区块头与旧交易的历史存在没有消失,但按当前链计算的 UTXO 集合已改变。区块链(10):交易池与 P2P 为什么不能当共识账本提到的传播差异只是起点:真正危险的是应用不撤回旧链衍生出的业务决策。 设共同祖先高度 h,A 后继块消费买家输入并支付卖家,B 后继块把同一输入付给攻击者。节点不能简单把两条分支的 UTXO 结果取并集;必须断开被替换区块,撤销旧输出产生与旧输入消费,再按新分支顺序接入块。若旧交易与新分支冲突,它无法自动重新纳入;若仍有效,可能重新进入池等待未来纳入。具体再接收与否还依赖节点政策。 flowchart LR H[共同祖先 h] --> A[分支 A: 卖家收款] --> A2[订单暂记已付] H --> B[分支 B: 冲突支出] --> B2[累计工作胜出] B2 --> U[撤销 A 的 UTXO 效果并应用 B] U --> X[索引与业务账本撤销/补偿] A2 -.不能只留旧状态....
区块链(10):交易池与 P2P 为什么不能当共识账本
一笔合法但费用不足以符合某节点转发策略的交易,可以不出现在它的交易池里;另一节点可能有不同策略或不同视角。区块有效性与交易池接纳不是同一个谓词。区块链(09):为何最长链未必有最多累计工作选候选链时必须先检查区块有效,不能把“曾出现在某个节点的池里”当作验证证据。 P2P 节点发现、连接、传输清单或请求原始字节以后,本地检查区分语法/共识约束、已经花费的输入、节点政策和依赖未确认祖先的交易。网络可以延迟、隔离、重复或丢弃消息,诚实节点之间的交易池也不要求逐秒一致。广播 RPC 返还交易标识只能说明受请求节点的当时处理结果;其他节点能否接收、矿工是否选入候选块、候选块能否成为规范链,都需要额外检查。 sequenceDiagram participant W as 钱包 participant N1 as 节点 A participant N2 as 节点 B participant M as 候选区块生产者 W->>N1: 原始交易 N1->>N1: 共识前置与本地池策略 N1-->>W: 接收标识或拒绝 N1-...













