如何与智能合约中的任何给定链进行通信?
How to communicate with any given chain from Smart Contract?
我正在尝试构建一个接受以下输入的函数
- 用户钱包地址
- NFT 地址
- 链号
并验证 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()
).
我正在尝试构建一个接受以下输入的函数
- 用户钱包地址
- NFT 地址
- 链号
并验证 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()
).