我正在训练从链下 API 获取数据,以便在我的智能合约中使用它。为此,我使用 Chainlink 预言机。
我见过获取一个 Uint256 或一个 Bool 或一个 Bytes32 变量的作业。但是如果你想接收一个数组怎么办? 我希望收到像
[1, 2, 3, 4]
这样的东西作为 uint[]
以便能够循环并使用各个值。
最好的方法是什么?
我已经使用了 Get->Bytes32 和 Get->Bytes, 方法,但随后我需要在 EVM 内解析这些字节,我认为这不是一个好主意。
目前不支持数组作为响应类型,这里是 当前支持的响应类型列表。
您可以:
您当然可以从 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
希望有帮助!