Txpool

像 geth 這樣的客戶可以在 txpool 中保留的最大交易大小是多少?

  • May 12, 2016

乙太坊客戶端可以保留在交易池中的交易限制是多少?

根據這個答案,Geth 可以為每個地址保留 64 筆交易,但是 txpool 中總交易的最大大小是多少?

概括

它受電腦記憶體的限制。

根據我在交易隨機數過高時會發生什麼中的基本測試?geth,當在 4 Gb RAM 中執行時,我因 400 x 64 事務和 4,500 字節的數據負載而崩潰。

我假設您的問題是詢問可以儲存在事務池中的最大事務數是多少。如果您要問單個事務的最大大小是多少,答案是事務大小有限制嗎?.


細節

有一個用於待處理事務的池和一個用於未準備好處理的事務的隊列。

geth 中表示交易池的資料結構可以在go-ethereum - tx_pool.go 第 54 到 77 行看到:

// TxPool contains all currently known transactions. Transactions
// enter the pool when they are received from the network or submitted
// locally. They exit the pool when they are included in the blockchain.
//
// The pool separates processable transactions (which can be applied to the
// current state) and future transactions. Transactions move between those
// two states over time as they are received and processed.
type TxPool struct {
   config       *ChainConfig
   currentState stateFn // The state function which will allow us to do some pre checks
   pendingState *state.ManagedState
   gasLimit     func() *big.Int // The current gas limit function callback
   minGasPrice  *big.Int
   eventMux     *event.TypeMux
   events       event.Subscription
   localTx      *txSet
   mu           sync.RWMutex
   pending      map[common.Hash]*types.Transaction // processable transactions
   queue        map[common.Address]map[common.Hash]*types.Transaction

   wg sync.WaitGroup // for shutdown sync

   homestead bool
}

來自stackoverflow.com - Map中的最大元素數,Go map 資料結構中可以儲存的最大元素數2147483647適用於 32 位架構和922337203685477580764 位架構。

待處理交易池

待處理的事務儲存在TxPool.pending一個map(transaction hash -> pointer to transaction). 在go-ethereum - tx_pool.go中,向該資料結構添加交易時,對交易數量沒有限制檢查。

待處理事務池中的事務數實際上受記憶體限制。

事務隊列

排隊的事務儲存在TxPool.queue一個map(from address -> map(transaction hash -> pointer to transaction)). 在go-ethereum-tx_pool.go中,檢查來自同一From地址的交易數量不超過maxQueued = 64.

From事務隊列中的事務數有效地受記憶體限制,限制相同地址的事務最多只能有 64 個事務。

待處理事務和排隊事務有什麼區別?

待處理交易是準備好處理並包含在區塊中的交易。

排隊事務是事務 nonce 不按順序排列的事務。事務隨機數是具有相同From地址的每個事務的遞增數字。

例如:

  • 來自隨機數為 0的帳戶0xaaaa...aaaa的交易已包含在區塊鏈中。
  • 來自具有 nonce 1的帳戶的交易0xaaaa...aaaa已包含在區塊鏈中。
  • 0xaaaa...aaaa來自具有隨機數 3、4、5、6、7、8、9、10、11、12的帳戶的 10 筆交易發送到乙太坊節點。這些被放置在交易隊列中,因為來自0xaaaa...aaaa具有 nonce 2 的帳戶的交易尚未被乙太坊節點看到。
  • 將 nonce 為 2的賬戶的交易0xaaaa...aaaa添加到交易池後,nonce 為 3、4、5、6、7、8、9、10、11 和 12 的 10 筆交易將從隊列中移至待處理交易池並且所有 11 筆交易都準備好被處理並插入到區塊鏈中(只要有足夠的氣體)。

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