首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Starknet中L1 -> L2消息/调用的检查结果

Starknet中L1 -> L2消息/调用的检查结果
EN

Stack Overflow用户
提问于 2022-05-14 11:37:13
回答 1查看 210关注 0票数 1

我已经为L1 (Ethereum)和L2 (Starknet)写了几份合同,并让他们与这里通信。

我可以看到L1发送了我期待的消息,见这个TX在以太扫描上。但是,其中的最后一条消息从未在我的L2合同上执行。我正在试图弄清楚L2 Sequencer是否调用了我的合同的处理程序函数,如果是的话,它是否/如何失败。

这里有人知道如何在L2上找到处理调用的TX吗?或者任何其他的想法/工具,可以帮助找出为什么l1_handler从未执行/失败?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-16 08:42:56

首先,来自L1的事务是常规事务,因此它们的散列计算方法与调用事务相同。要获得更多有关这方面的信息,您可以查看文档这里。现在,这有助于理解这个理论,但对于实际计算tx哈希没有那么大帮助。

下面是向L1发送消息的StarkNet事件,我在这里获得了计算哈希所需的信息

代码语言:javascript
复制
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

下面是应用于您的事务的脚本(这在将来可能会发生变化)

代码语言:javascript
复制
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,我们可以找到正确执行的这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72239816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档