Гарантировано ли сохранение порядка транзакций при использовании обратных вызовов?

Когда я смотрю контракт на события транзакции в web3.py или web3.js,

В web3.js

var contract = web3.eth.contract(abi);

var cInstance = contract.at(address);

var transferEvent = cInstance .Transfer({}, {fromBlock: 0, toBlock: 'latest'});    

transferEvent.watch((error, event) => {});

В web3.py

contract = w3.eth.contract(abi=contract_interface['abi'], address='0x....')

tfilter = contract.on('Transfer',{'fromBlock':0,'toBlock':'latest'})

def transfer_callback(tnx):
    print(tnx)

tfilter.watch(transfer_callback)

Гарантируется ли, что обратный вызов будет запущен в соответствии с порядком транзакций? даже для прошлых сделок . например, первая транзакция будет запущена первой, вторая транзакция будет запущена второй и так далее.

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

Я не уверен, правильно ли я это понимаю, но если вы запускаете несколько транзакций и ждете их событий, нет гарантии, какая транзакция будет обработана первой в общедоступной сети. Майнеры определяют порядок транзакций. Но если вас не волнует этот порядок, я бы предположил, что первое событие, пришедшее из узла, связано с первым обработанным tx.

Ответы (1)

В настоящее время почти вся логика фильтрации находится на узле. Таким образом, точный ответ зависит от того, используете ли вы gethили parityчто-то еще. Я никогда не видел ничего, кроме упорядоченных событий в своих экспериментах с ограниченными событиями в разных узлах.

Обновление для geth : по моему опыту, они всегда возвращаются по порядку. Мне не удалось найти документацию, подтверждающую это, и не было возможности найти ее в коде go. Я бы не стал считать, что так всегда. Вы всегда можете просто добавить утверждение, которое бросает или предупреждает, если номер блока уменьшается в любом из журналов.

Я запускаю узел, используя geth --rpc