未处理的拒绝错误:无效的 JSON RPC 响应:“”

Posted

技术标签:

【中文标题】未处理的拒绝错误:无效的 JSON RPC 响应:“”【英文标题】:Unhandled rejection Error: Invalid JSON RPC response: "" 【发布时间】:2018-06-21 09:59:22 【问题描述】:

我正在尝试在我的 ERC20 代币合约上调用一个方法。我正在连接到“https://rinkeby.infura.io/”httpProvider。我可以 call() 常量方法,但是当我想通过调用 send() 函数来更改合约的状态时,我得到了这个提到的错误。如果您认为发布 ABI JSON 或 Solidity 合同有帮助,我也可以提供。我认为我的问题纯粹是 web3 相关的。我认为我需要(逻辑上)签署交易,但 web3 文档没有提及任何内容。 http://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#methods-mymethod-send

这是我遇到的错误:

Unhandled rejection Error: Invalid JSON RPC response: ""
at Object.InvalidResponse (/opt/backend/node_modules/web3-core-helpers/src/errors.js:42:16)
at XMLHttpRequest.request.onreadystatechange (/opt/backend/node_modules/web3-providers-http/src/index.js:60:32)
at XMLHttpRequestEventTarget.dispatchEvent (/opt/backend/node_modules/xhr2/lib/xhr2.js:64:18)
at XMLHttpRequest._setReadyState (/opt/backend/node_modules/xhr2/lib/xhr2.js:354:12)
at XMLHttpRequest._onHttpResponseEnd (/opt/backend/node_modules/xhr2/lib/xhr2.js:509:12)
at IncomingMessage.<anonymous> (/opt/backend/node_modules/xhr2/lib/xhr2.js:469:24)
at emitNone (events.js:111:20)
at IncomingMessage.emit (events.js:208:7)
at endReadableNT (_stream_readable.js:1055:12)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickCallback (internal/process/next_tick.js:180:9)
From previous event:
at PromiEvent (/opt/backend/node_modules/web3-core-promievent/src/index.js:35:24)
at send (/opt/backend/node_modules/web3-core-method/src/index.js:446:21)
at Object._executeMethod (/opt/backend/node_modules/web3-eth-contract/src/index.js:890:24)
at Object.currencyToken.sendSignUpBonousTokens (/opt/backend/server/common/token/currency-token.js:86:56)
at <anonymous>

从调用这个方法:

const Web3 = require('web3');
const Tx = require('ethereumjs-tx');
const ABIjson = require('./ABI.json');

const web3 = new Web3(new Web3.providers.HttpProvider('https://rinkeby.infura.io/my_access_token_here'));
const contractAddress = '0x31cF32fa91286168B1A896Db4F99d106246932Bc';
const ownerAddress = '0x44Ba8c5a905D634c485dE6f8fD43df9682AfD342';

const token = new web3.eth.Contract(ABIjson, contractAddress);
try

    const gasAmount = await token.methods.transfer(company.walletAddress, 10000).estimateGas(from: ownerAddress);

    token.methods.transfer(company.walletAddress, 550).send(
      
        from: ownerAddress,
        gasPrice: '20000000000',
        gas: gasAmount
      )
      .then(function(receipt)
      
        console.log(receipt);
      );

catch (error)

    console.error(error);

这是该方法的 ABI sn-p:

  
"constant":false,
"inputs":[  
    
    "name":"_to",
    "type":"address"
  ,
    
    "name":"_value",
    "type":"uint256"
  
],
"name":"transfer",
"outputs":[  
    
    "name":"success",
    "type":"bool"
  
],
"payable":true,
"stateMutability":"payable",
"type":"function"
,

【问题讨论】:

是的,您需要签署交易。见ethereum.stackexchange.com/questions/26999/… 【参考方案1】:

@sam k,这是您可能正在寻找的更好更全面的解决方案。 我在您给定的 code-sn-p 中注意到一件重要的事情,您的代码中没有包含 httpProvider 行,可能是原因(也可能有其他原因)。所以请添加下面提到的行。

let contractABI = <your contract ABI>;
let contractInstance = new web3.eth.Contract(contractABI, 
contractAddress);
/**The line below needs to be added, specifying the http provider*/
contractInstance.setProvider(new Web3.providers.HttpProvider(URL));

现在是您要“签署”交易的部分,该交易对您的合同施加“状态”更改。因此,您可以按照以下代码结构来签署交易。

web3.eth.getTransactionCount(ownerAddress).then( (nonce) => 
    let encodedABI = 
contractInstance.methods.statechangingfunction(<arguments>).encodeABI();
/**Estimating the required gas automatically from the network itself*/
contractInstance.methods.statechangingfunction(<arguments>).estimateGas( from: ownerAddress , (error, gasEstimate) => 
      let tx = 
        to: contractAddress,
        gas: gasEstimate,
        data: encodedABI,
        nonce: nonce
      ;
      /** Signing the transaction with the "privateKey" of the owner*/
      web3.eth.accounts.signTransaction(tx, privateKey, (err, resp) => 
        if (resp == null) console.log("Error!");
         else 
          let tran = web3.eth.sendSignedTransaction(resp.rawTransaction);
          tran.on('transactionHash', (txhash) => console.log("Tx Hash: "+ txhash););

如果您的其余代码没问题,那么这个解决方案应该可以工作。如果没有,那么我建议您将 github 链接评论到您的项目的 repo,以便我可以查看并提供解决方案。让我知道这是否有帮助。 您可以参考这些官方web3链接:signTransaction、sendSignedTransaction、getTransactionCount和estimateGas。

【讨论】:

@AchalSingh 如果两个问题重复,请将问题标记为另一个问题的重复,而不是发布引用另一个问题答案的新答案。如果您不确定它是否重复,您可以随时将其链接到问题的 cmets 中。如果它有点相似,但不是完全重复,请使用您对此类问题的了解,针对该特定问题编写一个量身定制的答案。这个原样的答案不是很有用,因为它不包含帖子本身的任何内容来解决手头的问题。 Samurai8,注意。我将根据 sam 的要求编辑现有答案。请继续关注并保持反馈。 能否请大家具体说明为什么每个人都投票删除这篇文章以及为什么@sam k 没有回应提供的解决方案?如果你们中的任何人觉得解决方案有问题,请首先指出解决方案缺少什么,而不是简单地投票删除它,就解决方案而言,我已经提供了完整的解决方案来构建一个 'singed ' 交易。请先发表评论和讨论。

以上是关于未处理的拒绝错误:无效的 JSON RPC 响应:“”的主要内容,如果未能解决你的问题,请参考以下文章

Android Json RPC 到 pysjonrpc 抛出无效的 JSON 响应

错误:无效的 Json RPC 响应:“无法连接 127.0.0.1:7545”| Web3js |反应原生|移动的

未处理的拒绝:DiscordAPIError:尝试禁止命令时表单正文无效

我的应用程序运行良好,但现在显示错误 [未处理的承诺拒绝:TypeError:传播不可迭代实例的无效尝试

未处理的拒绝(错误):响应不成功:收到状态码 400 new ApolloError

阿波罗客户端- [未处理的承诺拒绝:错误:响应不成功:收到状态代码 400]