ETH 的一些解释

什么是账户?

外部拥有账户 vs 合约账户

以太坊中有两种账户

  • 外部拥有账户(EOA)
  • 合约账户

这个区别在即将到来的大都会升级中将会被抽象化

外部拥有账户

一个外部拥有账户具有一下特性:

  • 有一个以太币余额

  • 可以发送交易(以太币转账或者激活合约代码)

  • 通过私钥控制

  • 没有相关联的代码

合约账户

一个合约账户拥有一下特性:

  • 有一个以太币余额

  • 有相关联的代码

  • 代码执行是通过交易或者其他合约发送的call来激活

  • 当被执行时 -- 运行在随机复杂度 (图灵完备性)-- 只能操作其拥有的特定储存,例如可以拥有其永久state -- 可以call其他合约

所有以太坊区块链上的行动都是由各账户发送的交易激活。每次一个合约账户收到一个交易,交易自带的参数都会成为代码的输入值运行。合约代码会被以太坊虚拟机(EVM)在每一个参与网络的节点上运行,以作为它们新区块的验证。

什么是交易和消息?

交易

"交易"这个术语在以太坊里被用来指代一个用来存储消息的被签名数据包在区块链上从一个外部拥有账户发送至另一个账户的过程。

交易包括:

  • 这个消息的接收者

  • 一个签名,用来证明发送者有意向通过区块链向接收者发送消息

  • 价值域 - 从发送方转移到接受方的wei (ether/10^18) 的数量

  • 一个可选的数据域,用来储存发送给合约的消息

  • 一个GASLIMIT值,代表了这个交易的执行最多被允许使用的计算步骤

  • 一个GASPRICE值,代表了交易发送者愿意支付的gas费用。一个单位的gas表示了执行一个基本指令,例如一个计算步骤

消息

合约具有发送"消息"到其他合约的能力。消息是一个永不串行且只在以太坊执行环境中存在的虚拟对象。他们可以被理解为函数调用(function calls)。

一个消息包括:

  • 明确的消息发送者

  • 消息的接收者

  • 一个可选的数据域,这是合约实际上的输入数据

  • 一个GASLIMIT值,用来限制这个消息出发的代码执行可用的最大gas数量

总的来说,一个消息就像是一个交易,除了它不是由外部账户生成,而是合约账户生成。当合约正在执行的代码中运行了CALL 或者DELEGATECALL这两个命令时,就会生成一个消息。消息有的时候也被称为"内部交易"。与一个交易类似,一个消息会引导接收的账户运行它的代码。因此,合约账户可以与其他合约账户发生关系,这点和外部账户一样。有许多人会误用交易这个词指代消息,所以可能消息这个词已经由于社区的共识而慢慢退出大家的视野,不再被使用。

什么是 gas?

以太坊在区块链上实现了一个运行环境,被称为以太坊虚拟机(EVM)。每个参与到网络的节点都会运行都会运行EVM作为区块验证协议的一部分。他们会验证区块中涵盖的每个交易并在EVM中运行交易所触发的代码。每个网络中的全节点都会进行相同的计算并储存相同的值。合约执行会在所有节点中被多次重复,这个事实得使得合约执行的消耗变得昂贵,所以这也促使大家将能在链下进行的运算都不放到区块链上进行。对于每个被执行的命令都会有一个特定的消耗,用单位gas计数。每个合约可以利用的命令都会有一个相应的gas值。这里列了一些命令的gas消耗。

gas和交易消耗的gas

每笔交易都被要求包括一个gas limit(有的时候被称为startGas)和一个交易愿为单位gas支付的费用。矿工可以有选择的打包这些交易并收取这些费用。在现实中,今天所有的交易最终都是由矿工选择的,但是用户所选择支付的交易费用多少会影响到该交易被打包所需等待的时长。如果该交易由于计算,包括原始消息和一些触发的其他消息,需要使用的gas数量小于或等于所设置的gas limit,那么这个交易会被处理。如果gas总消耗超过gas limit,那么所有的操作都会被复原,但交易是成立的并且交易费任会被矿工收取。区块链会显示这笔交易完成尝试,但因为没有提供足够的gas导致所有的合约命令都被复原。所以交易里没有被使用的超量gas都会以以太币的形式打回给交易发起者。因为gas消耗一般只是一个大致估算,所以许多用户会超额支付gas来保证他们的交易会被接受。这没什么问题,因为多余的gas会被退回给你。

估算交易消耗

一个交易的交易费由两个因素组成:

  • gasUsed:该交易消耗的总gas数量

  • gasPrice:该交易中单位gas的价格(用以太币计算)

交易费 = gasUsed * gasPrice

gasUsed

每个EVM中的命令都被设置了相应的gas消耗值。gasUsed是所有被执行的命令的gas消耗值总和。

如果希望估算gasUsed,可以使用这个estimateGas的API

gasPrice

一个用户可以构建和签名一笔交易,但每个用户都可以各自设置自己希望使用的gasPrice,甚至可以是0。然而,以太坊客户端的Frontier版本有一个默认的gasPrice,即0.05e12 wei。矿工为了最大化他们的收益,如果大量的交易都是使用默认gasPrice即0.05e12 wei,那么基本上就很难又矿工去接受一个低gasPrice交易,更别说0 gasPrice交易了。

交易费案例

在被允许后,我将使用这个MyEtherWallet团队的例子并借用他们的分析。请参考他们与gas相关的介绍。他们还有一个小页面方便大家把以太币转换成小单位的gas计数单位

你可以将gasLimit理解为你汽车油箱的上限。同时将gasPrice理解为油价。

对于一辆车来说,油价可能是 2.5(价格)每升(单位)。在以太坊中,就是20

上一篇:AUTOSAR从入门到精通100讲(十一)-Autosar以太网及SOME/IP实现​


下一篇:《区块链技术与应用》学习笔记13——ETH权益证明