Почему подтверждается, что в основной сети всегда есть 1 блок, когда одновременно инициируются несколько транзакций - web3.py и Infura.io

1. Мне нужно как можно быстрее инициировать несколько транзакций на один и тот же адрес контракта и получить подтверждение от сети. Означает, что несколько транзакций записываются в один и тот же блок.

2. При использовании Web3.py и Infura.io. В сети kovan тест был пройден. Но в Mainnet каждая транзакция, инициированная в то же время, подтверждалась на блоке, разделенном 1 блоком.

3. Лимит газа составлял 1 миллион, цена газа была мгновенной максимальной ценой.

4. Nonce не вопрос. Я получаю одноразовый номер первой транзакции через getTransactionCount(), затем сам же устанавливаю вторую транзакцию (нонс + 1), чтобы убедиться в правильности нонса, и тест проходит в сети кована.

введите описание изображения здесь

введите описание изображения здесь

Ответы (2)

Конечно, в основной сети гораздо больше транзакций, чем в тестовых сетях, мемпулы майнеров переполнены. В то время как в тестовых сетях блоки не всегда заполнены (== достигнут лимит газа), в основной сети транзакции должны выбираться тщательно, чтобы максимально точно соответствовать выбранному лимиту газа.

Также может случиться так, что клиенты (майнеров) настроены таким образом, чтобы иметь большее равенство между всеми отправителями и принимать только одну транзакцию от отправителя за блок (если не заданы некоторые условия, возможно - не совсем невозможно иметь более одной транзакции за отправителя за блок, но это случается очень и очень редко.)

it's not toally impossible to have more than one transaction per sender per blockЭто происходит постоянно, я бы не сказал, что редко. Почти в каждом блоке есть несколько транзакций как минимум с одного адреса.
да, я обнаружил, что контрактный адрес других людей имеет несколько транзакций с одного и того же адреса в одном блоке.

Вы можете увеличить свои шансы, увеличив цену газа, но нет никакой гарантии, что несколько транзакций будут включены в один и тот же блок. (помимо того, что вы сами стали шахтером)

Если вы пытаетесь сделать что-то между первой и второй транзакцией, обратите внимание, что майнеры могут «опередить» вас. Они могут намеренно задержать вашу вторую транзакцию и запустить свою собственную между ними. Если у них есть экономические стимулы для этого, они, вероятно, будут.

Если вам необходимо, чтобы в одном блоке происходили два вызова функций, вы можете объединить их, используя смарт-контракт, который последовательно вызывает обе функции. Итак, если транзакция 1 вызывает контракт A, функцию foo(), а транзакция 2 вызывает контракт B, функцию bar(), то у вас может быть вызов контракта:

contract C {
  function grouped() {
    A.foo();
    B.bar();
  }
}