Transactions

挖礦過程中交易的預設順序是什麼?

  • October 16, 2021

我知道黃皮書沒有具體說明如何在一個區塊中對交易進行排序,這由礦工決定。但我對如何實際處理這件事很感興趣(我假設不呼叫一些 rand 函式來獲得排序)。這個對相關問題的回答表明,天然氣價格發揮了作用。例如,geth 在採礦過程中如何訂購交易?

編輯:2017 年 6 月 23 日 - 添加了奇偶校驗詳細資訊(見下文)


格思

對於 vanilla Geth 實現,worker.gocommitNewWork()中的函式按以下方式排序:

//approach 2
transactions := self.eth.TxPool().GetTransactions() <--- fetch from pool
types.SortByPriceAndNonce(transactions)      <---------- order

即按gas價格和nonce值排序(以及按所有者帳戶-見下文)。

程式碼中還有另外兩種方法都被註釋掉了,但可能會為以前的想法提供線索(或為想要使用自己實現的礦工提供範例)。他們是:

  • 方法1:僅按隨機數排序
  • 方法 3:按所有者排序(以不同方式處理單所有者和多所有者交易),然後按價格和隨機數

SortByPriceAndNonce()transaction.go中定義:

// This method first sorts the separates the list of transactions into individual
// sender accounts and sorts them by nonce. After the account nonce ordering is
// satisfied, the results are merged back together by price, always comparing only
// the head transaction from each account. This is done via a heap to keep it fast

排序後,將進一步篩選交易commitTransactions()以刪除任何“低gas”的交易。


平價

對於 Parity,事情要容易一些:有一個 CLI 選項。至少,這將允許以某些基本方式更改排序。

--tx-queue-strategy S          Prioritization strategy used to order transactions
                                in the queue. S may be:
                                gas - Prioritize txs with low gas limit;
                                gas_price - Prioritize txs with high gas price;
                                gas_factor - Prioritize txs using gas price
                                and gas limit ratio (default: gas_price).

引用自:https://ethereum.stackexchange.com/questions/6107