纯干货|深度解析以太坊(3):交易费用和消息

纯干货|深度解析以太坊(3):交易费用和消息_第1张图片


1.Gas费用

以太坊的一个非常重要的概念是费用(fees)。每一次在以太坊网络上进行的交易都会产生费用,这笔费用是以“Gas”名义支付的。

gas就是用来衡量在一个具体计算中要求的费用单位。gas price就是你愿意在每个gas上花费Ether的数量,以“gwei”进行衡量。“Wei”是Ether的最小单位,1Ether表示10^18Wei. 1gwei是1,000,000,000 Wei。

对每个交易,发送者设置gas limit和gas price。gas limit和gas price就代表着发送者愿意为执行交易支付的Wei的最大值。

例如,假设发送者设置gas limit为50,000,gas price为20gwei。这就表示发送者愿意最多支付50,000*20gwei = 1,000,000,000,000,000 Wei = 0.001 Ether来执行此交易。

纯干货|深度解析以太坊(3):交易费用和消息_第2张图片

记住gas limit代表用户愿意花费在gas上的钱的最大值。如果在他们的账户余额中有足够的Ether来支付这个最大值费用,那么就没问题。在交易结束时任何未使用的gas都会被返回给发送者,以原始费率兑换。

纯干货|深度解析以太坊(3):交易费用和消息_第3张图片

如果发送者没有提供必要的Gas来执行交易,则交易“gas不足”并被认为是无效的。在这种情况下,交易处理中止,发生的任何状态变化都被颠倒过来,以致在交易之前我们最终回到以太坊的状态。另外,交易失败的记录,显示交易是什么尝试以及失败的地方。而且,由于机器已经耗尽了在用完gas之前进行计算的努力,在逻辑上,没有gas被退还给发送者。

纯干货|深度解析以太坊(3):交易费用和消息_第4张图片

这些gas究竟在哪里?发送者花费在gas上的所有资金都被发送到“受益人”地址,这通常是矿工的地址。由于矿工正在花费精力进行计算和确认交易,所以矿工收到gas作为奖励。

纯干货|深度解析以太坊(3):交易费用和消息_第5张图片

通常,发送者愿意支付的气价越高,矿工从交易中获得的价值就越高。因此,矿工越可能选择它。通过这种方式,矿工可以自由选择要验证或忽略的交易。为了引导发送者设置gas price,矿工可以选择广告他们将执行交易的最低gas价格。

1.1 存储也有费用

Gas不仅用于支付计算步骤,还用于支付存储的费用。存储的总费用与使用的32字节的最小倍数成正比。

存储费有一些细微的方面。例如,由于增加的存储量会增加所有节点上的以太坊状态数据库的大小,因此存在一个激励机制,可以保持较小的数据存储量。因此,如果一个交易的执行有一步是清除一个存储实体,那么为执行这个操作的费用就会被放弃,并且由于释放存储空间的退款就会被返回给发送者。

1.2 收费的目的是什么?

以太坊工作方式的一个重要方面是网络执行的每一个操作都同时受到每个全节点的影响。但是,以太坊虚拟机上的计算步骤非常昂贵。因此,以太坊智能合约最适合用于简单的任务,如运行简单的业务逻辑或验证签名和其他加密对象,而不是像文件存储,电子邮件或机器学习这样可能给网络带来压力的更复杂用途。征收费用可以防止用户使网络负担过重。

以太坊是一个图灵完备语言。(简而言之,图灵机是一种可以模拟任何计算机算法的机器,这样就可以实现循环,并使得以太坊容易陷入停滞问题,无法确定程序是否无限运行,如果没有收费,恶意行为人可以通过在交易内部执行无限循环而轻易地破坏网络,没有任何影响,因此费用保护网络免受故意的攻击。

你可能会想,“为什么我们还要为存储付费?”好吧,就像计算一样,以太坊网络上的存储成本是整个网络必须承担的成本。


2.交易和消息


我们之前指出,以太坊是一个基于交易的状态机。换句话说,不同账户之间发生的交易是把以太坊的全球状态从一个国家转移到另一个国家的原因。

从最基本的意义上说,交易是由外部拥有的账户产生的经过加密签名的一条指令,序列化,然后提交给区块链。

有两种类型的交易:消息呼叫和合约创造(即创造新的以太坊合约的交易)。 


 所有交易都包含以下组件,无论其类型如何:

  • nonce:发送者发送交易数的计数

  • gasPrice:发送者愿意支付执行交易所需的每个gas的Wei数量

  • gasLimit:发送者愿意为执行交易支付gas数量的最大值。这个数量被设置之后在任何计算完成之前就会被提前扣掉

  • to:接收者的地址。在合约创建交易中,合约账户的地址还没有存在,所以值先空着

  • value:从发送者转移到接收者的Wei数量。在合约创建交易中,value作为新建合约账户的开始余额

  • v,r,s:用于产生标识交易发生着的签名

  • init(只有在合约创建交易中存在):用来初始化新合约账户的EVM代码片段。init值会执行一次,然后就会被丢弃。当init第一次执行的时候,它返回一个账户代码体,也就是永久与合约账户关联的一段代码。

  • data(可选域,只有在消息通信中存在):消息通话中的输入数据(也就是参数)。例如,如果智能合约就是一个域名注册服务,那么调用合约可能就会期待输入域例如域名和IP地址

  • 纯干货|深度解析以太坊(3):交易费用和消息_第6张图片

    我们在“ 账户 ”这部分了解到,交易(包括消息通话和创建合约的交易)总是由外部拥有的账户发起并提交给区块链。另一种思考的方式是交易是外部世界与以太坊内部状态的桥梁。

    纯干货|深度解析以太坊(3):交易费用和消息_第7张图片

    但这并不意味着合约不能与其他合约谈判。在以太坊国家的全球范围内存在的合约可以与同一范围内的其他合约进行谈判。他们这样做的方式是通过“消息”或“内部交易”到其他合约。我们可以将消息或内部交易视为与交易相似,主要区别在于它们不是由外部拥有的账户生成的。相反,它们是由合约生成的。它们是虚拟对象,与交易不同,它不是序列化的,只存在于以太坊执行环境中。

    当一份合约将内部交易发送给另一份合约时,执行接收者合约账户上存在的相关代码。

    纯干货|深度解析以太坊(3):交易费用和消息_第8张图片

    一个重要的事情要注意的是,内部交易或消息不包含gas限制。这是因为gas限制是由原始交易的外部创造者(即一些外部拥有的账户)决定的。

    外部拥有账户所设置的Gas限额必须足够高以执行交易,包括由于该交易而发生的任何子执行,例如合约到合约的消息。如果在交易和消息链中,特定的消息执行耗尽,那么该消息的执行将与执行所触发的任何后续消息一起还原。但是,父执行不需要恢复。


    布尼区块链

    拥抱区块链未来

    打造最有价值的区块链学习&交流社群

    你可能感兴趣的:(纯干货|深度解析以太坊(3):交易费用和消息)