主页 > imtoken冷钱包官方下载 > 以太坊连载(21):账户、交易核心概念及对赌合约解析

以太坊连载(21):账户、交易核心概念及对赌合约解析

imtoken冷钱包官方下载 2023-01-17 06:20:22

外部账户 vs 合约账户 以太坊中有两种类型的账户

它们的区别可能会在 Serenity 版本中消失。

外部账户 (EOA)

外部账户

合约账户

合同

以太坊区块链上的所有动作都由外部账户发起的交易调动。 每次合约账户收到交易时,其代码都会按照作为交易一部分发送的输入参数的指示执行。 作为验证新块的一部分,合约代码由参与网络的每个节点上的以太坊虚拟机执行。

这个执行需要完全确定,它唯一的上下文是块在区块链上的位置和所有可见数据。 区块链上的一个区块代表一个时间单位,而区块链本身就是一个时间维度,代表了链上区块指定的离散时间点的状态的整个历史。

所有以太币余额和价值都以 wei 命名:1 以太币是 1e18 wei。

以太坊的核心价值_2018 以太坊未来价值_以太坊的核心价值在于哪里

注意:以太坊中的“合同”不应被视为要“执行”或“遵守”的东西; 它更像是一个生活在以太坊执行环境中的“自治代理”,被消息或交易“戳”,总是执行一段特定的代码,直接控制自己的以太币余额和键/值存储存储永久状态。

什么是交易?

以太坊中使用术语“交易”来指代已签名的数据包,该数据包存储要从外部帐户发送到区块链上另一个帐户的消息。

事务包括:什么是消息?

合约能够向其他合约发送“消息”。 消息是虚拟的东西,永远无法序列化,只存在于以太坊执行环境中。 它们可以被认为是函数调用。

消息包括:

从本质上讲,一条消息就像一笔交易,只是消息是由合约而不是外部因素创建的。 当正在执行代码的合约执行 CALL 或 DELEGATECALL 操作码时,会生成消息。 与交易一样,消息可能会导致代码在接收帐户中运行。 因此,合同可以与其他合同相关,就像它们与外部因素相关一样。

什么是气体?

以太坊虚拟机 (EVM) 是以太坊区块链上的可执行环境。 参与网络的每个节点都将 EVM 作为块验证协议的一部分运行。 他们检查块上列出的交易,他们验证这些交易,并在 EVM 内运行由交易触发的代码。 网络上的每个完整节点都执行相同的计算并存储相同的值。 很明显,以太坊并未针对计算效率进行优化。 其类似过程是多余的。 它的目的是提供一种有效的方式来就系统状态达成共识,而无需受信任的第三方、指南或蛮力垄断。 但重要的是它们的存在并不是为了优化操作。 跨节点重复执行合约的事实自然会使其成本更高,并且通常会鼓励人们如果可以在链下执行则不要在区块链上执行。

以太坊的核心价值在于哪里_2018 以太坊未来价值_以太坊的核心价值

当运行去中心化应用程序 (dapp) 时,它与区块链交互以读取和修改状态,但 dapps 通常只会将业务逻辑和共识关键状态放在区块链上。

当消息或交易触发结果执行时,每条指令在每个网络节点上执行。 这有一个成本:每个执行的操作都有一个特定的成本,以一定数量的气体单位表示。

Gas 是交易发送方需要为以太坊区块链上发生的每个操作支付的执行成本。 gas 这个名字的灵感来自于这样一种想法,即这种费用就像驱动智能合约的加密燃料。 天然气是从执行代码以获得以太币的矿工那里购买的。 Gas 和 Ether 是有意分开的,因为 Gas 单位与具有自然成本的计算单位一致,而 Ether 价格通常因市场力量而波动。 两者在自由市场中得到调和:gas 价格实际上由矿工决定,他们可以拒绝以低于最低 gas 价格的价格进行交易。 为了获得汽油,您只需要向您的帐户添加以太币。 以太坊客户端会自动为你的以太坊购买gas,金额为你指定的最大交易支出。

在执行合同或交易的每个计算步骤中,以太坊协议都会收取费用,以防止对以太坊网络的蓄意攻击或滥用。 每笔交易都必须包含气体限额和支付每种气体的意愿。 矿工可以选择是否包含交易和收取费用。 如果交易产生的用于计算步骤的气体总量(包括原始消息和可能产生的子消息)小于或等于气体限制,则交易继续进行。 如果 gas 总量超过 gas 限制,所有更改都将被还原以太坊的核心价值,但交易仍然有效,矿工仍然可以收取费用。 任何未用于交易执行的多余气体将以以太币的形式退还给发送方。 不用担心超支,因为您只需为消耗的天然气付费。 这意味着发送高于估计气体限制的交易也是高效和安全的。

估算交易成本

一笔交易花费的以太币总量取决于两个因素:

gasUsed 是交易消耗的gas总量

