Проверка результата сообщения/вызова 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который мы можем найти здесь, который был правильно выполнен.

Другие вопросы по тегам