web3.js 执行交易

准备好了账号,就可以执行转账交易了。

交易可分为3个步骤:

  • 构建交易对象
  • 签署交易
  • 广播交易

构建交易对象

const txObject = {
    nonce:    web3.utils.toHex(txCount),
    to:       account2,
    value:    web3.utils.toHex(web3.utils.toWei('0.1', 'ether')),
    gasLimit: web3.utils.toHex(21000),
    gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei'))
  }

参数解释:

  • nonce – 这是账号的前一个交易计数。这个值必须是十六进制,可以使用Web3.js的web3.utils.toHex()转换。
  • to – 目标账户。
  • value – 要发送的以太币金额。这个值必须以十六进制表示,单位必须是wei。我们可以使用Web3.js工具web3.utils.toWei()转换单位。
  • gasLimit – 交易能消耗Gas的上限。像这样的基本交易总是要花费21000单位的Gas。
  • gasPrice – Gas价格,这里是 10 Gwei。

注意,这个交易对象中没有from字段。当使用account1的私钥签署这个交易时,它将被推算出来。

现在为nonce变量赋值,可以使用web3.eth.getTransactionCount()函数获取交易nonce。将构建交易对象的代码封装在一个回调函数中,如下所示:

web3.eth.getTransactionCount(account1, (err, txCount) => {
  const txObject = {
    nonce:    web3.utils.toHex(txCount),
    to:       account2,
    value:    web3.utils.toHex(web3.utils.toWei('0.1', 'ether')),
    gasLimit: web3.utils.toHex(21000),
    gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei'))
  }
})

签署交易

接下来,需要签署交易:

const tx = new Tx(txObject)
tx.sign(privateKey1)

const serializedTx = tx.serialize()
const raw = '0x' + serializedTx.toString('hex')

这里使用etheremjs-tx库来创建一个新的Tx对象,然后使用这个库与privateKey1签署交易。接着,序列化交易并转换为十六进制字符串,以便将其传递给Web3。

广播交易

最后广播交易,可以使用web3.eth.sendSignedTransaction()函数将这个已签名的序列化交易发送到测试网络,如下所示:

web3.eth.sendSignedTransaction(raw, (err, txHash) => {
  console.log('txHash:', txHash)
})

至此,我们完成了交易的执行。

app.js的完整内容,如下所示:var Tx = require('ethereumjs-tx').Transactionconst Web3 = require('web3')const web3 = ne ...