BTC
ETH
HTX
SOL
BNB
查看行情
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt

一文讀懂以太坊交易可能經歷的8個狀態

区块链大本营
特邀专栏作者
本文約3253字,閱讀全文需要約5分鐘
在本文中,我們將重點介紹以太坊上複雜的交易生命週期;開發者在這些情況下嘗試讓dapp 提供理想的用戶體驗的挑戰;以及dfuse 是如何幫助突破這些挑戰的。
AI總結
在本文中,我們將重點介紹以太坊上複雜的交易生命週期;開發者在這些情況下嘗試讓dapp 提供理想的用戶體驗的挑戰;以及dfuse 是如何幫助突破這些挑戰的。

編者按:本文來自區塊鏈大本營(ID:blockchain_camp)編者按:本文來自

區塊鏈大本營(ID:blockchain_camp)

區塊鏈大本營(ID:blockchain_camp)

編者按:本文來自

區塊鏈大本營(ID:blockchain_camp)

編者按:本文來自

區塊鏈大本營(ID:blockchain_camp)

二級標題

,作者:dfuse,Odaily經授權轉載。

二級標題

在dapp 中跟踪交易的進程並為用戶提供良好的體驗是具有挑戰性的。如今,許多基於以太坊的dapp 都可以提供吸引人但還是相對靜態的用戶體驗:應用能顯示某個時間點上的交易狀態,但必須通過刷新(點擊刷新或dapp UI 定期刷新頁面)才能得到信息的更新。市面上有相對更動態的接口,但提供的數據粒度還是不夠細,或者/同時以高網絡流量為代價,在其底層區塊鏈節點上施加高負載。

二級標題

二級標題

  • 當今的Dapp 接口

  • 用戶在交易過程中經常需要更新信息(例如,知道轉賬什麼時候完成了),因此dapp 會在界面上放一個“刷新” 按鍵(或定期自動為用戶刷新頁面),或者用戶需要直接點擊瀏覽器的刷新按鈕來獲取更新。

  • 二級標題

  • 有些用戶體驗更成熟的dapp 會向用戶顯示交易的動態更新。它們會在後台輪詢AJAX 請求,重複檢查其以太坊節點是否有更新,然後將更新發佈到前端。這麼做是非常複雜的,因為dapp 必須進行大量API 調用,查詢許多不同的數據源(包括區塊、內存池和網絡條件),從而才能從頭到尾的跟踪交易的生命週期。

二級標題

以太坊節點確實提供了鏈上事件的流讀取功能,但功能有限,只能通過使用以太坊的JSON-RPC 接口的PUB/SUB 功能才可用(在使用GraphQL 時不可用)。 PUB/SUB 接口允許dapp 接收一些事件類型的通知:

二級標題

newHeads——每次新的區塊header 附加到鏈上

二級標題

  • 二級標題

  • syncing——指示節點何時開始或停止同步

  • 二級標題

  • 二級標題

  1. 以太坊交易生命週期

  2. 以太坊交易是有復雜的生命週期的。每個交易都會經過多個的state (狀態),在整個過程中經歷各種state 的變更,可能前進也可能回滾。

交易狀態



以太坊交易從提交上鍊到(在一定的成功機率下)入塊,它會經歷如下的一系列狀態:

PENDING (待處理):交易在等待礦工揀选和處理,位於我們所稱的mempool (內存池)中。礦工通常會首先選擇gas 價格較高的交易,因此gas 價格較低的交易可能會長期處於PENDING 狀態。 Gas 價格最低的交易可能永遠都不會被選中,那就會導致它們無限期地處於PENDING 狀態。

  • 二級標題

  • IN_BLOCK(入塊):當礦工成功選擇交易並將其處理進入區塊,交易將進入IN_BLOCK 狀態。如果交易進入IN_BLOCK 狀態,但它所在的區塊分叉了,則交易可能回到PENDING 狀態。

  • 另一筆來自同一發送者且有相同nonce 的交易進入了IN_BLOCK 狀態,或

  • 二級標題

  • 另一筆來自同一發送者且有相同nonce 但gas 價格高出12%的另一筆交易進入了PENDING 狀態

二級標題

States(狀態)轉換

POOLED(入池):處於UNKOWN (未知)狀態的交易進入等待礦工選擇的交易池,被稱為POOLED 並進入PENDING (待處理)狀態。處於REPLACED(被替換)狀態的交易,如果替換條件不再成立(例如:在極少數情況下,處於IN_BLOCK (入塊)的低gas 價格的交易被分叉,而替代它且具有相同nonce 和發送者的交易仍在網絡上游動),則也有可能再次變為POOLED 狀態。

二級標題

MINED (被挖礦):被挖礦的交易是由礦工處理過的交易,這過程會創建一個區塊。一旦被挖,交易就被算做處於IN_BLOCK (入塊)狀態。由於以太坊網絡的點對點性質,從一個指定節點的角度監測,交易可以從UNKNOWN (未知)狀態直接進入到IN_BLOCK (入塊)狀態,無需明顯地通過PENDING (待處理)狀態。出於相同的原因,從一個指定節點的角度監測,交易也可以不通過PENDING (待處理)狀態而直接從REPLACED(被替換)狀態轉換為IN_BLOCK (入塊)狀態。

FORKED(被分叉):當已被挖的交易處於被網絡撤消的區塊中時,就是產生了被分叉的交易。那個區塊內的所有交易將接連被分叉,從IN_BLOCK (入塊)狀態轉回到PENDING (待處理)狀態。

二級標題

如上所述,以太坊上的交易的生命週期是非常複雜的,這使得dapp 很難去準確的跟踪它並向用戶提供無縫式、流暢的更新。

二級標題

dfuse 平台為提供了一個豐富的、能夠串流監聽的接口,該接口支持實時詳細跟踪以太坊交易的生命週期。 dfuse 以太坊交易狀態跟踪器API 使開發人員能夠提交以太坊交易,然後在同一數據通道上即刻獲取精細的狀態更新,跟隨交易在其整個生命週期中的進展。

  • 二級標題

  • 使用GraphQL,您可以實時監聽指定類型交易的變化,同時可以精確指定每次交易發生變化時您想收到的數據。 dfuse 平台處理了跟踪交易這項工作的複雜性,並會在事件發生時實時傳輸給dapp。

  • 二級標題

  • 快速,

  • 如果沒有使用dfuse,dapp 則必須一次次的訪問區塊鏈以捕獲交易經歷的所有轉換再更新給用戶,並且後端代碼需要去準備好應對每個狀態轉換。

ETH
歡迎加入Odaily官方社群