gasPrice 交易中指定的 gas 单位的价格(转换为 Ether)

总成本 = gasUsed * gasPrice

以太坊的核心价值在于哪里_2018 以太坊未来价值_以太坊的核心价值

使用的气体

以太坊虚拟机上的每个操作都分配了它消耗的气体量。 gasUsed 是所有已执行操作所需的气体总量。 有一个电子表格可以查看其背后的一些统计数据。

对于估计 gasUsed,可以使用估计 Gas API,但有一些注意事项。

汽油价格

用户构造和签署交易,每个用户可以指定他们想要的 gasPrice,可以为零。 但是Frontier发布的以太坊客户端默认gasPrice为0.05e12 wei。 由于矿工会优化他们的收入,如果大多数交易以 0.05e12 wei 的 gasPrice 提交,将很难说服矿工接受更低价格或 0 的交易。

示例交易成本

让我们订一个只加 2 个数字的合同。 EVM OPCODE ADD 消耗 3 gas。

按默认天然气价格(2016 年 1 月)计算的大致成本为:

3 * 0.05e12 = 1.5e11 魏

2018 以太坊未来价值_以太坊的核心价值在于哪里_以太坊的核心价值

1 以太币为 1e18 wei,总成本为 0.00000015 以太币。

这是一个简化的计算,因为它忽略了一些成本,例如在可以添加之前将 2 个数字转移到合约的成本。

2018 以太坊未来价值_以太坊的核心价值_以太坊的核心价值在于哪里

账户交互示例——博彩合约

如前所述,有两种类型的帐户:

以太坊默认的执行环境是无生命的,什么都不会发生,每个账户的状态都保持不变。 但是,每个用户都可以通过从外部帐户发送交易来触发操作,启动以太坊。 如果交易的目的地是其他外部账户,交易可能会转移一些以太币,否则什么都不做。 但如果目的地是一个合约以太坊的核心价值,否则合约将被激活,代码将自动运行。

代码能够读/写自己的内部存储(一个将 32 字节键映射到 32 字节值的数据库),从存储中读取接收到的消息,将消息发送到其他合约,进而触发执行。 一旦执行停止,所有由合约发送的消息触发的子执行都将停止(这些都以明确的同步顺序发生,例如,子调用在父调用进一步进行之前完全完成),执行环境立即停止再次直到调用下一个事务唤醒。

合同通常有四个目的:

因为合约是这样做的,所以我们希望合约能够相互交互。 举个例子,假设这样一个场景,Alice 和 Bob 打赌 100 个 Gav 硬币,明年旧金山的温度不会超过 35ºC。 但是爱丽丝非常注重安全。 她的第一个账户使用远期合约,只有在 3 个私钥中有 2 个批准时才能发送消息。 Bob 痴迷于量子加密图形。 他使用的正向合约只传递带有Lamport签名和传统ECDSA的消息(但是因为他很老土,他更喜欢使用基于SHA256的Lamport签名版本,以太坊不直接支持)。

以太坊的核心价值_2018 以太坊未来价值_以太坊的核心价值在于哪里

博彩合约本身需要从某个合约中获取旧金山的天气数据,并且当它想要实际将 Gavcoins 发送给 Alice 或 Bob 时,它还需要与 Gavcoin 合约(或者更准确地说,Alice 或 Bob 的远期合约)进行对话。 ). 因此,我们可以这样表达账户之间的关系:

2018 以太坊未来价值_以太坊的核心价值_以太坊的核心价值在于哪里

当 Bob 想要进行最后的赌注时,将执行以下步骤:

发送交易,触发从 Bob 的外部账户到他的远期合约的消息。 Bob 的正向合约将消息哈希表和 Lamport 签名发送给合约,起到 Lamport 签名确认库的作用。 Lamport签名验证库看到Bob想要一个基于SHA256的Lamport签名,于是多次调用SHA256库确认签名。 一旦 Lamport 签名确认库返回 1,表示签名已经确认,他将向代表 stake 的合约发送消息。 投注合同 查看提供旧金山天气的合同,了解天气如何。 质押合约看到消息的响应显示天气高于 35ºC,并向 Gav 币合约发送消息,将 Gav 币从其账户转移到 Bob 的远期合约。

注意,Gav币是作为一个整体“存储”在Gav币合约的数据库中的; 第6步上下文中的“账户”只是表示在Gav币合约存储中有一个数据入口,有一个key可以输入地址和投注合约金额的余额。 收到消息后,Gav币合约价值减少,Bob远期账户对应的入场价值增加。 我们可以在下表中看到这些步骤:

2018 以太坊未来价值_以太坊的核心价值_以太坊的核心价值在于哪里

离线签署交易

【这部分可以加到FAQ里,指向turbo ethereum精灵的ethkey章节】

在下一篇文章中,我们将介绍《以太坊连载(22):简单的智能合约》

感谢团队 Azure 和 Bob 参与《以太坊宅基地文档》的翻译和验证。