主页 > 安卓怎么下载imtoken钱包 > 以太坊(Ethereum)架构与组成——数据结构与存储

以太坊(Ethereum)架构与组成——数据结构与存储

安卓怎么下载imtoken钱包 2023-05-09 05:41:36

MPT 树结构用于以太坊区块链系统。 MPT树的内容这里就不介绍了。 如果想了解更多,可以参考百度或者书籍和论文。

以太坊节点分类_sitejianshu.com 以太坊以太经典_sitebihu.com 以太以太坊价格

需要指出的是,以太坊区块头并不只有一棵 MPT 树。 对于三个对象,以太坊设计了三棵树:Transaction Tree、State Tree和Receipt Tree。 下图是区块头中三棵树的存储,分别存储了三棵树根节点的哈希值。

sitejianshu.com 以太坊以太经典_以太坊节点分类_sitebihu.com 以太以太坊价格

在以太坊中,区块链客户端需要具备以下功能: 验证某笔交易是否包含在特定区块中; 查询某个地址(即账户)发出的某一类型时间的所有实例(例如判断一个公共合约是否达到目标); 查询账户当前余额; 判断账户是否存在; 查询合约中某个交易的交易输出。

上述功能可以通过三类MPT树来实现,其中交易树处理第一类业务,收据树处理第二类业务,状态树处理后三类业务。

交易树①什么是交易

在以太坊中,一笔交易主要是指一个外部账户[由人创建,可以存储以太坊,公钥和私钥控制的账户,区别于“合约账户”]发送给区块链上另一个账户的消息的签名一个数据包,主要包括发送方的签名,接收方的地址,以及从发送方转移到接收方的以太币数量。

②交易手续费

为了防止用户在区块链公链中发送过多无意义的交易,浪费矿工资源,例如一笔转账金额为0的转账交易,以太坊中的每笔交易都需要支付一定的费用,即发送交易需要为每笔交易支付一定的价格,即交易手续费。 该费用用于支付交易执行所需的计算开销,由将交易打包到主链中的矿工收取。

③什么是煤气

Gas是用来衡量一笔交易所消耗的计算资源的基本单位。 矿工收到一笔交易后,会根据交易内容扣除相应价值的Gas。 当以太坊节点执行一个计算步骤越来越复杂的交易时,该交易消耗的Gas越多。 例如,在转账交易中,矿工会根据转账金额修改交易发送方和接收方的账户余额。 消耗的计算量不高且相对固定,因此收取的gas较少且相对固定。 对于创建或调用智能合约的交易,矿工会根据相应的字节码在EVM中进行相应的操作以太坊节点分类,这会消耗巨大的计算资源[EVM的一些操作计算复杂,增加了需要存储的数据量状态。 数据量],所以这类交易通常会消耗大量的Gas。 一般情况下,一笔普通的转账交易会消耗21,000 Gas,而创建智能合约的交易可能会消耗数万甚至数百万的Gas。

④什么是Gas Price

Gas只是衡量计算资源,以太坊流通的数字货币是以太币(ETH),所以Gas需要兑换成ETH进行支付。 Gas Price(Gas的价格)是单位Gas(即Ether)所需的手续费。 例如一笔转账交易消耗了21,000 Gas,假设Gas Price为1 Gwei/Gas,那么这笔交易的手续费为0.000021 Ether。

显然,对于用户来说,Gas Price 越低越好,甚至为 0。对于矿工来说恰恰相反,所以为了协调这个矛盾,以太坊钱包客户端默认的 Gas Price 为 0.000000001 Ether/Gas (1Gwei, / Gas=1G wei Gas)。 但是,价格仍然可以根据需求波动。 因为矿工有权选择接受交易和收取手续费,他们都希望自己的收益最大化,所以一般来说,矿工会将收到的交易按照Gas Price或者Gas *Gas Price进行排序,并优先选择包含的区域高收入片。 当某段时间交易量激增时,今天早上将交易发送给矿工接受交易,可以提高交易的Gas Price来激励矿工。

⑤什么是gas limit

