[英]Unhandled rejection Error: Invalid JSON RPC response: “”
I am trying to call a method on my ERC20 token contract. 我正在尝试在我的ERC20代币合约上调用一种方法。 I am connecting to ' https://rinkeby.infura.io/ ' httpProvider.
我正在连接到' https://rinkeby.infura.io/'httpProvider 。 I can call() constant methods but when i want to change the state of the contract by calling send() function i get this mentioned error.
我可以调用()常量方法,但是当我想通过调用send()函数更改合同的状态时,出现此错误。 If you think posting the ABI JSON or the Solidity contract helps, i can provide it as well.
如果您认为发布ABI JSON或Solidity合同有所帮助,我也可以提供。 I thought my issue is purely web3 related.
我以为我的问题完全与web3有关。 I think i need to sign transactions (logically) but the web3 documentation doesn't mention anything.
我认为我需要(逻辑上)签署交易,但web3文档未提及任何内容。 http://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#methods-mymethod-send
http://web3js.readthedocs.io/zh/1.0/web3-eth-contract.html#methods-mymethod-send
This is the error i've been getting: 这是我一直得到的错误:
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>
From calling this method: 通过调用此方法:
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);
}
Here is the ABI snippet for the method: 这是该方法的ABI代码段:
{
"constant":false,
"inputs":[
{
"name":"_to",
"type":"address"
},
{
"name":"_value",
"type":"uint256"
}
],
"name":"transfer",
"outputs":[
{
"name":"success",
"type":"bool"
}
],
"payable":true,
"stateMutability":"payable",
"type":"function"
},
@sam k, here's a better more comprehensive solution to what you're probably looking for. @sam k,这是您可能正在寻找的更好,更全面的解决方案。 There's one important thing I've noticed in your given code-snippet, you have not included an
httpProvider
line in your code and that might be the reason (there may be other reasons as well). 我在给定的代码片段中注意到了一件重要的事情,您的代码中没有包含
httpProvider
行,这可能就是原因(还有其他原因)。 So kindly add the line mentioned below. 因此,请添加下面提到的行。
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));
Now comes the part where you want to "SIGN" transactions that impose a "state" change to your contract. 现在是您要“签署”交易的部分,该交易对合同施加了“状态”更改。 So you can follow the following code structure in order to sign a transaction.
因此,您可以按照以下代码结构进行交易签名。
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);});
If your rest of the code is fine, this solution should work. 如果您其余的代码都没问题,则此解决方案应该可以使用。 In case it doesn't then I would suggest you comment the github link to your project's repo, so that I can review and provide a solution.
如果情况并非如此,我建议您在项目的存储库中评论github链接,以便我可以查看并提供解决方案。 Let me know if this helps.
让我知道是否有帮助。 You may refer to these official web3 links: signTransaction , sendSignedTransaction , getTransactionCount and estimateGas .
你可以参考这些官方WEB3链接: signTransaction , sendSignedTransaction , getTransactionCount和estimateGas 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.