当前位置:   article > 正文

使用web3js实现evm链签名转账_evm-chains js

evm-chains js

使用web3js实现evm链签名转账

cover
原文链接:https://blog.wangtz.cn/blog/ROqX0tmSmtHb3v

原文章发布在王天柱的博客,原始内容已同步记录到fantom主链

eth发送交易过程

本文主要是通过web3js来实现区块链转账功能,web3js是以太坊基金会开发和维护的,所以相对来说比较权威,支持和维护的开发者也比较多

  1. 构建交易对象

  2. 用from钱包的私钥给交易对象进行签名

  3. 将签名后的交易数据广播到全网,让节点确认

构建交易对象:

    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())
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. 这里nonce是当前的地址发送交易的次数,当前地址进行一次交易nonce就会 +1,这个值会被记录到链上,可以通过web3.eth.getTransactionCount(accountFrom, callback) 这个api来查询

  2. to就是我们转账的目标地址

  3. value是我们要转出的数量,这个数量的单位是最小单位wei,可以使用web3.utils.toWei这个api来实现转换

  4. gasLimit是这次交易批准使用的gas的数量的最大值,总的交易gasFee = gasLimit * gasPrice,这里就是将交易手续费量化了,每一份的手续费为gasPrice,由于网络情况和交易金额的不同,总的gasFee是gasPrice的整数倍额就是gasLimit,gasLimit只是交易允许扣除的手续费的最大值,具体消耗要看交易实际消耗来定。21000 是一个比较标准的gasLimit值,在发交易的时候可以适当增加这个值来让矿工优先确认交易。

  5. 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
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  1. 对交易进行签名就是用私钥将交易数据对象加密成字符串,这里进行签名用到了一个第三方库 ethereumjs-tx ,将ethereumjs-tx库引入后需要通过这个库暴露出来的Transaction构造函数来构造交易对象(这里我用的是eth的测试网,goerli,所以在构建tx的时候额外传入了{ chain: ‘goerli’ },否则会报错)。

  2. 交易对象构造好以后需要先将from地址的私钥转成hex格式(这里需要注意从钱包导出的私钥格式是‘0x’开头的,在转成hex的时候需要将0x去掉才能成功)

  3. 调用交易对象tx的sign方法并传入已经转成hex格式的私钥。

  4. 之后调用tx对象的serialize方法将签名好的数据序列化并导出。

  5. 构建签名原始字符串,以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)
            });
        })
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  1. 这里就直接调用 web3.eth.sendSignedTransaction 这个方法,这个api接收两个参数,第一个raw是我们之前签名得到的字符串,第二个参数是回调方法,这笔签名交易成功广播到全网后会返回一个交易hash,通过这个hash值可以到对应链的区块链浏览器上查询交易的进度

以上就是evm链签名交易的流程,这只是核心的过程代码比较简单,这篇文章作为我个人学习区块链的一个记录,文章里可能有描述不准确的地方还望大家批评指正

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/445154
推荐阅读
相关标签
  

闽ICP备14008679号