无法将智能合约部署到 Polygon,Gas 估计错误,内部 JSON-RPC 错误

Unable to deploy smart contract to Polygon, Gas estimation error, Internal JSON-RPC error

下午好,

我是 Polygon 的新手(但有一些以太坊经验),我正在尝试在 Polygon MUMBAI 测试网上部署来自 chainlink 文档 https://docs.chain.link/docs/fulfilling-requests/ 的智能合约,在浏览器中使用 remix IDE.

我最初尝试启动文档中发布的原始合约。我收到此错误消息:

"Gas 估算错误,出现以下消息(见下文)。交易执行可能会失败。是否要强制发送? 内部 JSON-RPC 错误。 { “代码”:-32000,“消息”:“执行已恢复”}“

当失败时,我将其缩减为更小、更简单的合约(以防 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 资助。我能够将 oracle 合约部署到孟买测试网(并且可以在多边形扫描 https://mumbai.polygonscan.com/address/0x078cF10C20f7A8aac7b49F078B38007A49334b96 上看到它),所以看起来它的所有设置都是正确的,只是由于某种原因这个合约出错了。

我还增加了我愿意支付的最大 gas,我试图推动交易通过(它开采但生成的合约没有任何数据 https://mumbai.polygonscan.com/address/0xb9bc5681a15353c9b1b19d3db097323b92137ddd)。

我还能够将一个不使用 Oracles 的合约部署到孟买(在 Rinkeby 上),进一步表明它特定于这个合约,或者一般来说是 Polygon 上的 Chainlink 基础设施。

旁注,我正在尝试 运行 并在 Polygon 上使用我自己的 Chainlink 节点,但这应该不会影响这个问题,因为在这个演示合约中,您将节点信息和作业 ID 发送为调用此函数时的参数,它不在智能合约本身中。

我考虑的是错误的: -合约规模太大(即使我把它缩减了??) -MATIC 不是多边形上唯一的 gas 货币吗? -Chinlink文档中存在未知错误 - 多边形的独特之处在于抛出错误

谢谢!

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