Infura + Ropsten 節點 + Truffle 控制台上 sendTransaction 的 JSON RPC 響應錯誤
呼叫工作,但事務拋出錯誤-
錯誤:無效的 JSON RPC 響應:“”
我正在使用 web3 v0.19.0 和松露 v3.4.9。使用 truffle 部署合約,
truffle migrate --network ropsten
成功提供了 api 和合約地址。
我的 web3 提供者和 ropsten 網路(infura 節點)是在react-auth-box項目 之上的 truffle.js 中定義的。
我打開
truffle console --network ropsten
並定義 web3 -var Web3 = require('web3') let web3 = new Web3() web3.setProvider(new web3.providers.HttpProvider('https://ropsten.infura.io/my_access_token_here'))
沒有預設賬戶
web3.eth.defaultAccount
(返回 null)
web3.eth.accounts
(返回$$ $$) 設置預設賬戶,
web3.eth.defaultAccount = '0xpersonalaccount'
定義合約實例,
let contract = web3.eth.contract(abi).at(address)
到目前為止一切順利,通話工作-
contract.checkIdExists.call(1, {'from': account, 'to': address})
(返回 ‘0x0000000000’)
contract.fetchDataById.call(1, {'from': account, 'to': address})
(返回“0x”)
1. 交易失敗 -
contract.addRecord.sendTransaction(1, 'fjdnjsnkjnsd', '03:00:21 12-12-12', 'true', '', {'from': account, 'to': address})
錯誤:無效的 JSON RPC 響應:“”在 Object.InvalidResponse (/var/www/html/react-auth-box/node_modules/web3/lib/web3/errors.js:38:16) 在 HttpProvider.send (/var /www/html/react-auth-box/node_modules/web3/lib/web3/httpprovider.js:91:22) 在 RequestManager.send (/var/www/html/react-auth-box/node_modules/web3/lib /web3/requestmanager.js:58:32) 在 Eth.send
$$ as sendTransaction $$(/var/www/html/react-auth-box/node_modules/web3/lib/web3/method.js:145:58) 在 SolidityFunction.sendTransaction (/var/www/html/react-auth-box/node_modules/ web3/lib/web3/function.js:167:26) 在 evalmachine.:1:20 在 ContextifyScript.Script.runInContext (vm.js:53:29) 在 Object.runInContext (vm.js:108:6) 在TruffleInterpreter.interpret (/home/shivam/.npm-global/lib/node_modules/truffle/build/cli.bundled.js:213786:17) 在綁定 (domain.js:301:14)
2.讓我覺得我可能必須先解鎖帳戶(是嗎?)
web3.personal.unlockAccount(account, password)
錯誤:無效的 JSON RPC 響應:“”在 Object.InvalidResponse (/var/www/html/react-auth-box/node_modules/web3/lib/web3/errors.js:38:16) 在 HttpProvider.send (/var /www/html/react-auth-box/node_modules/web3/lib/web3/httpprovider.js:91:22) 在 RequestManager.send (/var/www/html/react-auth-box/node_modules/web3/lib /web3/requestmanager.js:58:32) 在 Personal.send
$$ as unlockAccount $$(/var/www/html/react-auth-box/node_modules/web3/lib/web3/method.js:145:58) 在 evalmachine.:1:15 在 ContextifyScript.Script.runInContext (vm.js:53: 29) 在 Object.runInContext (vm.js:108:6) 在 TruffleInterpreter.interpret (/home/shivam/.npm-global/lib/node_modules/truffle/build/cli.bundled.js:213786:17) 處(domain.js:301:14) 在 REPLServer.runBound$$ as eval $$(domain.js:314:12)
跑到現在很無知。任何支持將不勝感激。謝謝!
讓我在這裡發布完整的答案(感謝@Ismael)。
相關包 -
crypto-js
const Web3 = require('web3') let web3 = new Web3() web3.providers.HttpProvider('https://ropsten.infura.io/my_access_token_here')) let contract = web3.eth.contract(abi).at(address) var coder = require('web3/lib/solidity/coder') var CryptoJS = require('crypto-js') var privateKey = new Buffer(myPrivateKey, 'hex') var functionName = 'addRecord' var types = ['uint','bytes32','bytes20','bytes5','bytes'] var args = [1, 'fjdnjsnkjnsd', '03:00:21 12-12-12', 'true', ''] var fullName = functionName + '(' + types.join() + ')' var signature = CryptoJS.SHA3(fullName,{outputLength:256}).toString(CryptoJS.enc.Hex).slice(0, 8) var dataHex = signature + coder.encodeParams(types, args) var data = '0x'+dataHex var nonce = web3.toHex(web3.eth.getTransactionCount(account)) var gasPrice = web3.toHex(web3.eth.gasPrice) var gasLimitHex = web3.toHex(300000) (user defined) var rawTx = { 'nonce': nonce, 'gasPrice': gasPrice, 'gasLimit': gasLimitHex, 'from': account, 'to': address, 'data': data} var tx = new Tx(rawTx) tx.sign(privateKey) var serializedTx = '0x'+tx.serialize().toString('hex') web3.eth.sendRawTransaction(serializedTx, function(err, txHash){ console.log(err, txHash) })
(返回'0xf802614fd6a53cb372752634630265063d0b48fec12ea8f5ed363de1d4bd372d’)
web3.eth.getTransaction('0xf802614fd6a53cb372752634630265063d0b48fec12ea8f5ed363de1d4bd372d', console.log)
(列印交易數據)
(參考這裡)