3分钟快速了解以太坊交易原理

以太坊交易详细介绍

看完了以太坊到底是什么?再来看看以太坊交易,交易可以简单定义为发送方(Sender)与接收方(Receiver)的一种互动行为,在区块链中的交易更是一种利用加密建构的一种行为,而在以太坊中的交易不单单是转移金钱的行为,更可以是与智能合约的互动与运算,交易对象之间因为区块链中都是匿名性的,因此交易的行为其实是两个帐户之间的互动,对于以太坊的帐户介绍可以再前篇文章中找到,首先来看看以太坊中的交易有哪些内容:

  • nonce:发送方帐户发送过的交易总数。
  • gasPrice:这笔交易中发送方帐户需要支付交易中每一个运算步骤所需要支付的手续费。
  • gasLimit:这笔交易中设定的手续费上限值,若交易中的运算量得出的gas超过上限则交易将会失败。
  • to:接收方帐户的地址。 
  • value:发送方帐户要转移给接收方帐户的以太币(Ether)总额。
  • v, r, s:发送方帐户的数位签章,用来验证这笔交易真的是发送方帐户发出的。

交易中的gas代表这个帐户让EVM电脑运行交易时所需要付出的手续费,可以想像以太坊是以台虚拟的大电脑,而这台电脑负责执行与运算所有网路中的交易,因此在以太坊中设计的gas来限制交易运算量的机制,当有人所发送交的易运算量较大,则需要付出较多的gas,则这笔交易所耗费的手续费就较高。而gas对应手续费的方式则是利用gasPrice得出的,gasPrice常用Gwei为单位计算(注: 1Ether = 10^9 Gwei, Gwei = 0.000000001 Eth),手续费的公式可以写成:

手续费(Tx Fee)= 实际运算步骤数(Actual Gas Used)* 每一步骤的手续费(gasPrice)

举例来说,若gasPrice = 10 Gwei,Actual Gas Used = 21000 gas,则可以得到手续费:

这样代表发送方再这次的交易中将支付0.00021Ether 的手续费,但如果交易中的运算量太高(无限回圈…等等)导致太高的手续费呢?此时若交易的手续费超过gasLimit时则会交易失败,但注意运算到超过gasLimit时导致交易失败后,所耗费的gas将不会回到发送方的帐户。


Ethereum Gas Tracker

gasPrice的多寡则取决于交易的等待时间,在Ethereum Gas Tracker中可以看到最新1000块中,不同的gasPrice时的等待时间,通常支付较高的手续费则交易将会较快被验证,在一般的钱包(ex. Metamask)中通常会自动帮我们整理3个交易的速度方便使用者选择,当然也可以自己设定不同的gasPrice来调整此比交易的验证速度。


以太坊钱包中的交易速度选项

再来看看交易的形态,因为在以太坊中无论是创建智能合约或是调用现已经发布在网络上的合约或是单纯的转移以太币到其他帐户中都称为交易,因此分类一下两种不同的交易形态:

以太坊两种交易形态比较

  • 信息调用(message call):

信息调用主要有两种,分别为与外部帐户(externally owner account)的互动和与合约帐户(contract account)的互动,其中与外部帐户的互动就是一般的金钱转移,下图中可以看到我从帐户1转移了3Ether到帐户2中,可以看到验证后Etherscan上的资讯,其中可以看到在Value栏位中有3颗Ether在这次交易中被转移,而在这种转移中并没有涉及智能合约的调用,因此Input Data中并没有任何资料。


金钱转移交易内容

而另一种则是调用已发布到区块链上的智能合约中函数,因此在交易中的Input Data存放了输入的资料,值得注意的是,交易的对象即是呼叫的智能合约的地址,当一份智能合约创建后会产生一个合约的帐户,透过与此合约帐户的交易达成呼叫合约中的函数。


呼叫智能合约的交易
  • 合约创建(contract creation):

创建一个智能合约也是交易的一种,而这种类型的交易并没有对象,因此再这次交易中将会创建一个属于这个合约的帐户,可以看到这个合约的地址为:0x63e34d23447ce66048a3ab142843651dd5e4ddef,而这个地址是由交易中的nonce与发送者(Sender)的帐户地址所得出,可以利用Blockchain工具尝试一下。


创建合约的交易

算法:
contractAddress = “0x” + keccak256(rlp.encode([sender, nonce])).toString('hex').slice(-40)

合约帐户的地址是由RLP编码发送者的帐户地址与交易中的nonce后,再取keccak256的hash值后,再取右边20byte的值。其中RLP编码可以在这边找到完整的定义。透过这个算法可以预测出发送者帐号再创见下一个智能合约时的地址为何。

简单而言,这两个不同的交易型态中,最大的差别在于交易是否有对象(交易中的to是否有值),若没有则代表交易是合约创建(contract-creation),反之则为讯息调用(message-call)。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读