帐户类型,gas和交易

EOA与合约账户

以太坊有两种类型的账户

在Serenity中可以消除这种区别。

外部拥有账户(EOAs)

一个外部控制的账户

合同帐户

合同

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

这种执行需要完全确定性,唯一的上下文是区块链上的块位置和所有可用的数据。
区块链上的区块表示时间单位,区块链本身是一个时间维度,并表示由链上的区块指定的离散时间点处的状态的整个历史。

所有乙醚的余额和价值都以魏为单位:1乙醚是1e18 wei。

注意

以太坊中的“契约”不应被视为应该被“履行”或“被遵守”的事物。相反,它们更像是以太坊执行环境中的“自主代理”,当被消息或事务“戳穿”时总是执行特定的代码段,并直接控制自己的以太平衡和自己的密钥/价值商店来存储他们的永久状态。

什么是交易?

在以太坊使用术语“交易”来指代存储从外部拥有账户发送到区块链上另一个账户的消息的签名数据包。

交易包含: 消息的接收者, 识别发送者的签名并证明他们通过区块链向接收者发送消息的意图, VALUE字段 - 从发件人传送给收件人的金额,
一个可选的数据字段,可以包含发送给合同的消息, 表示允许执行交易执行的最大计算步骤数量的STARTGAS值,
一个GASPRICE值,代表发送者愿意为天然气支付的费用。一个单位的气体对应于一个原子指令的执行,即计算步骤。

什么是信息?

合同能够将“消息”发送给其他合同。消息是从不序列化的虚拟对象,只存在于以太坊执行环境中。 他们可以被认为是函数调用。

消息包含: 消息的发送者(隐含的)。 消息的接收者 VALUE字段 - 将消息一起传送到合同地址的wei的数量, 一个可选的数据字段,即合约的实际输入数据
一个STARTGAS值,它限制了消息触发的代码执行的最大气体量。

从本质上讲,消息就像一个交易,除了它是由合同而不是由外部参与者产生的。当一个正在执行代码的协议执行CALL或DELEGATECALL操作码时,产生一条消息,该操作码产生并执行一条消息。就像一个交易,一条消息导致收件人帐户运行其代码。因此,契约可以和其他契约的关系完全一样,外部行为者可以。

什么是天然气?

以太坊在称为以太坊虚拟机(EVM)的区块链上实施了一个执行环境。参与网络的每个节点都运行EVM作为块验证协议的一部分。他们检查正在验证的块中列出的交易,并运行EVM内交易触发的代码。网络中的每个完整节点都执行相同的计算并存储相同的值。显然以太坊并不是要优化计算效率。其并行处理冗余并行。这是提供一个有效的方式来达成一致的系统状态,而不需要信任的第三方,神谕或暴力垄断。但重要的是,他们不在那里进行最佳计算。事实上,合约执行是冗余复制跨节点,自然使得它们昂贵,这通常会产生一个激励,不要使用区块链进行离线计算。

当您运行分散的应用程序(dapp)时,它会与区块链交互以读取和修改其状态,但dapps通常只会放置对于区块链上的共识至关重要的业务逻辑和状态。

当由于被消息或事务触发而执行合同时,每个指令都在网络的每个节点上执行。这有一个成本:对于每个执行的操作都有一个指定的成本,用多个气体单位表示。

天然气是交易发件人在以太坊区块链上进行的每一项操作都需要支付的执行费用的名称。这个名字的灵感来源于这个费用充当了加密燃料,推动了智能合约的运动。天然气是从执行代码的矿工那里购买的。由于天然气的单位与自然成本的计算单位相一致,因此天然气和乙醚的故意脱钩,而乙醚的价格一般会因市场力量而波动。二者是由自由市场调节的:天然气的价格实际上是由矿工决定的,他们可以拒绝以低于最低限度的天然气价格进行交易。为了得到天然气,你只需要添加乙醚到你的帐户。以太坊客户自动为您的乙醚购买天然气,金额为您指定的金额,作为交易的最大支出。

以太坊协议收取合同或交易中执行的每个计算步骤的费用,以防止以太坊网络上的故意攻击和滥用。每笔交易都需要包含一个天然气限制和一个愿意为每个天然气支付的费用。矿工可以选择包括交易和收取费用。如果由交易产生的计算步骤(包括原始消息和可能触发的任何子消息)使用的气体总量小于或等于气体限制,则处理交易。如果天然气总量超过天然气限制,则所有的变化都将被恢复,除非交易仍然有效,矿工仍然可以收取费用。交易执行中未使用的所有多余的天然气将作为Ether退还给发货人。你不必担心超支,因为你只收取你消耗的气体。这意味着发送高于估计值的气体限制的交易是有用的,也是安全的。

估算交易成本

一笔交易的总成本是基于两个因素:

gasUsed是交易消耗的总天然气

天然气在交易中指定的一个单位天然气的价格(以太)

总成本= gasUsed * gasPrice

gasUsed

