Проверка результата сообщения/вызова L1 -> L2 в Starknet
Я написал пару контрактов для L1 (Ethereum) и L2 (Starknet), и они общаются здесь .
Я вижу, что L1 отправил ожидаемое сообщение, см. этот TX на etherscan . Однако последнее сообщение там никогда не выполнялось в моем контракте L2. Я пытаюсь выяснить, вызывал ли L2 Sequencer функцию обработчика моего контракта, и если да, то как это произошло.
Кто-нибудь здесь знает, как найти TX, который обрабатывает вызов на L2? Или какие-либо другие идеи/инструменты, которые помогут выяснить, почему l1_handler никогда не выполнялся/не работал?
1 ответ
Во-первых, транзакции, поступающие из L1, являются обычными транзакциями, и поэтому их хэш можно вычислить так же, как и транзакции вызова. Чтобы получить больше информации об этом, вы можете проверить документацию здесь . Теперь это полезно для понимания теории, но не настолько, чтобы фактически вычислить хэш tx.
Вот событие L1, которое отправляет сообщение в StarkNet, и здесь я получаю необходимую информацию для вычисления хэша.
Address 0xde29d060d45901fb19ed6c6e959eb22d8626708e
Name LogMessageToL2 (index_topic_1 address fromAddress, index_topic_2 uint256 toAddress, index_topic_3 uint256 selector, uint256[] payload, uint256 nonce)View Source
Topics
0 0x7d3450d4f5138e54dcb21a322312d50846ead7856426fb38778f8ef33aeccc01
1 0x779b989d7358acd6ce64237f16bbef09f35f6ecc
2 1524569076953457512425355396075576585145183562308719695739798372277154230742
3 1285101517810983806491589552491143496277809242732141897358598292095611420389
Data
payload :
1393428179030720295440092695193628168230707649901849797435563042612822742693
11819812303435348947619
0
nonce :
69106
Вот сценарий, который я использую применительно к вашей транзакции (это может измениться в будущем)
from starkware.cairo.lang.vm.crypto import pedersen_hash
from starkware.cairo.common.hash_state import compute_hash_on_elements
from starkware.crypto.signature.fast_pedersen_hash import pedersen_hash
from typing import List
def calculate_transaction_hash_common(
tx_hash_prefix,
version,
contract_address,
entry_point_selector,
calldata,
max_fee,
chain_id,
additional_data,
hash_function=pedersen_hash,
) -> int:
calldata_hash = compute_hash_on_elements(data=calldata, hash_func=hash_function)
data_to_hash = [
tx_hash_prefix,
version,
contract_address,
entry_point_selector,
calldata_hash,
max_fee,
chain_id,
*additional_data,
]
return compute_hash_on_elements(
data=data_to_hash,
hash_func=hash_function,
)
def tx_hash_from_message(
from_address: str, to_address: int, selector: int, nonce: int, payload: List[int]
) -> str:
int_hash = calculate_transaction_hash_common(
tx_hash_prefix=510926345461491391292786, # int.from_bytes(b"l1_handler", "big")
version=0,
contract_address=to_address,
entry_point_selector=selector,
calldata=[int(from_address, 16), *payload],
max_fee=0,
chain_id=1536727068981429685321, # StarknetChainId.TESTNET.value
additional_data=[nonce],
)
return hex(int_hash)
print(
tx_hash_from_message(
from_address="0x779b989d7358acd6ce64237f16bbef09f35f6ecc",
to_address=1524569076953457512425355396075576585145183562308719695739798372277154230742,
selector=1285101517810983806491589552491143496277809242732141897358598292095611420389,
nonce=69106,
payload=[
1393428179030720295440092695193628168230707649901849797435563042612822742693,
11819812303435348947619,
0,
],
)
)
Это выводит
0x4433250847579c56b12822a16205e12410f6ad35d8cfc2d6ab011a250eae77f
который мы можем найти здесь, который был правильно выполнен.