JWLAZY / block_chain_know

区块链相关笔记

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

web3.js 实现转账

JWLAZY opened this issue · comments

commented

交流地址: telegram

转账步骤

  1. 生成账单
  2. 对账单签名
  3. 发送签过名的账单

生成账单

账单可以了解为在银行办理转账业务是填的单子,账单最主要内容为转账人,接受者,还有转账金额.以下是一个基本的账单

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,"私钥")

备份文件 + 密码 恢复私钥代码
image

账单签名后的结果如下图:
image
其中的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

微信群: