引介 | 以太坊交易的生命周期

2021-02-26 以太坊愛好者
以太坊交易的生命周期

了解以太坊交易是如何生成並在網絡中廣播的

交易是以太坊區塊鏈(或任何類似的區塊鏈)的核心。在與以太坊區塊鏈進行交互之時,你是在執行交易並更新其狀態。你有沒有想過要了解當你在以太坊執行交易之時到底發生了什麼?讓我們通過一則交易例子來解答這一問題。本文包括如下內容。

以太坊交易的端到端遍歷,即從你的瀏覽器/控制臺出發進入以太坊網絡,然後再回到你的瀏覽器/控制

了解當你使用 Metamask 或 Myetherwallet 等插件,而非運行自己的節點之時,交易是如何進行的

如果你比較偏執多疑,不信任任何插件,想自己執行交易,該怎麼做?

本文讀者需要對以太坊及其組成部分,如帳戶、gas 和合約等具備基礎性了解。關於這些概念的詳細解釋可以參見這篇文章。如果你是一個不熟悉以太坊的開發者,這篇文章或許對你很有幫助。你也可以從這篇文章中學習如何構建簡單的分布式應用。如果你已經有過執行交易的親身經歷,本文對你的意義會更大。例如,可以是將一些以太幣發送給另一個人或合約的交易。再比如,還可以是在與分布式應用進行交互的情況下,如果你在這個網站上買了一些代幣,這就是一筆交易。如果你為一位候選人投票,這也是一筆交易。

一. 以太坊交易的端到端綜述

讓我們以下列合約調用為例,並遍歷該函數調用/交易是如何執行及永久存儲在區塊鏈上的整體流程。點擊此處可了解整個合約。從較高層次來說,這是一個投票合約,其中你可以預置一些候選人在選舉中進行角逐,任何人都能為他們投票。這些投票將會記錄在區塊鏈上。

Voting.deployed().then(function(instance) {  instance.voteForCandidate('Nick', {gas: 140000, from: web3.eth.accounts[0]}).then(function(r) {    console.log("Voted successfully!")  })})

假設你在自己的計算機上本地運行了一個以太坊客戶端(Geth 或 Parity),你的計算機連接到了某個以太坊網絡(測試網絡或是主網),你有權訪問該合約地址和 ABI,從而執行該交易。

如果你構建過分布式應用,應該對上述代碼並不陌生。這是一個名為「Voting(投票)」的合約,已經部署在了區塊鏈上。我們以該合約為例,執行一個叫作 voteForCandidate 的函數,輸入候選人的姓名、該交易的gas上限和執行該交易的帳戶。從名稱中可以看出,該函數能夠用來為候選人投票,選票記錄在區塊鏈上。在下文,我們將嘗試解構該調用,了解你在執行該 javascript 函數時會發生的一切。

1. 構建原始交易對象

如下圖所示,voteForCandidate 函數調用首先被轉化成了原始交易(rawTxn)。Web3js庫被用來構建原始交易對象。

txnCount = web3.eth.getTransactionCount(web3.eth.accounts[0])var rawTxn = {    nonce: web3.toHex(txnCount),    gasPrice: web3.toHex(100000000000),    gasLimit: web3.toHex(140000),    to: '0x633296baebc20f33ac2e1c1b105d7cd1f6a0718b',    value: web3.toHex(0),    data: '0xc7ed014952616d6100000000000000000000000000000000000000000000000000000000'};

讓我們試著了解下該原始交易對象中的所有欄位,以及它們是如何設置的。

nonce(隨機數):每個以太坊帳戶都有一個叫做 nonce 的欄位,來記錄該帳戶已執行的交易總數。Nonce 的值隨著每個新交易的執行不斷增加,這能讓網絡了解執行交易需要遵循的順序。Nonce 也被用來進行重放保護。
gasPrice(gas價格):即你願為該交易支付的每單位 gas 的價格如果你正在主網上執行交易,ETH Gas Station上正好有一個網站,你可以參照其建議為你的交易設定 gas 價格,以便交易在一定時間內成功執行。Gas 價格目前以 GWei 為單位,其範圍是0.1->100+Gwei。下文會進一步介紹 gas 價格及其影響。

gasLimit(gas上限):即你願為該交易支付的最高 gas 總額。該上限能確保在出現交易執行問題(比如陷入無限循環)之時,你的帳戶不會耗盡所有資金。一旦交易執行完畢,剩餘所有 gas 會返還至你的帳戶。

to:即該函數調用被送往的地址。0x633296baebc20f33ac2e1c1b105d7cd1f6a0718b 是我們的案例中投票合約的地址。

Value(值):即你打算發送的以太幣總量。當我們執行voteForCandidate函數時,我們根本沒有發送以太幣,因此 value 為零。如果你要執行一個交易,向另一個人或合約發送以太幣,你會需要設置 value 值。

data(數據):讓我們來看看data欄位是如何計算出來的。

你先從 voteForCandidate(bytes32 candidate)(32位元組的候選人)的 ABI 中獲取函數籤名,並得出它的哈希值。

> web3.sha3('voteForCandidate(bytes32 candidate)')'0xc7ed014922ff9493a686391b70ca0e8bb7e80f91c98a5cd3d285778ab2e245b3'

取該哈希值的前4個字節,即:0xcc9ab267。

然後將參數『Nick』轉化為32位元組,得到52616d6100000000000000000000000000000000000000000000000000000000

將二者結合,得到數據有效載荷。

2.籤署交易

如果你記得的話,你使用了web3.eth.accounts[0]來執行該交易。以太坊網絡需要知道你確實是該帳戶的所有者,從而確保其他人不能以你的名義執行該交易。要向網絡證明這點的方法是使用該帳戶的相應私鑰籤署交易。籤署過後的交易如下圖所示:

const privateKey = Buffer.from('e331b6d69882b4ab4ea581s88e0b6s4039a3de5967d88dfdcffdd2270c0fd109', 'hex')const txn = new EthereumTx(rawTxn)txn.sign(privateKey)const serializedTxn = txn.serialize()

3. 交易經由本地驗證

籤署過後的交易會提交至你的本地以太坊節點。然後你的本地節點會驗證已籤名的交易,確保它真的是由這個帳戶地址籤署過的。

4. 交易被廣播至網絡

已籤署交易經由你的geth/parity節點廣播至其對等節點,這些對等節點再將該交易廣播給它們的對等節點,以此類推。一旦交易被廣播至網絡,你的本地節點也會輸出該交易的id,你可以用它來追蹤你的交易的狀態。該交易id就是已籤署交易對象的哈希值。

transactionId = sha3(serializedTxn)

如果你是在公共的以太坊網絡上執行該交易的話,追蹤你的交易狀態的最佳方式是通過etherscan.io。如上圖所示,你是否注意到了有幾個節點被標記為 Etherscan 節點。Etherscan 的團隊運行了幾個節點,並將一個很棒的前端網絡應用連接到了 Etherscan上。如果你的交易被他們的節點選中,你可以在他們的網站上查看自己的待定交易。

還要記住的一點是,並非所有節點都會接受你的交易。其中一些節點可能被設置成了只接受 gas 價格超過某一最低值的交易。如果你設置的 gas 價格低於該下限,則節點會忽略你的交易。

5. 礦工節點接受交易

正如圖中所示,以太坊網絡同時擁有礦工節點和非礦工節點。可能你也知道,礦工的職責是將你的交易包含到區塊上。礦工是交易池的維護者,你的交易先是被添加進交易池,再由礦工進行開始評估。

從上圖中你會注意到礦工將所有交易存儲在根據 gas 價格分類的池中。gas 價格越高,該交易就越有可能被添加進下一個區塊。這是礦工節點的常見設定(為得到更高的報酬進行優化)。不過,礦工可以將自己的節點設置成根據自己的喜好對交易進行分類(例如,他們為了幫助網絡只挖掘gas價格低的交易)。

從上圖中,你看出我們的 voteForCandidate 交易是如何沉入礦池底端的嗎?一旦所有gas價格高的交易都被挖出來包含進區塊之後,礦工將挖掘我們的交易。

還有要注意的一點是,礦池可以容納的交易數是有限的。比如,一場眾籌正在火熱進行中或是一個非常流行的分布式應用(如加密貓)橫空出世。人們提交了 gas 價格高的交易,希望礦工能最先選中他們的交易。如果 gas 價格高的交易填滿了礦池,gas 價格低的交易就會被放棄。我們的候選人 Nick 在一段時間內就別想收到任何選票了。在這種情況下,我們甚至得重新廣播我們的交易。

另一個能讓你的交易在礦池裡上升的技巧是重新提交你的交易,提高 gas 價格並維持 nonce 值不變。這樣一來,當礦工接收到新交易時,gas 價格更高的新交易會覆蓋之前的交易。如果改變了 nonce 值,重新提交的交易就會被認為是不同的交易(最後會為Nick舉行兩次投票)。這裡推薦一篇很好的文章,作者Jim McDonald 對此做出了深入的解釋。

6. 礦工節點找到一個有效區塊並將它廣播至網絡

礦工最後選中了我們的交易,與其他交易一起包含進區塊。礦工只能選擇一定量的交易添加進區塊,因為以太坊已經設置了單個區塊 gas 上限,換言之,交易的所有 gas 上限總數不能超過區塊 gas 上限。你可以在 ethstats.net 上查看當前 gas 上限。

一旦礦工選擇將交易包含進區塊,這些交易將被驗證並包含進一個待處理區塊,工作量證明開始。某個礦工節點(通過解決工作量證明難題)最終會找到一個有效的區塊,並將這一區塊添加到區塊鏈上。就像經由你的本地節點廣播的原始交易會被其他節點接收那樣,礦工節點也會將這一有效區塊廣播給其他節點。

7. 本地節點接收/同步新區塊

最終,你的本地節點將接收這個新區塊,並同步區塊鏈在本地的副本。一旦接收到這個新區塊,本地節點就會執行區塊裡的所有交易。

如果你使用 truffle 執行你的交易, truffle 會不斷測驗區塊鏈以求確認。一旦它發現交易被確認,就會執行 then() 區塊中的代碼,並列印(我們每個例子的)控制臺日誌函數。

二. 使用Metamask而非本地節點

如果你安裝了 MetaMask 瀏覽器插件,你就能在你的瀏覽器中管理你的帳戶。密鑰只會存儲在你的瀏覽器上,因此你是唯一一個有權訪問你的帳戶和私鑰的人。當你在瀏覽器上執行交易之時,插件會將你的函數調用轉化成原始交易,並用你的私鑰籤署交易。 Metamask 運行自己的節點,並且使用這些節點來廣播你的交易(Metamask 使用的是Infura 運營的節點)。如此一來,你就沒必要運行自己的以太坊節點了。

三. 線下簽名

如果你不喜歡用插件,或者擔心你的本地 geth 節點有可能受損(遭篡改),該怎麼辦呢?要解決這一問題有一個安全之策。

你是否注意到了,前兩個步驟根本不需要聯網。如果你想確保自己的交易絕對不會受到篡改,你可以使用一臺沒有聯網的計算機將這一函數調用轉換成原始交易,並使用你的私鑰籤署該交易。之後,你可以複製已籤署交易串,並使用聯網的計算機將其廣播至網絡。你可以使用 Etherscan和 Infura 等服務將你已籤署的交易廣播至網絡。 

另一個安全之策是使用 Ledger 或 Trezor 等硬體錢包。這類錢包存儲了你的私鑰,而籤署交易的密鑰已經編程進了硬體本身。它們需要聯網的原因只是為了發布你的已籤署交易。

希望本文能讓你更好地理解以太坊交易的工作流程。如果發現文中有任何不當之處,請你留言,我會加以改正。

感謝 Jim McDonald為本文校對。

原文連結: https://medium.com/blockchannel/life-cycle-of-an-ethereum-transaction-e5c66bae0f6e
作者: Mahesh Murthy
翻譯&校對: 閔敏 & Elisa

本文經作者授權翻譯及再出版。作者的個人主頁:https://www.zastrin.com/

你可能還會喜歡:

科普 | 以太坊到底是啥?
乾貨 | 以太坊中的帳戶、交易、Gas和區塊Gas Limit

乾貨 | 代幣支付的以太坊智能服務

