像 geth 這樣的客戶可以在 txpool 中保留的最大交易大小是多少?
乙太坊客戶端可以保留在交易池中的交易限制是多少?
根據這個答案,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 位架構和9223372036854775807
64 位架構。待處理交易池
待處理的事務儲存在
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 筆交易都準備好被處理並插入到區塊鏈中(只要有足夠的氣體)。