首页 理论教育 以太坊的数据结构和验证规则

以太坊的数据结构和验证规则

时间:2023-07-25 理论教育 版权反馈
【摘要】:以太坊的交易信息是指外部账户发出的已签名的数据包。以太坊区块的数据结构在很多方面与比特币类似。以太坊的区块包含三棵梅克尔树,分别为状态树、收据树和交易树。以太坊中的状态树包含了很多键值对的映射,其中的键是账户地址,相应的数值包括账户签名、余额、序号、合约代码和存储。以太坊中的区块必须通过以下验证规则:图9.3帕特里夏树检查区块引用的上个区块是否存在和有效。

以太坊的数据结构和验证规则

以太坊的状态就是账户的多个对象。以太坊的账户可以分为以下几个字段:

(1)账户当前的序号,是用来保证每笔交易只能被执行一次的计数器;

(2)账户当前的以太币余额;

(3)账户的合约代码;

(4)账户的存储单元

以太坊在公钥账户的基础上增加了合约账户,公钥账户受相应私钥控制,合约账户不受任何人控制,只受记录在区块链上的合约代码控制。公钥账户没有合约代码和存储单元字段。公钥账户向合约账户发送交易信息,触发合约代码的运行。合约代码接收交易信息之后,读取数据并向存储单元写入数据,运行合约代码,并依据运行结果发送消息。合约账户可以看成是自动运行虚拟机

以太坊的交易信息是指外部账户发出的已签名的数据包。数据包包含收款人、发送人、金额、可选数据字段、最大运行步数、每步的执行价格。数字加密货币的交易信息通常只包含前面三个内容。合约账户可以通过虚拟机操作码读取可选数据字段,并保存在存储单元。最大运行步数和每步的执行价格用来计算执行交易所耗费的燃料,以防止交易者滥用计算机资源。

消息是合约账户在合约执行过程中向其他账户发出的虚拟对象。消息与交易信息的不同之处在发出人不同。交易信息是外部账户发出,消息是合约账户发出。消息通常包含发出人、接收人、金额、可选数据字段和最大执行步数。

以太坊区块的数据结构在很多方面与比特币类似。以太坊区块不仅包含交易列表,也包含最近状态。除此之外,还有区块编号和难度系数。以太坊的区块包含上个区块的哈希、区块编号、时间戳、难度系数、随机数、交易列表和所有账户的信息。

以太坊的区块包含三棵梅克尔树,分别为状态树、收据树和交易树。交易树采用简单的二叉梅克尔树。状态树比较复杂,采用帕特里夏树(Merkle Patricia Tree)。以太坊中的状态树包含了很多键值对的映射,其中的键是账户地址,相应的数值包括账户签名、余额、序号、合约代码和存储。然而,不同于交易历史记录,状态树需要经常地进行更新:账户余额和序号会经常更变,更重要的是,各种键会经常插入和删除,数值也会经常变动。帕特里夏树可以在这些操作之后快速地计算出新的树根,而无需重新计算整棵树。此外,它还有两个良好的特性: (1)树的深度是有限制的,即使考虑攻击者会故意地制造一些交易,使得这棵树尽可能地深。不然,攻击者可以通过操纵树的深度,执行拒绝服务攻击,使得更新变得极其缓慢。 (2)树的根只取决于数据,与更新顺序无关。

以太坊中的区块必须通过以下验证规则:(www.xing528.com)

图9.3 帕特里夏树

(1)检查区块引用的上个区块是否存在和有效。

(2)检查区块的时间戳是否比上个区块时间大,但是在15分钟之内。

(3)检查区块序号、难度系数、交易根、叔区块的根和燃料限额是否有效。

(4)检查区块的工作量证明是否有效。

(5)设上个区块的状态为S[0]。

(6)设TX为区块的交易列表,共有n笔交易。依据交易内容进行状态转换S[i+1]=APPLY(S[i],TX[i])。如果发现任何错误,或者程序执行到此所花费的燃料超过了限额,则返回错误。

(7)更新区块的状态,向矿工支付挖矿奖励。

(8)检查区块标题中的状态树根与状态转换结果是否相同。

在进行交易确认的时候,交易者需要确认付款账户是否存在,并有足够的余额。轻客户端可以轻松地进行核实和查询。轻客户端可以要求服务器提供状态转变的证明。从本质上来讲,这样的证明也就是在说 “如果你在状态S的时候运行交易T,状态树的结果会是S′”。为了推断这个证明,服务器在本地创建了模拟的区块,将初始状态设为S,并模拟轻客户端发出交易请求T。这个轻客户端可以向服务器发出各种查询请求,服务器会正确地回应任意的查询。然后,服务器会将所有数据发送给客户端,作为交易结果的证明。客户端会在服务器提供的数据的基础上进行相同操作。如果操作结果和服务器相同,则客户端就接受证明。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