1. Мне нужно как можно быстрее инициировать несколько транзакций на один и тот же адрес контракта и получить подтверждение от сети. Означает, что несколько транзакций записываются в один и тот же блок.
2. При использовании Web3.py и Infura.io. В сети kovan тест был пройден. Но в Mainnet каждая транзакция, инициированная в то же время, подтверждалась на блоке, разделенном 1 блоком.
3. Лимит газа составлял 1 миллион, цена газа была мгновенной максимальной ценой.
4. Nonce не вопрос. Я получаю одноразовый номер первой транзакции через getTransactionCount(), затем сам же устанавливаю вторую транзакцию (нонс + 1), чтобы убедиться в правильности нонса, и тест проходит в сети кована.
Конечно, в основной сети гораздо больше транзакций, чем в тестовых сетях, мемпулы майнеров переполнены. В то время как в тестовых сетях блоки не всегда заполнены (== достигнут лимит газа), в основной сети транзакции должны выбираться тщательно, чтобы максимально точно соответствовать выбранному лимиту газа.
Также может случиться так, что клиенты (майнеров) настроены таким образом, чтобы иметь большее равенство между всеми отправителями и принимать только одну транзакцию от отправителя за блок (если не заданы некоторые условия, возможно - не совсем невозможно иметь более одной транзакции за отправителя за блок, но это случается очень и очень редко.)
Вы можете увеличить свои шансы, увеличив цену газа, но нет никакой гарантии, что несколько транзакций будут включены в один и тот же блок. (помимо того, что вы сами стали шахтером)
Если вы пытаетесь сделать что-то между первой и второй транзакцией, обратите внимание, что майнеры могут «опередить» вас. Они могут намеренно задержать вашу вторую транзакцию и запустить свою собственную между ними. Если у них есть экономические стимулы для этого, они, вероятно, будут.
Если вам необходимо, чтобы в одном блоке происходили два вызова функций, вы можете объединить их, используя смарт-контракт, который последовательно вызывает обе функции. Итак, если транзакция 1 вызывает контракт A
, функцию foo()
, а транзакция 2 вызывает контракт B
, функцию bar()
, то у вас может быть вызов контракта:
contract C {
function grouped() {
A.foo();
B.bar();
}
}
Рагхав Суд
it's not toally impossible to have more than one transaction per sender per block
Это происходит постоянно, я бы не сказал, что редко. Почти в каждом блоке есть несколько транзакций как минимум с одного адреса.Кайл Сюй