您现在的位置是:首页 > 区块链 > 区块链技术区块链技术

区块链技术:以太坊交易原理详解

作者|比特学院2019-09-30 17:05:14 发布在「区块链技术」人已围观

简介以太坊交易可以简单定义为发送方(Sender)与接收方(Receiver)的一种互动行为,在区块链中的交易更是一种利用加密建构的一种行为,而在以太坊中的交易不单单是转移金钱的行为,更可以是

区块链技术——以太坊

以太坊交易可以简单定义为发送方(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

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)。

Tags:区块链技术   以太坊

很赞哦! ()

文章评论

    共有条评论来说两句吧...

    用户名:

    验证码: