Как синхронизируется txpool между узлами в провайдере web3 JSON RPC?

Насколько я понимаю, есть некоторое состояние, которое сохраняется на узле при взаимодействии с ним через JSON RPC. Одним из таких состояний, локальных для узла, является txpool. Пул txpool выставляется с помощью web3.eth.getTransaction(txHash)метода. Он возвращает транзакцию transaction.blockHash == null, если транзакция находится в txPool, и возвращает transaction == null, когда транзакция неизвестна.

Если sendTransactionвызов сделан на один узел, за которым следует getTransactionвызов на другой узел, с хэшем транзакции, возвращенным из sendTransaction, будет возвращена нулевая транзакция, поскольку транзакция находится только в txpool первого узла, а второй узел ничего о ней не знает.

Что делают такие сервисы, как myetherwallet, чтобы гарантировать, что сеансы поддерживаются между запросами, чтобы подобные вещи не происходили? Есть ли способ синхронизировать пулы транзакций?

Ответы (1)

Это сложный вопрос, я использую максимально краткое описание. Сначала read the facking source code.

Трансляция транзакций . В файле handler.go есть txBroadcastLoopметод, функция которого заключается в отправке локальной транзакции одноранговым узлам подключенных, когда транзакция зафиксирована, этот метод будет вызываться событием. с помощью метода BroadcastTx этот tx будет доставлен одноранговым узлам по сети p2p, если у вас есть интерес к его анализу, прочтите исходный файл, чтобы узнать, как сеть p2p создается, подключается, получает или отправляет сообщение.

Получить транзакцию . В том же исходном файле handler.go вы можете найти метод handleMsg , его обязанность — получать сообщения от подключенных пиров. В строках 650 находится логика, связанная с удаленной транзакцией. Сначала эта транзакция будет помечена как удаленная транзакция, потому что есть особое суждение, например, отбрасывать удаленные транзакции по нашей собственной минимальной приемлемой цене газа и т. д. И затем эта удаленная транзакция будет добавлена ​​в tx_pool, перед добавлением tx_poolесть так много проверок, вы можете найти подробную логику добавления пула транзакций в исходном файле tx_pool.go .

Надеюсь поможет~