无法将智能合约部署到 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);这已经解决了我的问题。
下午好,
我是 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);这已经解决了我的问题。