:2026-03-20 13:15 点击:2
在以太坊黄皮书学习笔记系列的前两篇中,我们探讨了以太坊的基本模型、账户体系以及交易的核心概念,我们将深入到以太坊的“心脏”——区块(Block)以及驱动整个网络状态变化的引擎——状态转换函数(State Transition Function, Δ),理解这两者,是掌握以太坊如何实现去中心化账本和智能合约执行的关键。
如果说以太坊的状态是一个不断变化的数据库,那么每一个区块就是这个数据库的一页“账本”,它记录了特定时间段内发生的所有交易,并包含了前一个区块的“指纹”,从而形成了不可篡改的链式结构。
黄皮书(Ethereum Yellow Paper, v4)中对区块的定义是一个递归的数据结构,核心由以下几个部分组成:
parentHash (父区块哈希):
parentHash来确保它们遵循的是同一条最长的有效链。number (区块号):
number为0,每个后续区块的number都比其父区块大1,区块号是确定区块“新旧”和“高度”的直接依据。stateRoot (状态根哈希):
stateRoot为以太坊的状态提供了一个简洁的、防篡改的“快照”,节点不需要下载整个世界状态数据库,只需验证stateRoot,就能高效地确认某个区块执行完毕后,系统状态是否正确,这是以太坊实现状态同步和轻客户端(Light Clients)的基础。transactionsRoot (交易列表根哈希):
transactionsRoot,任何一笔交易是否存在、是否被篡改,都可以通过这个根哈希高效地验证。**receiptsRoot (收据根哈希)**:
transactionsRoot类似,它记录了该区块内每一笔交易执行后产生的收据的Merkle Patricia Trie根哈希,收据包含了交易执行的结果,例如是否成功、消耗了多少Gas、日志输出等,这对于DApp开发者查询历史交易状态至关重要。bloom (布隆过滤器):
timestamp (时间戳):
extraData (附加数据):
gasLimit (Gas限制):
gasUsed (已用Gas):
gasUsed必须小于或等于gasLimit。
difficulty (难度):
mixHash与nonce (谜题解):
区块不仅仅是交易的容器,它更是一个包含了执行结果、状态快照和网络共识信息的完整数据单元。stateRoot、transactionsRoot和receiptsRoot这三个根哈希,构成了区块的“三重校验机制”,确保了数据的一致性和可验证性。
如果说区块是账本,那么状态转换函数 Δ 就是驱动账本不断翻页、内容不断更新的“引擎”,它是一个数学函数,定义了给定一个前一个状态 S 和一笔有效的交易 T,如何计算出新的状态 S'。
其核心定义可以表示为: S' = Δ(S, T)
这个函数的执行过程,就是以太坊虚拟机的工作流程,让我们一步步分解它:
初始化:
parentHash找到其父区块。stateRoot,加载出完整的世界状态 S,如果节点是同步的,S就是最新的状态。交易预处理:
T。sender)的私钥确实签署了该交易。nonce值是否与发送方账户在状态 S 中的nonce值完全匹配,这是防止交易重放攻击的关键。gasPrice * gasLimit)以及执行交易所需的Gas。执行交易(EVM核心):
init_code;如果是合约调用,则使用目标地址的合约代码。data。gasLimit。.call())。S 中读取账户的存储,或将新的值写回。S 的修改是“暂存”的,只有当整个交易执行成功后,这些变更才会被最终确认。生成收据:
交易执行完毕后,会生成一笔收据,包含执行状态(成功/失败)、消耗的Gas、日志等信息,并将其添加到区块的收据列表中。
状态提交与更新:
S 中的账户余额、Nonce、存储等数据被永久更新。S 会回滚到交易执行前的样子,但已消耗的Gas不予退还。stateRoot:将修改后的整个世界状态 S' 重新计算其Merkle Patricia Trie,得到新的stateRoot'。区块完成:
stateRoot'、transactionsRoot和receiptsRoot被写入区块头。difficulty要求的nonce和mixHash。S',并开始处理下一个区块。状态转换函数 Δ 是以太坊的灵魂,它是一个确定性的、可复现的函数,确保了网络中所有诚实节点对“什么是当前正确的状态”达成一致,正是通过这个严谨的、基于密码学证明的引擎,以太坊才能安全、可靠地运行着全球去中心化的金融和
本文由用户投稿上传,若侵权请提供版权资料并联系删除!