EVM中的每个操作都分配了一定数量的消耗气体。 gasUsed是执行所有操作的所有气体的总和。有一个电子表格提供了一些背后的分析一瞥。

对于估算gasUsed,有一个可以使用的估计天然气API,但有一些注意事项。

天然气价格

用户构建并签署交易,并且每个用户可以指定他们想要的任何价格,可以是零。然而,在边境发起的以太坊客户有一个0.05e12的默认煤气价格。随着矿工们的收入得到优化,如果大多数交易都是以0.05e12的价格提交的话,要说服矿工接受指定较低或零的煤气价格的交易是困难的。

交易成本示例

我们拿一个只增加2个数字的合约。 EVM OPCODE ADD消耗3种气体。

使用默认天然气价格(截至2016年1月)的大致成本将为:

3 * 0.05e12 = 1.5e11 wei

由于1个乙醚为1个乙烯,所以总成本为0.00000015乙醚。

这是一种简化,因为它忽略了一些成本,比如将两个数字合同在一起的成本,甚至在它们被添加之前。

Operation Name Gas Cost Remark
1 每个执行周期的默认金额
停止 0 自由
自杀 0 自由
沙三段 20
SLOAD 20 从永久存储中获得
sstore 100 永久保存
平衡 20
创建 100 合同创建
呼叫 20 启动一个只读的调用
记忆 1 扩展内存时每增加一个单词
TXDATA 交易的每个字节的数据或代码
交易 500 基本费用交易
合同创建 53000 从21000改为宅基地

帐户互动示例 - 博彩合同

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

默认情况下,以太坊执行环境无生气,没有任何事情发生,每个帐户的状态保持不变。但是,任何用户都可以通过从外部拥有的账户发送交易来触发行动,从而使以太坊的轮子运动。如果交易的目的地是另一个EOA,那么该交易可能转移一些以太,但否则什么都不做。但是,如果目的地是合同,合同又会激活,并自动运行其代码。

代码能够读/写自己的内部存储器(数据库将32字节的密钥映射为32字节的值),读取接收到的消息的存储,并将消息发送到其他契约,并依次触发它们的执行。一旦执行停止,并且由合同发送的消息触发的所有子执行都会停止(这一切都以确定性和同步的顺序进行,即子调用在父调用进一步之前完全完成),那么执行环境将停止再一次,直到下一次交易被唤醒。

合同通常有四个目的:

合同通过交替地称为“呼叫”或“发送消息”的活动彼此交互。
“消息”是一个包含一定数量的以太数据的对象,任何大小的数据的字节数组,发送者和接收者的地址。当合同收到一条消息时,它可以选择返回一些数据,消息的原始发送者可以立即使用这些数据。这样,发送消息就像调用一个函数一样。

因为合同可以扮演不同的角色,所以我们期望合约会互相影响。例如,考虑一下Alice和Bob赌100
GavCoin的情况,即旧金山的温度在明年的任何时候都不会超过35ºC。然而,Alice非常注重安全性,而且她的主账户使用转发合同,这个转发合同只能通过三个私人密钥中的两个批准发送消息。鲍勃对量子密码学是偏执的,所以他使用转发契约,只传递与传统的ECDSA一起签名Lamport签名的消息(但由于他是老式的,他倾向于使用基于SHA256的Lamport
sigs版本,这是以太坊直接不支持)。

投注合约本身需要从某个合同中提取有关旧金山天气的数据,并且在需要将GavCoin实际发送给Alice或Bob(或者更确切地说,Alice或Bob的转发)时还需要与GavCoin合同进行交谈合同)。我们可以显示账户之间的关系:

../_images/contract_relationship.png

当鲍勃想完成下注时,会发生以下步骤:

  1. 发送交易,触发Bob的EOA到他的转发合同的消息。
  2. Bob的转发合同将消息的散列和Lamport签名发送到用作Lamport签名验证库的合同。
  3. Lamport签名验证库看到Bob想要一个基于SHA256的Lamport sig,所以根据需要多次调用SHA256库来验证签名。
  4. 一旦Lamport签名验证库返回1,表示签名已经过验证,它会向代表该合同的合同发送一条消息。
  5. 投注合约检查提供旧金山温度的合约以查看温度。
  6. 投注合同认为对消息的回应显示温度高于35ºC,因此它向GavCoin合同发送一条消息,将GavCoin从其账户转移到Bob的转发合同。

请注意,GavCoin全部“存储”为GavCoin合同数据库中的条目;在步骤6的上下文中的“帐户”一词仅仅意味着在GavCoin合同存储器中存在具有用于投注合同地址的密钥和其余额的值的数据条目。收到此消息后,GavCoin合同将此值减少一定数量,并增加与Bob的转发合同地址对应的条目中的值。我们可以在下图中看到这些步骤:

../_images/contract_relationship2.png

离线签署交易

[也许把这个添加到常见问题中,并指向turboethereum指南的ethkey部分? ]