“待處理”塊和 txpool 有什麼區別?
即使我的奇偶校驗節點(私有網路)沒有挖礦,它似乎也有一個待處理的塊以及一個 txpool。
發送一些交易後,該
web3.eth.getBlock("pending")
呼叫返回有關待處理塊的資訊,包括待處理交易:{ author: '0x819773969b2622a0a362fd137b088f90f88bd812', difficulty: '131072', extraData: '0x506172697479', gasLimit: 134086668, gasUsed: 3264884, hash: '0x084fd0478d7d7cea29ecb1a3734a3810933eddf26b1f18138711c93d83066759', logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', miner: '0x819773969b2622a0a362fd137b088f90f88bd812', number: 1, parentHash: '0xf5ef33749ed2fdfae1e6d1ce353d01d3d24cd58c37fd82f0afa78d71f206ffa0', receiptsRoot: '0x70e8edb579ffacaf92e02c9186fff660f9dfcf02e415d6d12f0d6523bcb67dfb', sealFields: [], sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', size: 14575, stateRoot: '0xfd4a9996a00551085ba9c94c362ccbd7ae082683c428afac14de04b426a0015b', timestamp: 1520939275, totalDifficulty: '132096', transactions: [ '0xa6a6eb4ba46b798ca89c58770acaa6be030c5ea96bdf1e26f5a6e692625beb99', '0x77d18ff8c6304ec1f4e7e28605498eb2018e2d3089dd7e59b2124077f3b7956c', '0xddf1cfca112e3e4c653a8a14267f569015db6a1db9f0ba2144fec8f8cfdaebcc', '0x7cedab2409a862b922c19c260f137e94e625a84a08d17414ebc835ecca7c19a9', '0x7d2bb13e6c08c99f3e8cf07fce84842a46a979e547eb009e02b2ba659bcec296', '0x2be0a050cf877d1feb92924d4af313155bd65146fd24cb45cf08323370484c38', '0x02d55f8200a2176dea514a2481a7ddfa3e1fdf9e7514008a6030e4f0dc7dfe82', '0x88d40a05425cd2f5f56ab84ba1aca715b99fc3234fc11b5dfe48688f5de78139', '0xbd6f6e70aaf16916d34b56f3a96af1b344a44fc738a1da0eb0d55c94ffafcadd', '0xf966a75580009d506096396676fc5ea8f8da660fc265d7b83f954a6ee46fd061', '0x40509d3abaabc04367de8428f14d0763b798061180b04bb5a1833746d564e377', '0x41b50420117a8751b8d397a1f043e3767b29928fc0ecdc0d795fd0aa821df749', '0x172631800f2f4125e42feceb1db45d7ef0b0d0f205d09f089b2d877d310a99d8', '0x20629025b98574d7eb0744b252753cff4e65ff9070bb5d03c8540108e72027c4', '0xf7367abaa8c356e9057d36d8ce03e437546afb271b677f6aafdccb464867a5d8', '0xd5e6c9c04bd5b787612d90b9668d0be804e7ddc142186885f019654063fd37f8',
該
web3.eth.getTransactionCount(<address>, "pending")
呼叫返回的事務計數為:94
當
curl
請求使用奇偶校驗特定 API 端點時parity_nextNonce
,該端點根據待處理的塊以及 txpool 返回帳戶交易計數,它還返回相同數量的交易:{"jsonrpc":"2.0","result":"0x5e","id":1}
我似乎沒有掌握待處理塊和 txpool 之間的區別。
最初我的印像是 txpool 是所有待處理事務都儲存在節點上(在記憶體中)的地方,並且待處理塊僅在節點正在探勘時才存在(即正在解決的塊),但顯然這是不是這樣。
有人可以在待處理交易、帳戶隨機數和待處理交易廣播的上下文中解釋這兩個概念之間的區別嗎?
有人問過類似的問題,但沒有具體答案:
getBlock(‘pending’).transactions 與 txpool.status.pending?
eth.pendingTransactions 與 eth.getBlock(‘pending’).transactions
在我看來,這似乎是一種導致一些混亂的優化/邊緣情況——節點假設您連接的網路執行正常,即塊將由理性的參與者探勘。
最初我的印像是 txpool 是所有待處理交易儲存在節點上的地方
這是對的。
…待處理的塊僅在節點正在探勘時出現(即正在解決的塊)
具體來說,這是我認為節點假設它是網路的一部分的部分,該網路正在或將在未來正常執行。
為了幫助澄清,我們可以執行一些場景:
- 在上述情況下:如果交易(TX)少於預期可以放入一個塊(基於氣體限制),那麼可以安全地假設哪個節點繼續探勘下一個塊將把所有來自記憶體池的 TX 進入區塊(畢竟,礦工通過包含盡可能多的 TX 來最大化他們的利潤是有經濟動機的)。因此節點可以對下一個區塊的外觀做出智能猜測。
- 如果記憶體池中的 TX 數量超過了能夠放入塊中的數量,那麼預測哪些 TX 將包含在塊中會更加困難(因為重新排序/修改 TX 列表會影響塊的探勘),但可以肯定的是,任何礦工都將目標包括費用最高的 TX 以最大化其利潤。
有人可以在待處理交易、賬戶隨機數和待處理交易廣播的上下文中解釋這兩個概念之間的區別嗎?
總結並希望回答這些問題:
有效的 TX(在此節點上創建或從對等節點接收)將被添加到節點的本地記憶體池中,直到它們包含在一個塊中(無論該塊是由該節點還是網路上的另一個節點探勘)。此時 TX 將從記憶體池中移除並包含在塊中。
因為我們可以預期大多數節點是理性的並且行為正確;可以智能地猜測哪些 TX(來自記憶體池)將包含在下一個塊中。
當一個帳戶進行 TX 時,該帳戶的 nonce 將增加以強制該帳戶的 TX 排序。即使過去的 TX 沒有包含在一個區塊中,只要隨機數增加,賬戶就可以繼續進行進一步的有效 TX。它們可以出現在記憶體池中,並有望出現在下一個區塊中 - 取決於汽油費、記憶體池中的 TX 數量等。
在節點上送出的新 TX 將被廣播到其對等節點的所有或隨機子集(取決於節點的編碼方式)。新的待處理塊僅在由探勘節點探勘時才會廣播給節點的對等方。