Web3js
如何使用 INFURA 和 NodeJS web3js 進行智能合約呼叫
我不明白如何準備要簽署的交易。因為 INFURA 不支持
eth_sendTransaction
但僅支持eth_sendRawTransaction
(INFURA API然後要求您準備簽署的交易)我不知道我該怎麼做。這是我用來嘗試發送事務的程式碼,但它失敗了:
PrintProofOfWork.methods.printRequested(web3.utils.keccak256(gcodeHash)).send('0x' + serializedTransaction.toString('hex')) .then((result) => { log(`result of the invokation: ${result})`.red); }).catch((err) => { log(`error occurred: ${err})`.red); });
我得到的錯誤是:
發生錯誤:錯誤:節點錯誤:{“code”:-32601,“message”:“方法 eth_sendTransaction 不存在/不可用”})
誰能告訴我如何準備一個使用參數呼叫智能合約方法的交易,對其進行簽名,然後使用 INFURA 發送它?
首先,INFURA 不允許發送未簽名的交易,因此您必須先對其進行簽名,然後再將它們傳遞給 INFURA。
為此,您必須:
- 準備交易
- 簽字
- 發送(使用 INFURA)
請查看INFURA 文件。
下面有一個例子:
const Web3 = require('web3') const Tx = require('ethereumjs-tx') // connect to Infura node const web3 = new Web3(new Web3.providers.HttpProvider('https://mainnet.infura.io/INFURA_KEY')) // the address that will send the test transaction const addressFrom = '0x1889EF49cDBaad420EB4D6f04066CA4093088Bbd' const privKey = 'PRIVATE_KEY' // the destination address const addressTo = '0x1463500476a3ADDa33ef1dF530063fE126203186' // Signs the given transaction data and sends it. Abstracts some of the details // of buffering and serializing the transaction for web3. function sendSigned(txData, cb) { const privateKey = new Buffer(config.privKey, 'hex') const transaction = new Tx(txData) transaction.sign(privateKey) const serializedTx = transaction.serialize().toString('hex') web3.eth.sendSignedTransaction('0x' + serializedTx, cb) } // get the number of transactions sent so far so we can create a fresh nonce web3.eth.getTransactionCount(addressFrom).then(txCount => { // construct the transaction data const txData = { nonce: web3.utils.toHex(txCount), gasLimit: web3.utils.toHex(25000), gasPrice: web3.utils.toHex(10e9), // 10 Gwei to: addressTo, from: addressFrom, value: web3.utils.toHex(web3.utils.toWei(123, 'wei')) } // fire away! sendSigned(txData, function(err, result) { if (err) return console.log('error', err) console.log('sent', result) }) })