Как пул tx обрабатывает tx с одного и того же адреса с последовательным одноразовым номером?

У меня есть два вопроса.

Первый касается txs с одного и того же адреса с последовательным одноразовым номером. Когда мы используем PromotionExecutables для перемещения tx из будущей очереди в список ожидающих, он сравнивает баланс всех tx с последовательным одноразовым номером с балансом текущего состояния (с функцией фильтра), но когда вы обрабатываете один tx и следующий tx следует сравнивать с баланс отложенного состояния. Например, если текущий баланс равен 100, одноразовый номер учетной записи равен 5. У меня есть два txs в будущей очереди, первая общая стоимость составляет 80 с одноразовым номером 6, а вторая также 80 с одноразовым номером 7, тогда кажется, что оба txs могут быть переведен в список ожидания, потому что оба меньше 100. Как мы можем избежать такой ситуации, когда пакет блокируется? Я не могу найти какую-либо функцию, обрабатывающую такую ​​​​проверку в tx-pool.

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

Я обнаружил, что obscuren и karalabe однажды говорили об этом в этом выпуске , однако впоследствии это стало неактуальным.

Ответы (1)

Пул обрабатывает только управление виртуальным одноразовым номером, другие правила не будут проверяться пулом. Когда работник упакует txs в блок, он зафиксирует все ожидающие транзакции, и те транзакции с исполняемыми проблемами не будут добавлены в блок. Проверьте код ниже:

func (self *worker) commitNewWork(){
........

pending, err := self.eth.TxPool().Pending()
    if err != nil {
        log.Error("Failed to fetch pending transactions", "err", err)
        return
    }
    txs := types.NewTransactionsByPriceAndNonce(self.current.signer, pending)
    env.commitTransactions(self.mux, txs, self.chain, self.coinbase)

    // Create the full block to seal with the consensus engine
    if fullBlock, err = self.engine.Finalize(self.chain, header, env.state, env.txs, uncles, env.receipts); err != nil {
        log.Error("Failed to finalize block for sealing", "err", err)
        return
    }
........
}