以太坊账户和以太代币
在前面的章节中,我们讨论了以太坊、智能合约以及智能合约的开发过程,包括基于以太坊区块链的 ERC20 令牌的开发。我们还讨论了以太坊的发展是如何随着智能合约和令牌在以太坊区块链上的部署而发生的。
在这一章中,我们将详细讨论以太坊帐户,并研究一个以太令牌;这个讨论将帮助我们更好地理解分散式应用程序。我们还将简要讨论一些流行的以太坊令牌和智能合约。我们还将讨论一些重要的主题,如事务子状态,以太坊块的验证,以及块终结过程中涉及的各个步骤。接下来,我们将在本章末尾简要讨论基于以太坊的智能合约和货币的一些缺点。
本章涵盖了以下主题:
- 以太坊状态转移函数
- 创世街区
- 交易收据
- 事务子状态
- 验证块
- 基于以太坊的令牌的缺点
以太坊账户介绍
以太坊中的状态由对象组成,每个对象称为一个帐户。以太坊的每个账户都包含一个 20 字节的地址。每个状态转换都是不同帐户之间价值和信息的直接交易。账户之间或账户上执行的每个操作被称为状态 转换。以太坊中的状态转换是使用以太坊状态转换函数完成的。
以太坊区块链的状态变化从区块链的创世区块开始,如下图所示:
每个块包含一系列事务,并且每个块都链接到其前一个块。要从一个状态转换到下一个状态,事务必须有效。我们已经在前面的章节中讨论过,使用共识技术进一步验证交易。
为了避免以太坊中的旧块,引入了 GHOST ( 贪婪最重观察子树)协议。这是为了避免任何节点的随机分叉和其他节点的不恰当验证。当两个节点同时找到一个块时,就会创建旧块。每个节点发送区块链中的数据块进行验证。比特币的情况并非如此,因为在比特币中,块时间是 10 分钟,而块传播到大约 50%的网络需要大约 12 秒。GHOST 协议包括陈旧块,也称为叔伯,这些包含在链的计算中。
如前几章所述,以太坊区块链有两种类型的账户。即合同账户 ( CA )和自有账户 ( EOA s)。契约账户是那些具有与它们相关联的代码以及私钥的账户。EOA 有一个以太平衡;它能够发送交易并且没有关联的代码,而 CA 有一个余额和关联的代码。合同账户和外部拥有的账户具有它们自己的特征,并且新令牌只能由合同账户发起。
以太坊状态转移函数
在状态转换函数中,以下是以太坊中每个交易遵循的流程:
- 通过确保签名是有效的,并且 nonce 与发送方帐户和语法中的 nonce 相匹配,来确认交易的有效性和结构。如果有任何问题,则返回一个错误。
- 交易费用的计算是使用汽油价格完成的,发送者地址是使用签名确定的。然后,发送者的账户余额被检查,并随着随机数的增加而相应地减少。在余额不足的情况下,会出现错误。
- 某些汽油被用来支付交易费用。根据事务的大小,按字节递增收费。
- 在这一步中,发生了实际的价值转移。该流程从发送方的帐户到接收方的帐户。如果接收帐户不存在,则创建该帐户。此外,如果接收账户是合同账户,则执行合同的代码。如果有足够的气体可用,那么合同代码完全运行或者运行到气体耗尽的点。
- 如果由于余额或汽油不足而导致交易失败,除了费用支付之外,所有状态更改都将被还原,费用支付将被转移给矿工。
- 如果有可用的提醒费,则将其发送回发送者,作为按要求支付矿工后的零钱。函数返回此时的结果状态。
下图描述了状态转换流程:
该功能在每个以太坊客户端中独立实现。
创世街区
这是以太坊区块链的第一块,就像比特币区块链的创世纪块一样。创世纪区块的高度为 0。
Genesis 区块于 2015 年 7 月 30 日开采,标志着以太坊区块链的第一个区块。创世纪方块的难度为 17,179,869,184,如以下截图所示:
交易收据
收据用于存储事务执行后的状态。这些结构用于记录事务执行的结果。每笔交易执行后都会产生收据。所有收据都存储在一个带索引的 trie 中。它的根作为收款根放在块标题中。
元素
元素由四个主要元素组成;在我们看收据的结构之前,让我们讨论以太坊交易收据的每个元素。
交易后状态
事务后状态是保存事务执行后状态的 trie 结构。它被编码为一个字节数组。
使用的气体
Gas used 表示包含交易收据的区块中使用的气体总量。它可以是零,但不是负整数。
一组日志
日志集显示了作为事务执行的结果而创建的日志条目集。日志包含记录器的地址、日志主题和其他日志数据。
布隆过滤器
布隆过滤器是根据包含在所讨论的日志中的信息创建的。日志条目被缩减为 256 字节的散列,然后随着日志的扩展,该散列被嵌入到块的头部。日志条目由记录器的地址、日志主题和日志数据组成。日志主题编码为一系列 32 字节的数据结构,日志数据由几个字节的数据组成。
结构
交易收据的结构如下:
Result: {
"blockHash": "0xb839c4a9d166705062079903fa8f99c848b5d44e20534d42c75b40bd8667fff7",
"blockNumber": 5810552,
"contractAddress": null,
"cumulativeGasUsed": 68527,
"from": "0x52bc44d5378309EE2abF1539BF71dE1b7d7bE3b5",
"gasUsed": 7097057,
"logs": [
{
"address": "0x91067b439e1be22196a5f64ee61e803670ba5be9",
"blockHash": "0xb839c4a9d166705062079903fa8f99c848b5d44e20534d42c75b40bd8667fff7",
"blockNumber": 5810552,
"data": "0x00000000000000000000000000000000000000000000000000000000576eca940000000000000000000000000fd8cd36bebcee2bcb35e24c925af5cf7ea9475d0100000000000000000000000000000000000000000000000000000000000000",
"logIndex": 0,
"topics": [
"0x72d0d212148041614162a44c61fef731170dd7cccc35d1974690989386be0999"
],
"transactionHash": "0x58ac2580d1495572c519d4e0959e74d70af82757f7e9469c5e3d1b65cc2b5b0b",
"transactionIndex": 0
}
],
"root": "7583254379574ee8eb2943c3ee41582a0041156215e2c7d82e363098c89fe21b",
"to": "0x91067b439e1be22196a5f64ee61e803670ba5be9",
"transactionHash": "0x58ac2580d1495572c519d4e0959e74d70af82757f7e9469c5e3d1b65cc2b5b0b",
"transactionIndex": 0
}
Transaction cost: 7097057 gas.
此外,需要注意的是,收据不适用于未决交易。
交易子状态
在事务执行期间创建一个事务子状态。该事务在执行完成后立即被处理。事务子状态由以下三个子项目组成。
自杀场景
一个自杀集包含在交易执行后被处置的账户列表。
日志系列
一个日志系列是一个索引的检查点系列,允许监控和通知以太坊环境外部的实体的契约调用。日志是为响应智能合约中的事件而创建的。它也可以作为一种更便宜的存储方式。
退款余额
are 资金余额是发起交易执行的交易中的天然气总价格。
信息
消息是在两个账户之间传递数据的交易。它是在两个帐户之间传递的数据包。可以通过合同账户 ( CA )发送消息。它们也可以是由发送者数字签名的交易形式的外部所有账户 ( EOA )。
消息从不存储,类似于事务。以太坊中消息的主要组成部分是:
- 消息呼叫的发送者
- 交易发起人
- 交易接收方
- 合同帐户,其代码将在消息调用期间执行(如果有用于此目的的帐户)
- 最大可用气体
- 天然气价格
使用CALL
或DELEGATECALL
方法生成消息。
打电话
一个呼叫在区块链中不广播任何东西;相反,它是对任何指定契约函数的本地调用。它在节点中本地运行,就像本地函数调用一样。它不消耗任何气体,并且是只读操作。调用仅在节点上本地执行,不会导致任何状态变化。如果目的地帐户具有相关联的 EVM 代码,则虚拟机将在接收到消息时启动以执行所需的操作;如果消息发送者是一个独立的对象,那么调用传递从 EVM 返回的任何数据。
以太坊块验证
一个以太坊块被矿工开采出来后,要经过几道检查才算有效;以下是它要通过的检查:
- 所有的 ommers/叔伯都必须验证其身份,认为叔伯的权力是有效的。
- 前一个块的存在及其有效性
- 块时间戳的有效性,即当前块的时间戳必须高于父块的时间戳。此外,当前块和父块之间的距离应小于 15 分钟。所有的阻塞时间都以 Unix 时间计算。
如果前面的任何检查失败,块将被拒绝。
叔叔的认可
在这个过程中,叔叔或婶婶被验证。首先,一个块最多可以包含两个叔叔,其次,头部是否有效,叔叔与当前块的关系是否满足六个块的最大深度。
阻滞难度
以太坊中的区块难度与比特币区块链中的区块难度计算并行。如果两个方块之间的时间减少,方块的难度增加。这是保持一致的块生成时间所必需的。以太坊家园版本中的难度调整算法如下:
block_diff = parent_diff + parent_diff // 2048 * max(1 - (block_timestamp - parent_timestamp) // 10, -99) + int(2**((block.number // 100000) - 2))
在该算法中,根据块的生成时间来调整块的难度。根据该算法,如果父块和当前块的生成之间的时间差小于 10 秒,则难度增加。如果时间差在 10 到 19 秒之间,那么难度保持不变。当两个块的生成时间差大于 20 秒时,难度降低。难度的降低和时差成正比。
除了基于时间戳的难度增量之外,按照算法,每 100,000 块之后,难度呈指数级增加。这被称为难度定时炸弹,在以太坊网络中引入,因为这将使在以太坊区块链网络上采矿变得非常困难。这就是为什么 PoS 在不久的将来会成为以太坊的共识机制。
阻止终结
以太坊中块的终结包括以下四个阶段:
- ommers 的验证
- 交易的验证
- 奖励的应用
- 状态和块随机数的验证
基于以太坊的令牌的缺点
在前面的章节中,我们已经讨论了以太坊和以太坊区块链货币的优势和用途;现在让我们讨论一下基于以太坊的令牌的一些缺点:
- 不稳定:以太坊区块链仍在经历很多变化;这也包括将共识方法从 PoW 转移到 PoS 系统。
- 可靠性:ERC 20 令牌或任何其他令牌都是基于以太坊之上构建的。这造成了威胁,因为以太坊本身在大多数时候都在经历着频繁的变化。
- 硬分叉:依赖另一个区块链意味着,由于硬分叉,可能会发生不可预见的问题。
- 主权:由于代币是基于以太坊区块链的,这些代币的未来发展没有发言权。是否选择 ERC20 的决定应基于应用和用例。
- 支持:智能合约在区块链上发布后,任何改进或支持需求只能在以太坊区块链上完成,在区块链提出的任何更改/改进都必须得到整个以太坊社区的批准。
- 以太作为主要货币:尽管人们可以创造他们自己的货币、符号和供应限额,以太仍然是区块链以太坊使用的主要货币,因此以太总是因为你的代币所增加的努力而变得丰富。
摘要
在本章中,我们讨论了以太坊状态转移函数、起源块和交易收据。我们还讨论了事务子状态。除了这些主题,我们还讨论了以太坊块验证以及以太坊黄皮书中讨论的相关步骤。最后,我们简要讨论了使用基于以太坊的令牌的一些缺点。
在下一章,我们将讨论分散应用,我们将学习如何创建一个 DApp ,以及如何发布一个。我们还将讨论 DApp 的未来及其对使用者的影响。