相關焦點

  • 引介 | 市集開發模式與以太坊 2.0 開發進程
    我發現從這一角度來分析以太坊 2.0 區塊鏈開發非常有趣。以太坊 2.0 項目啟動至今已有一年時間,感覺是個反思的好時機。以太坊 2.0 項目已經很大程度上採用了開放式的市集型開發模式。然而,我們在 Raymond 的願景上更進了一步:在以太坊 2.0 中,我們不僅僅是開發軟體;而是要用完全開放的方式來設計整個協議。我不確定之前有沒有人這麼做過。
  • 乾貨 | 深入探索以太坊世界狀態,Part-2
    這個練習要求我們安裝以太坊。關於安裝以太坊的操作我們已經寫了一篇額外的教程(和本文配套)。另一篇名為 「面向實驗和測試來快速搭建一個以太坊私有網絡」 的文章提供了指引你安裝和配置以太坊私有網絡的手把手教程。一旦搭建好你的以太坊私有網絡,你就能執行交易並探究以太坊的「狀態」是如何根據交易、合約和挖礦來進行改變的。
  • 引介 | Omen:新一代的預測市場
    在 2014 年第一季度,以太坊論壇上出現了一個帖子,詢問去中心化協議是否可以解決依賴於中心化運營者的預測市場的 「信任問題 」。大家的反響都很熱烈,因為許多對以太坊生態系統感興趣的人都知道預測市場是最適合在具備抗審查性的無伺服器平臺上構建的。6 年後,我們發現去中心化預測市場尚未獲得預期的牽引力。
  • 四面楚歌的以太坊
    由於交易速度慢、燃料費貴、擴展性差等缺點,以太坊屢遭詬病。尤其在2018年,諸多公鏈項目揭竿而起,誓要超越以太坊。其中,EOS和波場(TRON)勢頭最猛。EOS一直宣稱實現「百萬TPS」,其超級節點競選更是賺足了眼球。雖有過度營銷的嫌疑,但EOS在主網上線4個月後,總日活躍用戶數超過以太坊3倍之多。至于波場,更是從來不缺少話題。
  • 以太坊又一次大擁堵何去何從?深度對話美圖以太坊DPoS算法實現團隊
    圖:最近一周以太坊交易又出現大範圍擁堵有些人對於以太坊不是特別熟悉,所以開始之前先簡單介紹一下以太坊一些基礎。以太坊整體包含幾個模塊:協議管理,一個是外部訪問和交互的 JSON-RPC 協議(HTTP),一個用來節點發現和塊/交易數據(TCP/UDP) 同步;交易池,存儲當前未打包的交易;共識算法,目前官方版本裡面包含了 PoW 和 PoA(Clique), 共識算法主要的作用就是決定產生新塊,合法性驗證以及衝突解決; EVM,
  • 一筆交易吃掉一頓海底撈,以太坊網絡快用不起了!
    隨著加密市場進入牛市階段,以太坊交易的gas費用也開始飆升,根據ethgasstation提供的數據顯示,近期Gas費用一度超過了500 Gwei,而以一筆Uniswap 交易 200000 gas 計算,就相當於要花掉0.1ETH(折合人民幣大約640元)的手續費。
  • 科普|以太坊、以太幣是什麼
    1、以太坊的產生背景2013年,19歲的Vitalik Buterin在一本主題為「以太坊白皮書:下一代智能連接與去中心化應用平臺」的書中首次提到了以太坊的構想。隨後在2014年,以太坊的算法及協議正式落地,並募集了1.5億美元,系統本身於2015年7月30日最終完成。
  • V神:以太坊2.0將達到每秒數萬筆交易
    在上周的「80000 hours」節目中,V神表示對以太坊2.0非常有信心,此外,已經掌握關於可擴展性版本的相關技術,網絡旨在以「每秒數萬筆交易
  • Echo | 以太坊的願景
    Bitcoin 2.0以太坊是在一次比特幣大會上公開的 [6]。因此早期的媒體報導都側重於將以太坊與比特幣這一密碼學貨幣的前輩作比較(參見 2014 年 Al Jazeera 寫的《比特幣最有雄心的繼承者》 [7];Bloomberg 寫的《比特幣 2.0》)。創立以太坊的最初動機來源於比特幣的腳本語言限制。
  • 以太坊「特修斯之船」
    沒錯,我說的就是以太坊硬分叉事件,通過修改以太坊軟體的代碼,在第1920000區塊強行把The DAO及其子DAO的所有資金全部轉到一個特定的退款合約地址,從而「奪回」黑客所控制的DAO合約的幣。以太坊硬分叉是否成功,取決於一個古老的哲學問題:特修斯之船(The Ship of Theseus)。
  • DeFi「走出」以太坊?
    在此之前還沒有以太坊上的去中心化交易所在波卡鏈上推出,SushiSwap很可能將成為兼容以太坊和波卡的DEX先行者。 除了SushiSwap,波卡和以太坊鏈上陸續出現跨鏈DeFi項目。這些項目的出現,不斷拓展DeFi的市場邊界。
  • Raiden Network : 使用通道技術提升以太坊網絡處理能力
    隨著越來越多的用戶進行越來越多的交易,這可能減緩以太坊網絡運行速度。複雜的問題是很多ICO代幣都是基於以太坊網絡推出的,這使得以太坊交易量像洪水般爆發。Raiden便是以太坊擴容問題解決方案的一部分。受到比特幣閃電網絡的啟發,這種技術將會把絕大多數交易從以太坊區塊鏈轉移並創建一種點對點支付通道的網絡。該網絡旨在大幅度提高交易速度,可能會實現每秒百萬級交易量。
  • 以太坊的競爭者——DFINITY
    本文是「以太坊的競爭者」系列的第二篇文章,這個系列會對挑戰以太坊在智能合約平臺領域統治地位的項目進行探究。今天我們來看一看DFINITY。記者:鉛筆盒DFINITY是一個兼容以太坊的智能合約平臺,實施一些處理區塊鏈性能、擴張及管理的創意。雖然DFINITY屬於「以太坊殺手「的範疇,但該項目對以太坊的態度更傾向於合作,而非對抗。
  • 以太坊的新面孔WETH
    首先,Ether(ETH)是以太坊網絡(Ethereum)上的原生幣種,選擇建立在以太坊上的dAPP通常會部署自己的代幣,比如Augur的REP和Bancor的BNT。而ERC-20是在ETH發布之後制定的一個標準,這個標準定義了代幣應該如何在以太坊網絡上轉移,以及如保持代幣在以太坊網絡上的轉移能夠有一個一致的記錄。
  • 以太坊是元宇宙的基礎設施,所有道路都會通往以太坊
    我們在這裡懷疑它們是否真的適用於一個開放的元宇宙,就像目前以太坊社區的元素一樣。但是這些大品牌應該意識到以太坊是元宇宙基礎設施,而 ETH 是元宇宙貨幣。如果他們想在自己的業務目標與開放元宇宙的需求之間取得平衡,那麼所有的道路都會通過以太坊。
  • 不滿魔獸刪了術士的生命虹吸,這19歲少年創立市值千億的以太坊
    我已經試過了,是騙人的。 「生命虹吸都沒了,術士還叫什麼術士!」2010年,16歲的少年維塔利克憤怒的刪除了《魔獸世界》客戶端,因為暴雪剛剛在3.10補丁中移除了術士的技能「生命虹吸」。幾年後,維塔利克公布了初版《以太坊白皮書》,並通過ICO眾籌獲得了最初的啟動金。這一年他19歲。
  • 以太坊開發指南 #1
    你應該聽說過了以太坊[4]了,準備進入以太坊的世界冒險了嗎?這篇文章將快速介紹一些區塊鏈基礎知識,然後讓了解與模擬的以太坊節點進行交互--讀取區塊數據,檢查帳戶餘額並發送交易。在這個過程中,我們將理解傳統的應用程式與這種新的去中心化應用之間的差異。
  • 區塊鏈技術-智能合約-以太坊 (譯文)
    雖然文章沒有很深的理論,但是它用簡潔的語言描述了區塊鏈技術,智能合約,以及以太坊。文章用了一個可以運行的慈善募捐實例,把以太坊最核心的功能做了演示。區塊鏈(BlockChain)技術吸引了大量的關注,原因不僅是它作為帳本來紀錄交易,成為加密貨幣(例如比特幣)的引擎;更重要的是,它可以封裝代碼和數據,成為「智能合約」(Smart Contract)。
  • 以太坊(ETH)與以太經典(ETC)對比
    以太坊和以太經典之間是一場道德和意識形態的鬥爭。在我們現在看到的兩個不同的以太坊之前,只有一個以太坊。一次事件,5000萬美元被一名不知名的黑客或多個黑客竊取,這導致加密貨幣世界中兩個截然不同的陣營正在形成。下面是以太坊 - 正如我們現在所知道的那樣 - 以及它與以太經典的比較。
  • 什麼是以太坊EIP-1559協議
    用戶每天支付超過500萬美元的交易費用與以太坊進行交互。相比之下,+用戶在比特幣上的支出僅佔這一數字的28%,約為150萬美元。以太坊上有很多DAPP應用,被稱為是公鏈之王,以太坊目前平均每13秒出一個塊,用戶根據競價模式支付交易手續費,讓礦工把自己的交易打包進塊,從而完成交易,然而這種不透明的模式,導致以太坊用戶不知道什麼樣的出價合適,這就推高了交易手續費,尤其是基於以太坊網絡的DAPP,包括DeFi和NFT需求火熱,這些需求已經超過了以太坊的容量。