问题标签 [chainlink]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
chainlink - 是否可以设置作业规范以返回 Chainlink 节点操作员的复杂对象?
现在,返回一个基本类型的值是很常见的,比如ethbytes32
,如果我们想要返回一个字符串结果,并且它的长度超过 256 怎么办?或者我们可以返回一个对象,比如dict
,数组等等?
chainlink - setPublicChainlinkToken 是如何工作的,如果这个函数没有感知当前链环境怎么办?
众所周知,在ChainlinkClient.sol中,有一个函数:setPublicChainlinkToken
,它会感知当前的chainlink信息并为 设置LINK令牌transferAndCall
,但是当我们进入一个全新的链时,我们如何处理这种情况呢?
chainlink - 在构建 Chainlink.Request 时,Chainlink 中的 path 和 copyPath 有什么区别?
我们需要指定访问我们想要的真实值的路径。注意这一行,req.add('copyPath', "data.-1.1"),但有时我们会使用 req.add('path', ...),我们应该什么时候使用copyPath
,什么时候应该使用path
?
solidity - 如何编写支持 Chainlink 功能的代理和实现合约(代理模式通过 DELEGATECALL Solidity 0.6)
我有一个 Solidity 智能合约,它依赖于 Chainlink 预言机来获取外部数据,它有很多功能代码,不需要在每个合约的基础上复制,但确实会改变合约实例的状态,这就是我决定代理的原因使用委托调用的模式最有意义。在代理模式中,我只需为我的合约函数部署一次字节码,然后我的合约的所有其他实例将只委托调用实现合约,并且添加到区块链的唯一新信息将是实例字段那个具体的合同。
我能够部署一个实现合同并将我部署的代理指向它的功能,但是当我在代理上调用锁定功能时,我没有通过检查require(owner == msg.sender,"Owner only")
,这没有意义,因为委托调用应该通过msg.sender
并且我设置了所有者字段在msg.sender
代理的构造函数中。如果我删除了要求,我可以在没有还原的情况下调用该函数,但是locked
anddebugAddr
字段没有改变,即使锁定功能应该改变它们(我认为委托调用是在调用者的上下文中执行的?)。有谁知道我的代理和实施合同有什么问题?我猜这与内存布局或我用来进行委托调用的程序集有关,但我还没有达到可以使用我的谷歌搜索技能找出问题所在的水平,所以如果有人能发现我的代理在哪里合同不正确/格式错误,请告诉我。
谢谢,本
锁定功能代码片段
需要注释的代理合约(另见合约的 txs,你可以看到我调用 lock): https ://kovan.etherscan.io/address/0x1f805d559f6eb7d7b19bf0340db288503f448ae8 代理指向的实现合约 : https ://kovan.etherscan.io/地址/0xfb41ea6452da396279cbd9d9d8c136121e38fab6
需要未注释的代理合约(另请参阅合约的 txs,您可以看到我调用锁定和还原): https ://kovan.etherscan.io/address/0x2d59aa0c1dd9a77d592167c43f2e65adcb275bfe 代理指向的实现合约:0x20a1f27d69f7a257741eddaec43642194af0
代理代码和实现代码
参考代码:https ://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/proxy/Proxy.sol
代理:https ://github.com/benschreyer/Steak/blob/main/SteakQuarterly/ProxyPattern/SteakQuarterlyProxy.sol
重要说明 在我的代理中,我不想将合约声明为 ChainlinkClient,因为那时 ChainlinkClient 的函数将包含在代理中,这是不必要的,因为实现应该已经具有这些方法。相反,我只声明我自己的字段和 ChainlinkClient 。我觉得这是我的实施出错的主要地方,但我不确定需要改变什么/如果这甚至可行
编辑:仍然失败的最小代码示例 该合约应该具有成为 ChainlinkClient 代理的最低要求,并且只有锁定功能和构造函数,我在 require(owner == msg.sender) 上得到相同的还原。如果我删除了要求,则对代理合约的锁定调用表示已确认,但代理的状态变量保持不变(debugAddr 为 0,locked 保持为假)
这是最小的示例代码(我部署在 0.6.12 编译的 remix IDE 上,使用 at 地址检索调用代理的锁定函数,并编译委托代码以便使用委托的 abi):https://github。 com/benschreyer/Steak/tree/main/MinimalCodeExample
编辑 2: 如果我删除了上面链接的代理和实现最小示例的 ChainlinkClient 部分/字段,我会得到一个代理合约,它可以正常工作并且可以接受在实现合约中定义的外部函数调用。
所以我现在的问题是如何编写支持 Chainlink GET 请求功能的代理和实现合约?我的代理需要定义或导入哪些字段/常量/事件/接口,我应该在哪里定义/导入它们以允许 Chainlink 工作?例如,如果我想让我的合约通过 Chainlink 从 API 中检索巴黎的温度,但同时也是一个代理,这样我就不必重新部署它的所有功能并节省 gas 价格。
一旦我将Chainlink添加到组合中,到目前为止我尝试过的任何东西(参见最小破坏示例)都不起作用,因为我不确定如何构造代理合约类,以便代理的存储和访问/写入将调用委托给执行队列。这是我删除 Chainlink 功能后工作的最小代码: https://github.com/benschreyer/Steak/tree/main/MinimalCodeExample/WorkingButNoChainlink 我的工作示例代理/实现模式合同的一个版本,但具有 Chainlink 功能或指针非常感谢代理合约需要哪些字段/事件/常量才能调用预言机。
chainlink - 如何合并两个api以进行chainlink适配器调用
我需要合并两个 API 并制作一个 chainlink 适配器。其中第一个 API 以数组的地址作为输入参数进行发布请求,输出 id(这部分从链外获取数据:来自我们的数据库),第二个 API 调用是 GET 方法,它们的端点是第一个的输出API调用,如何合并这一切
chainlink - 我的链接请求没有得到满足?
有人可以帮我调查为什么我的 Chainlink 请求没有得到满足。它们在我的测试中得到了满足(请参阅安全帽测试 etherscan 事件(https://kovan.etherscan.io/address/0x8Ae71A5a6c73dc87e0B9Da426c1b3B145a6F0d12#events)。但是当我从我的反应应用程序中制作它们时它们没有得到满足(请参阅反应应用程序合同的etherscan 事件https://kovan.etherscan.io/address/0x6da2256a13fd36a884eb14185e756e89ffa695f8#events)。
相同的合约(不同的地址),相同的函数调用。
更新:
这是我在测试中用来调用它们的代码
这是我用来在我的 UI 中调用它们的代码
这是我的 Solidity Chainlink 函数
完整的合约代码可以在这里查看:https ://github.com/colinsteidtmann/dapplu-contracts/blob/main/contracts/BaseAgreement.sol
更新 2:
我发现我的 UI 正在使用工厂合同和克隆模式(基于 EIP 1167 标准和 OpenZepplin 的克隆https://docs.openzeppelin.com/contracts/4.x/api/proxy#Clones)部署我的合同。但是,我的安全帽测试是在没有工厂的情况下部署我的合约。一旦我使用工厂合约进行安全帽测试部署合约,它们就会停止工作。那么,chainlink 是否不适用于代理合约和 EIP 1167 标准?
random - 智能合约 - Chainlink VRF / @openzeppelin/truffle-upgrades 兼容性
现在我正在使用@openzeppelin/truffle-upgrades将基本智能合约转换为可升级的智能合约
因此,我遵循了文档中的所有必需步骤,但仍然存在一个问题:
Truffle-Upgrades 要求我用初始化程序替换构造函数,这对我来说很好,但不适用于导入到我自己的智能合约中的智能合约,示例:
因此松露抱怨:
由于它是第三方包,我无法替换它:)
是否有任何架构技巧/配置?
我浏览了几乎所有关于 chainlink/truffle 的文档,但没有找到解决这个问题的方法。
谢谢!
更新 1:
首先,我将 VRFConsumerBase 合同修改为:(我还删除了评论以保持简短......)
我做了什么:
- 我用初始化器替换了构造函数
- 我从状态变量中删除了不可变关键字
接下来,我在我的文件系统中使用来自 @openzeppelin/contracts-upgradeable 的 Initializable 合约来防止智能合约多次执行初始化程序:
重要的:
我没有通过可靠的 import 语句导入 Initializable 合约。
相反,我手动复制了源代码并将编译器设置为 0.6.12,因为 @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol 在 0.8.x 上运行
最后,我更新了我的合约以实现 Initializable 和新的 VRFConsumerBaseUpgradable 合约:
我测试了初始迁移以及通过松露进行的升级,它都有效,所以我认为这很好,我将把它留给未来的研究人员..
你怎么看?我应该为 VRFConsumerBaseUpgradable 创建一个合并请求吗?
chainlink - 无法启动节点
我正在尝试在rinkeby 上运行chainlink 节点。日志未指示错误,但容器退出代码 137。我尝试了 0.10.7 和 0.10.6 版本。我的数据库是 postgres:13.1。
对我所缺少的有什么想法吗?(SO要求我提供更多细节,但我觉得我已经提供了相关细节?)
/etc/default/chainlink
码头工人
卷内容
日志
solidity - 单个 Chainlink HTTP GET 可以从同一个 API 返回 2 个值吗?
我目前正在使用 Chainlink 的示例 HTTP GET 代码两次从 CoinGecko API 提取 Uniswap 价格和 Uniswap 供应(见下文)。我想在相同的“请求”和“履行”函数中从 API 中提取价格和供应,以便我可以在“履行”函数中计算市值(market_cap = 供应 * 价格)。(我意识到我可以从 API 中提取市值,但出于开发原因,我想计算它。)
有没有办法改变下面的代码来做到这一点?Chainlink 允许这样做吗?