Когда я смотрю контракт на события транзакции в 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 до последнего. Таким образом, приведенный выше код также должен получать все прошлые события транзакций.
В настоящее время почти вся логика фильтрации находится на узле. Таким образом, точный ответ зависит от того, используете ли вы geth
или parity
что-то еще. Я никогда не видел ничего, кроме упорядоченных событий в своих экспериментах с ограниченными событиями в разных узлах.
Обновление для geth : по моему опыту, они всегда возвращаются по порядку. Мне не удалось найти документацию, подтверждающую это, и не было возможности найти ее в коде go. Я бы не стал считать, что так всегда. Вы всегда можете просто добавить утверждение, которое бросает или предупреждает, если номер блока уменьшается в любом из журналов.
Лаури Пелтонен