如何与智能合约中的任何给定链进行通信?

How to communicate with any given chain from Smart Contract?

我正在尝试构建一个接受以下输入的函数

  1. 用户钱包地址
  2. NFT 地址
  3. 链号

并验证 NFT 是否实际上由给定链上的用户拥有。

如果都在一个链条内,就很容易搞定了。但我希望这个功能能够验证任何给定链的所有权。 我读过有关 Chainlink (Oracles) 的文章,据我所知,它们似乎没有提供这样的功能。 据我所知,下面的所有交互都是通过 JSON-RPC 调用发生的。但我真的不知道如何用 solidity 或任何其他语言来做到这一点。

如果有人知道如何解决这个问题,请留下答案。

链上合约(用 Solidity 或其他 EVM 兼容语言编写)不能直接与其他链通信,也不能执行 JSON-RPC 调用。

您可以使用 oracle 模式从链下应用程序请求信息,该应用程序完成请求(通过查询其他链),并将结果发送回您的合约。

pragma solidity ^0.8;

contract MyContract {
    // TODO implement a way to keep track of the requests
    // so that you can pair the incoming result to its according request data

    address oracle = address(0x123);

    function requestNFTOwnerCheck(address owner, address collection, uint256 tokenID, uint16 chainID) external {
        (bool success, ) = oracle.call(abi.encode(owner, collection, tokenID, chainID));
        require(success);
    }

    function callback(bool result) external {
        require(msg.sender == oracle, "This function can be invoked only by the oracle");
    }
}

oracle(offchain 应用程序)侦听到达 0x123 地址的交易,解码参数,在另一条链上执行查询,然后将包含结果的交易发送回您的合约(函数callback()).