Измерение времени выполнения транзакции Элронда
Я отправляю транзакции, используя Python 3 и erdpy. Когда транзакция завершается со статусом «успех», у меня в данных транзакции есть отметка времени, которая, как я думаю, является временем входа транзакции в блокчейн. Но есть ли способ узнать другую метку времени со временем, когда транзакция была разрешена?
Я хочу знать, сколько времени ушло на обработку одной транзакции.
1 ответ
Я бы сказал, что (на данный момент я пишу это) вычисление времени обработки транзакции не является тривиальной задачей. Причина, по которой это происходит, заключается в шардинге и том, как обработка может происходить между шардами. Грубая идея (насколько я понимаю) такова:
- получить отметку времени исходного блока сегмента, в котором транзакция была впервые опубликована
- получить временную метку целевого сегмента, заблокировать транзакцию или последний результат SC, опубликованный в последний раз
- вычесть два
Вы должны отметить тот факт, что транзакция может сильно различаться с точки зрения того, для чего она предназначена. Это может варьироваться от простого перевода стоимости с одной учетной записи на другую, внутри сегмента или между сегментами, до сумасшедших последовательных операций, таких как вызов смарт-контракта, который, в свою очередь, может вызывать другой смарт-контракт, и каждый из них может генерировать смарт-контракт. Результаты, которые должны распространяться обратно так же, как и простая транзакция (по сути, это тоже транзакции). Таким образом, вы должны вычислить от первой временной метки (обычно временной метки первого блока, включающего транзакцию в сегменте отправителя) до временной метки целевого блока, включающего последнее событие, инициированное обработкой транзакции.
С технической точки зрения вам придется копаться в этих блоках с помощью нескольких анализов данных tx, скрещивать данные между этими разными хэшами, и я полагаю, что это будет примерно так:
- Начиная с вашего хэша tx, найдите хэш миниблока, в который tx был включен
- Перейдите к NotarizedAtSourceInMetaHash и найдите блок, который включает в себя хэш вашего миниблока, и получите его метку времени. Это будет время, когда ваша транзакция начнет свой поток выполнения.
- Перейдите к notarizedAtDestinationInMetaHash и найдите блок, который включает в себя хэш вашего миниблока, и получите окончательную временную метку, из которой следует вычесть первую временную метку. Если транзакция имеет SCResults, вам нужно взять notarizedAtDestinationInMetaHash последнего созданного SCResult и найти блок, который включает хеш этого SCResult. Это будет последняя отметка времени, из которой вы должны вычесть.
Также отнеситесь к этой информации с долей скептицизма, так как я не уверен на 100%, что это правильный подход к этому расчету.