我們這次學習 nodejs 來轉賬 eth 交易。
安裝依賴#
最基本的 eth 轉賬,只需要
yarn add web3 ethereumjs-tx --dev
方便和大家同步,我這裡報一下版本號。
"devDependencies": {
"web3": "^1.6.0"
"ethereumjs-tx": "^2.1.2"
}
初始化 web3#
和之前一樣,申請 infura 的測試以太坊 url。和前面的頁面使用 web3 差不多,這裡不多說了,直接看代碼。
const Web3 = require('web3')
// const EthereumTx = require('ethereumjs-tx').Transaction
const rpcUrl = "https://goerli.infura.io/v3/你申請的infura地址"
const web3Provider = new Web3.providers.HttpProvider(rpcUrl)
const web3 = new Web3(web3Provider)
轉賬 ETH#
const EthereumTx = require('ethereumjs-tx').Transaction
let currentAddress = '0x3EcAa09DD6B8828607bba4B1d7055Ea1143f8B94' // 當前用的eth地址
const start = async () => {
// 可以試試查詢餘額
const balance = await web3.eth.getBalance(currentAddress)
console.log({balance})
const toAddress = '0xe208D2fB37df02061B78848B83F02b4AD33540e1'
const privateKey = Buffer.from('你的錢包私鑰', 'hex')
// 轉賬數量 單位 Wei,web3.utils.toWei 可將 1 個 Ether 轉換為 Wei
const amount = web3.utils.toHex(web3.utils.toWei('1', 'ether'))
const count = await web3.eth.getTransactionCount(currentAddress)
const txParams = {
from: currentAddress,
to: toAddress,
gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei')), // 10 Gwei
gasLimit: web3.utils.toHex(21000),
value: amount,
nonce: web3.utils.toHex(count)
}
const tx = new EthereumTx(txParams, {
chain: 'goerli' // ethereumjs-tx這版本的要寫好chain,不然會報 invalid sender 的錯誤
})
tx.sign(privateKey) // 簽名
// 對已簽名的進行交易
web3.eth.sendSignedTransaction('0x' + tx.serialize().toString('hex'))
.on('transactionHash', console.log)
.catch(err => console.log({err}))
}
start()
以上 ethereumjs-tx 的簽名方案,使用的是ethereumjs-common
,默認有:
mainnet
ropsten
rinkeby
kovan
goerli
(final configuration sincev1.1.0
)
這些鏈的話可以直接簽。其他鏈的話需要自己 requireethereumjs-common
。
const Common = require('ethereumjs-common').default
const blockchain = Common.forCustomChain(
'mainnet', {
name: 'Fantom Opera',
networkId: 250,
chainId: 250
},
'petersburg'
)
const tx = new EthereumTx(txParams, {
common: blockchain
})
tx.sign(privateKey)
執行完,如果成功的話的,監聽事件transactionHash
會返回一段 hash。去鏈上查這段交易是否成功。