下午好,
我是 Polygon 的新手(但有一些以太坊经验),我正在尝试从Polygon MUMBAI 测试网上的链链接文档https://docs.chain.link/docs/fulfilling-requests/部署智能合约,使用 remix 作为我在浏览器 IDE 中。
我最初尝试启动文档中发布的原始合同。我收到此错误消息:
“气体估算错误并显示以下消息(见下文)。交易执行可能会失败。您要强制发送吗?内部 JSON-RPC 错误。{“code”:-32000,“message”:“execution reverted”} "
当失败时,我将其缩减为更小、更简单的合约(以防 Polygon 存在智能合约大小限制)。这是精简后的代码:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "@chainlink/contracts/src/v0.8/ChainlinkClient.sol";
import "@chainlink/contracts/src/v0.8/ConfirmedOwner.sol";
contract ATestnetConsumer is ChainlinkClient, ConfirmedOwner {
using Chainlink for Chainlink.Request;
uint256 constant private ORACLE_PAYMENT = 1 * LINK_DIVISIBILITY/10;
uint256 public currentPrice;
int256 public changeDay;
bytes32 public lastMarket;
event RequestEthereumPriceFulfilled(
bytes32 indexed requestId,
uint256 indexed price
);
constructor() ConfirmedOwner(msg.sender){
setPublicChainlinkToken();
}
function requestEthereumPrice(address _oracle, string memory _jobId)
public
onlyOwner
{
Chainlink.Request memory req = buildChainlinkRequest(stringToBytes32(_jobId), address(this), this.fulfillEthereumPrice.selector);
req.add("get", "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD");
req.add("path", "USD");
req.addInt("times", 100);
sendChainlinkRequestTo(_oracle, req, ORACLE_PAYMENT);
}
function fulfillEthereumPrice(bytes32 _requestId, uint256 _price)
public
recordChainlinkFulfillment(_requestId)
{
emit RequestEthereumPriceFulfilled(_requestId, _price);
currentPrice = _price;
}
function getChainlinkToken() public view returns (address) {
return chainlinkTokenAddress();
}
function withdrawLink() public onlyOwner {
LinkTokenInterface link = LinkTokenInterface(chainlinkTokenAddress());
require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer");
}
function cancelRequest(
bytes32 _requestId,
uint256 _payment,
bytes4 _callbackFunctionId,
uint256 _expiration
)
public
onlyOwner
{
cancelChainlinkRequest(_requestId, _payment, _callbackFunctionId, _expiration);
}
function stringToBytes32(string memory source) private pure returns (bytes32 result) {
bytes memory tempEmptyStringTest = bytes(source);
if (tempEmptyStringTest.length == 0) {
return 0x0;
}
assembly { // solhint-disable-line no-inline-assembly
result := mload(add(source, 32))
}
}
}
但我得到同样的错误。我的钱包由 MATIC 和 LINK on polygon(孟买)提供资金。我能够将预言机合约部署到孟买测试网(并且可以在多边形扫描https://mumbai.polygonscan.com/address/0x078cF10C20f7A8aac7b49F078B38007A49334b96上看到它),所以它似乎全部设置正确,只是出于某种原因这个合约错误出来。
我还增加了我愿意支付的最大 gas,我试图推动交易通过(它挖掘但生成的合约没有任何数据https://mumbai.polygonscan.com/address/0xb9bc5681a15353c9b1b19d3db097323b92137ddd)。
我还能够向孟买部署一个不使用 Oracles 但作为工作合同(在 Rinkeby 上)的合同,进一步表明它特定于该合同,或者一般来说是 Polygon 上的 Chainlink 基础设施。
旁注,我正在尝试在 Polygon 上运行和使用我自己的 Chainlink 节点,但这不应该影响这个问题,因为在这个演示合同中,当你调用这个函数时,你会发送节点信息和作业 ID 作为参数,它不在智能合约本身中。
我认为是错误的:-合同尺寸太大(即使在我将其修剪后??) -MATIC 不是多边形上唯一的气体货币?-Chinlink 文档中有一个未知错误 -Polygon 的独特之处在于抛出错误
谢谢!