如何使用 Chainlink oracle 接收 int 数组?

问题描述 投票:0回答:2

我正在训练从链下 API 获取数据,以便在我的智能合约中使用它。为此,我使用 Chainlink 预言机。

我见过获取一个 Uint256 或一个 Bool 或一个 Bytes32 变量的作业。但是如果你想接收一个数组怎么办? 我希望收到像

[1, 2, 3, 4]
这样的东西作为
uint[]
以便能够循环并使用各个值。

最好的方法是什么?

我已经使用了 Get->Bytes32 和 Get->Bytes, 方法,但随后我需要在 EVM 内解析这些字节,我认为这不是一个好主意。

ethereum solidity smartcontracts chainlink
2个回答
1
投票

目前不支持数组作为响应类型,这里是 当前支持的响应类型列表

您可以:

  1. 通过
    uint256
    值读取
    uint256
    值,假设它是一个固定大小的数组,像这样
  2. 提出多变量响应请求
  3. 提出您提到的大响应请求,并处理这些
    bytes32
    值。请记住,目前任何返回值都必须在 32 个字节之内。如果该值大于该值,请发出多个请求。

0
投票

您当然可以从 Chainlink Oracle 检索数组响应。

如果您想运行自己的 Chainlink 预言机/节点,则需要确保部署了最新的预言机合约(截至本文为止是

Operator.sol
),它支持最广泛的数据类型:https: //docs.chain.link/chainlink-nodes/v1/fulfilling-requests#setup-your-operator-contract

用于返回 uint256[] 对象的 Chainlink 作业配置应如下所示(仅显示

ethabiencode
作业任务的摘录。请注意,此作业任务的输入
${parse}
必然是
jsonparse 的输出) 
作业任务,应该是一个数组(即
[10,20]
)):

    ...
    encode_data [
                type="ethabiencode" 
                abi="(bytes32 requestId, uint256[] value)" 
                data="{\\"requestId\\": $(decode_log.requestId), \\"value\\": $(parse)}"
                ]
    ...

最后,消费者合约的履行函数(即在链上接收结果的函数)将如下所示:


    // Receive the result from the LinkWellNodes.io Chainlink oracle
    uint256[] public responseArr;
    event RequestFulfilled(bytes32 indexed requestId);
    function fulfill(bytes32 requestId, uint256[] memory data) public recordChainlinkFulfillment(requestId) {
        responseArr = data;     // example value: responseArr[0] = 10, responseArr[1] = 20
    }

如果您只想检索此数据而不运行自己的 Chainlink 预言机,您可以要求现有节点运营商支持您的请求。

以下链接是如何从现有 Oracle 提供商检索以太坊 Goerli 测试网上的 uint256 数组的示例(免责声明:我是该 Oracle 团队的成员):https://docs.linkwellnodes.io/services/direct -request-jobs/testnets/Ethereum-Goerli-Testnet-Jobs?dataType=Uint256%5B%5D

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.