赞
踩
原文链接:https://blog.wangtz.cn/blog/ROqX0tmSmtHb3v
原文章发布在王天柱的博客,原始内容已同步记录到fantom主链
本文主要是通过web3js来实现区块链转账功能,web3js是以太坊基金会开发和维护的,所以相对来说比较权威,支持和维护的开发者也比较多
构建交易对象
用from钱包的私钥给交易对象进行签名
将签名后的交易数据广播到全网,让节点确认
const txObject = {
nonce: web3.utils.toHex(txCount),
to: accout,
value: web3.utils.toHex(web3.utils.toWei(amount.toString(), 'ether')),
gasLimit: web3.utils.toHex(21000),
gasPrice: web3.utils.toHex(gasPrice.toString())
}
这里nonce是当前的地址发送交易的次数,当前地址进行一次交易nonce就会 +1,这个值会被记录到链上,可以通过web3.eth.getTransactionCount(accountFrom, callback) 这个api来查询
to就是我们转账的目标地址
value是我们要转出的数量,这个数量的单位是最小单位wei,可以使用web3.utils.toWei这个api来实现转换
gasLimit是这次交易批准使用的gas的数量的最大值,总的交易gasFee = gasLimit * gasPrice,这里就是将交易手续费量化了,每一份的手续费为gasPrice,由于网络情况和交易金额的不同,总的gasFee是gasPrice的整数倍额就是gasLimit,gasLimit只是交易允许扣除的手续费的最大值,具体消耗要看交易实际消耗来定。21000 是一个比较标准的gasLimit值,在发交易的时候可以适当增加这个值来让矿工优先确认交易。
gasPrice是当前全网的平均手续费最小单位,这个需要实时的获取,可以通过 web3.eth.getGasPrice 这个api来获取当前的gasPrice
const Tx = require('ethereumjs-tx').Transaction
async function signTX (data) {
const tx = new Tx(data, { chain: 'goerli' })
let privateKey = Buffer.from(PKFrom,'hex')
tx.sign(privateKey)
const serializedTx = tx.serialize()
const raw = '0x' + serializedTx.toString('hex')
return raw
}
对交易进行签名就是用私钥将交易数据对象加密成字符串,这里进行签名用到了一个第三方库 ethereumjs-tx ,将ethereumjs-tx库引入后需要通过这个库暴露出来的Transaction构造函数来构造交易对象(这里我用的是eth的测试网,goerli,所以在构建tx的时候额外传入了{ chain: ‘goerli’ },否则会报错)。
交易对象构造好以后需要先将from地址的私钥转成hex格式(这里需要注意从钱包导出的私钥格式是‘0x’开头的,在转成hex的时候需要将0x去掉才能成功)
调用交易对象tx的sign方法并传入已经转成hex格式的私钥。
之后调用tx对象的serialize方法将签名好的数据序列化并导出。
构建签名原始字符串,以0x开头的hex格式字符串
async function sendSignedTransaction (raw) {
return new Promise((res, rej) => {
web3.eth.sendSignedTransaction(raw, (err, txHash) => {
if (err) {
console.log('sendSignedTransaction error:', err)
}
res(txHash)
});
})
}
以上就是evm链签名交易的流程,这只是核心的过程代码比较简单,这篇文章作为我个人学习区块链的一个记录,文章里可能有描述不准确的地方还望大家批评指正
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。