web3.js 实现转账
JWLAZY opened this issue · comments
交流地址: telegram
转账步骤
- 生成账单
- 对账单签名
- 发送签过名的账单
生成账单
账单可以了解为在银行办理转账业务是填的单子,账单最主要内容为转账人,接受者,还有转账金额.以下是一个基本的账单
let txParms = {
from:"0x23232",
to: "0xa23sa2",
data: "0x00", // 当使用代币转账或者合约调用时
value: 10000, // value 是转账金额
chainId: 15
}
而在上面的主要内容之外,账单中还需要提供gas,gasprice,nonce等信息.
txParms.gas = await web3.eth.estimateGas(txParms);
txParms.gasPrice = await web3.eth.getGasPrice();
txParms.nonce = await web3.eth.getTransactionCount(form);
可以通过web3通过的eth.estimateGas方法来预估一些交易要使用多少的gas.
通过使用eth.getTransactionCount方法来获取转账地址的总交易数,这样用这个交易数来做这次转账的交易订单号,每个人的所有账单的nonce都是唯一的.
对账单进行签名
对账单签名是最重要的一步,签名时唯一一步事关权限的步骤,在以太坊的设计中只有在签名正确的交易账单才能交易成功,而签名就是使用转账方私钥才能成功,在这儿只能使用私钥,之前的密码和备份文件在这儿都不好使,但是如果没有私钥的话,可以使用备份文件和对应的密码来反向恢复出私钥.
签名代码
let signTx = await web3.eth.accounts.signTransaction(txParms,"私钥")
账单签名后的结果如下图:
其中的rawTransaction是最终要发送的账单签名结果.
发送签过名的账单
发送账单比较简单,只需要把上面签名结果的rawTransaction发送出去就可以了.代码见下面
web3.eth.sendSignedTransaction(signTx.rawTransaction)
.on('transactionHash', function(hash){
console.log("hash success:" + hash);
})
.on('receipt', function(receipt){
// console.log("")
})
.on('confirmation', function(confirmationNumber, receipt){
console.log("收到第" + confirmationNumber +"次确认");
})
.on('error', function(error){
callback(error);
});
而发送签过名的交易时是通过事件机制来回调的.confirmation这个事件会在被其他节点确认时调用一次,
在本人的私链上这个确认事件被回调了24次,也就是被确认了24次.
到这儿,一次转账就成功了,可以去钱包看一下对应地址的余额是不是发生了改变.
交流地址: telegram