0

下午好,

我是 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 的独特之处在于抛出错误

谢谢!

4

1 回答 1

0

在逐行浏览和评论之后,我能够追踪到有问题的代码。我进去把ChainlinkClient.sol中的LINK地址改成了孟买的LINK地址。如所写,演示代码调用 setPublicChainlinkToken(); 然后将存储的值分配为链接令牌地址。将该值更改为正确的地址并没有解决我的问题。相反,我使用了 setChainlinkToken(0x326C977E6efc84E512bB9C30f76E30c160eD06FB); 这已经解决了我的问题。

于 2022-02-27T22:46:31.950 回答