,

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



發佈留言