Насколько я понимаю, есть некоторое состояние, которое сохраняется на узле при взаимодействии с ним через JSON RPC. Одним из таких состояний, локальных для узла, является txpool. Пул txpool выставляется с помощью web3.eth.getTransaction(txHash)
метода. Он возвращает транзакцию transaction.blockHash == null
, если транзакция находится в txPool, и возвращает transaction == null
, когда транзакция неизвестна.
Если sendTransaction
вызов сделан на один узел, за которым следует getTransaction
вызов на другой узел, с хэшем транзакции, возвращенным из sendTransaction
, будет возвращена нулевая транзакция, поскольку транзакция находится только в txpool первого узла, а второй узел ничего о ней не знает.
Что делают такие сервисы, как myetherwallet, чтобы гарантировать, что сеансы поддерживаются между запросами, чтобы подобные вещи не происходили? Есть ли способ синхронизировать пулы транзакций?
Это сложный вопрос, я использую максимально краткое описание. Сначала read the facking source code
.
Трансляция транзакций . В файле handler.go есть txBroadcastLoop
метод, функция которого заключается в отправке локальной транзакции одноранговым узлам подключенных, когда транзакция зафиксирована, этот метод будет вызываться событием. с помощью метода BroadcastTx этот tx будет доставлен одноранговым узлам по сети p2p, если у вас есть интерес к его анализу, прочтите исходный файл, чтобы узнать, как сеть p2p создается, подключается, получает или отправляет сообщение.
Получить транзакцию . В том же исходном файле handler.go вы можете найти метод handleMsg , его обязанность — получать сообщения от подключенных пиров. В строках 650 находится логика, связанная с удаленной транзакцией. Сначала эта транзакция будет помечена как удаленная транзакция, потому что есть особое суждение, например, отбрасывать удаленные транзакции по нашей собственной минимальной приемлемой цене газа и т. д. И затем эта удаленная транзакция будет добавлена в tx_pool
, перед добавлением tx_pool
есть так много проверок, вы можете найти подробную логику добавления пула транзакций в исходном файле tx_pool.go .
Надеюсь поможет~