web3.js签名广播交易到以太坊网络以及web3版本1.0和0.20的区别

一、web3.js介绍

         web3.js是以太坊官方的Javascript API,可以帮助智能合约开发者使用HTTP或者IPC与本地的或者远程的以太坊节点交互。实际上就是web3.js是一个库集合,允许您使用HTTP或IPC连接与本地或远程以太它节点进行交互。为了让你的Ðapp运行上以太坊,一种选择是使用web3.js library提供的web3。对象。底层实现上,它通过RPC 调用与本地节点通信。web3.js可以与任何暴露了RPC接口的以太坊节点连接。web3官方地址: https://web3js.readthedocs.io/en/1.0/    web3 0.20版本地址:https://github.com/ethereum/wiki/wiki/JavaScript-API

二、web3如何签名广播交易到以太网络

注:1.0和0.20版本更多的是异步调用。这里重点讲下签名交易和广播交易以及2个版本的代币签名交易的不同

1、web3安装:

  • npm install web3
  • 安装指定的版本号:npm install web3@^0.20.0

2、web3链接网络

var web3 = new Web3(new Web3.providers.HttpProvider('以太坊网络或者私链地址'));

3、ETH签名交易(1.0和0.20版本一样)

      安装签名工具: npm install ethereumjs-tx

           var privateKey = "你的私钥" // 私钥签名不要加 0x

            //设置交易所手续费 这里计算了 主要是单位换算的问题
            var price = 2 * Math.pow(10,9);
            var limit = 10 * 10000;
            //转账金额
            var bavalue = 100 * Math.pow(10,18)
            //主要用地址先查询交易编号 nonce
            web3.eth.getTransactionCount("你的钱包地址", function (error, result) {
               //封装一个交易
                var rawTx = {
                    nonce: result,
                    gasPrice: web3.toHex(price),
                    gasLimit: web3.toHex(limit),
                    to: "接收者的地址",
                    value: web3.toHex(bavalue),
                    data: '',
                }
                //签名交易
                var pk = new Buffer(privateKey, 'hex')
                var tx = new Tx(rawTx);
                tx.sign(pk);
                //得到签名后的数据 拿去广播
                var serializedTx = tx.serialize().toString('hex');
            });

4、ETH代币签名交易(主要是实例化合约和获取data数据的不同)

4.1 web3  0.20版本代币签名交易:

            //后面会放一个标准通用的ERC20合约abi
            var MyAbiContract = web3.eth.contract("代币合约abi数据");
            var myContract = MyAbiContract.at("代币合约地址");
            //转账数量
            var balanvalue = 5 * Math.pow(10,18)
            //得到交易的data数据
            var data = myContract.transfer.getData("接收者地址",web3.toHex(balanvalue));
            //计算交易的旷工费
            var price = 2 * Math.pow(10,9);
            var limit = 10 * 10000;
            //查询交易编号nonce
            web3.eth.getTransactionCount("转出钱包地址", function (error, result) {
               
                var rawTx = {
                    nonce: result,
                    gasPrice: web3.toHex(price),
                    gasLimit: web3.toHex(limit),
                    to: "代币合约地址",
                    data: data,
                }
              
                //私钥前面不要加 0x
                var pk = new Buffer("转出钱包私钥", 'hex')
                var tx = new Tx(rawTx);
                console.log("rawTx",rawTx)
                tx.sign(pk);
                //签名后的数据
                var serializedTx = tx.serialize().toString('hex');
            
            });

4.2 web3  1.0版本代币签名交易:

            //实例化合约
            var contract = new web3.eth.Contract("合约的abi数据", "合约的地址");
            //得到交易的data
            var data = contract.methods.transfer("接收者地址",ethers.utils.parseEther("转账数量")).encodeABI();
            //计算交易矿工费
            var price = 2 * Math.pow(10,9);
            var limit = 10 * 10000;
            web3.eth.getTransactionCount("转出钱包地址", function (error, result) {
                var rawTx = {
                    nonce: result,
                    gasPrice: web3.utils.toHex(price),
                    gasLimit: web3.utils.toHex(limit),
                    to: "合约地址",
                    data: data,
                }
                //钱包地址私钥签名不加 0x
                var pk = new Buffer("转出钱包地址私钥", 'hex')
                var tx = new Tx(rawTx);
                tx.sign(pk);
                //签名后的数据
                var serializedTx = tx.serialize().toString('hex');
            });

5、web3广播签名后的交易(1.0版本和0.20版本调用的方法不同)

5.1 web3 1.0版本广播交易:

web3.eth.sendSignedTransaction('0x' + signedTransaction, function (err, hash) {
                if (!err) {
                  //广播成功 会返回hash值。拿到这个hash 去区块链浏览器查询交易
                }else{
                    
                }
            })

5.2 web3 0.20版本广播交易

 web3.eth.sendRawTransaction('0x' + signedTransaction, function (err, hash) {
                if (!err) {
                    ////广播成功 会返回hash值。拿到这个hash 去区块链浏览器查询交易
                }else{
                    
                }
            })

6、ERC20代币标准abi数据:

abi = [{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"initialSupply","type":"uint256"},{"name":"tokenName","type":"string"},{"name":"tokenSymbol","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"},{"name":"_extraData","type":"bytes"}],"name":"approveAndCall","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burn","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_value","type":"uint256"}],"name":"burnFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

学如逆水行舟,不进则退。心似平原跑马,易放难收。全栈工程师是指掌握多种技能,并能利用多种技能独立完成产品的人。 也叫全端工程师(同时具备前端和后台能力),英文Full Stack engineer。【人工智能】【区块链】【系统/网络/运维】【云计算/大数据】【数据库】【移动开发】【后端开发】【游戏开发】【UI设计】【微服务】【爬虫】【Java】【Go】【C++】【PHP】【Python】【Android/IOS】【HTML/CSS】【JavaScript】【Node】。。。

欢迎各位大神萌新一起专研分享各行各业技术!

IT全栈工程师技术交流群:593674370

猜你喜欢

转载自blog.csdn.net/qq_16137795/article/details/83475910