因为在某些场景下,在交易完成之前无法准确知道交易将消耗的Gas。 例如,调用智能合约的交易会根据不同的执行时间触发不同的操作,因此恶意用户可以发送数十亿步的交易。 没有人可以处理它,矿工也不知道这一点,一旦交易被接受,就会导致拒绝服务攻击。 为了解决这个问题,以太坊设置了 Gas Limit。 对于单笔交易,Gas Limit也称为Start Gas,是指交易发送方愿意为执行本次交易支付的最大Gas量,需要发送方在发送交易时设置。 ,一方面可以避免拒绝服务攻击,另一方面也可以保护用户的资产,不会因错误代码的影响而消耗过多的交易费用。 当交易实际消耗量小于Gas Limit时,矿工将按照实际计算成本收取手续费。 如果实际消耗大于Gas Limit,矿工在执行过程中会发现Gas已经耗尽,交易还没有完成。 此时矿工会将Roll返回到程序执行前的状态,并收取Gas Limit作为手续费。 因此,无论每笔交易成功与否,最大消耗量都不会超过Gas Limit。

对于区块,还有Gas Limit的概念,代表一个区块包含的所有交易所消耗的Gas上限,由矿工决定。 比如一个区块的Gas Limit是100,有5笔交易没有被加入到区块中,那么它们的Gas Limit分别是10、20、30、40、50,这三个交易是不一样的。 这时矿工的打包策略可以是前四笔交易,即10+20+30+40=100,然后放弃第五笔,或者打包第一、四、五笔,即10+ 40+50=100,完全看矿工的意愿,但是打包交易的Gas Limit之和不能超过区块的Gas Limit。 区块的 Gas Limit 设置越大,矿工可以获得的手续费就越多,但同时也需要更多的带宽。 同时也会增加大区块出现的频率,使得被挖出的区块无法形成最长的交易链。 因此,Gas Limit 不能随意更改。 根据以太坊协议,当前区块的 Gas Limit 只能在前一个区块的 Gas Limit 的基础上上下浮动 1/1024。

⑥交易内容

以太坊中的交易是指一个签名的数据包,它存储从外部账户发送到区块链上另一个账户的消息。 可以是简单的数字货币,即以太坊转账,也可以是智能合约。 代码消息。

一笔交易包括:

sitebihu.com 以太以太坊价格_以太坊节点分类_sitejianshu.com 以太坊以太经典

⑦交易树

每个区块都有一个独立的交易树。 一个区块中的交易顺序主要是由“矿工”决定的,这些数据在区块被挖出之前是未知的。 但“矿工”一般会根据交易的Gas Price和nonce对交易进行排序【账户地址的交易次数,一个计数器用来保证每笔交易只能处理一次,避免重放攻击】 . 首先将交易列表中的交易划分为发送账户,每个账户的交易按照这些交易的nonce进行排序。 每个账户的交易排序完成后,通过比较每个账户的第一笔交易,选择价格最高的交易,通过堆实现。 每挖出一个新区块,交易树就会更新一次。 交易树包含的键值对中,每个键是交易的编号,值是交易内容。

状态树

以太坊中的状态树基本上包含一个键值映射,其中键是地址,值是账户内容,包括每个账户的账户声明、账户余额、随机数、代码和存储(其中存储本身是一棵树),即 { nonce, balance, codeHash, storageRoot }。 其中,nonce是账户交易的序号,balance是账户余额,codeHash是代码的哈希值,storageRoot是另一棵树的根节点。 状态树表示访问一个块后的整个状态。

以太坊是一个基于账户的区块链应用平台。 账户的状态并不是直接存储在每个区块中,所有的账户状态都以“状态数据”的形式存储在以太坊的节点中。

状态数据是根据实际区块链数据计算的隐式数据。 状态树记录了每个账户的状态以太坊节点分类,需要经常更新:一方面,账户余额和账户的随机数nonce经常变化; 另一方面,新账户被频繁插入,存储的密钥(key)也会被频繁插入和删除。

收据树

每个区块都有自己的收据树,收据树不需要更新,收据树代表每笔交易对应的收据。

收据树还包含一个键值映射,其中键是一个索引号,指示与此收据关联的交易的位置,值是收据的内容。

交易收据是一个 RLP 编码的数据结构:[medstate, Gas_used, logbloom, logs]。 其中,medstate是事务处理后树根的状态; gas_used为交易处理后使用的gas量; logs是表[address, [topicl, topic2 ,…], data]中的元素列表,事务执行时操作会调用该表生成代码LOGO ... LOG4(包括主调用和子调用) call), address为生成日志的合约地址,topicn为最多4个32字节的值,data为任意字节大小的数组; logbloom是由topic(Howard Bloom于1970年提出的一种二进制向量数据结构,具有良好的空间效率和时间效率,用于检测元素是否是集合的成员)组成的地址和Bloom filter。 区块头中还有一个布隆过滤器。 使用布隆过滤器可以减少查询的工作量。 这种结构使得以太坊协议对轻客户端尽可能友好。

参考: