Web3js

如何使用 INFURA 和 NodeJS web3js 進行智能合約呼叫

  • March 23, 2019

我不明白如何準備要簽署的交易。因為 INFURA 不支持eth_sendTransaction但僅支持eth_sendRawTransactionINFURA 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。

為此,您必須:

  1. 準備交易
  2. 簽字
  3. 發送(使用 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)
 })

})

引用自:https://ethereum.stackexchange.com/questions/67132