1. 程式人生 > >web3和以太坊及智慧合約互動,如何簽名廣播交易以及web3版本1.0和0.20的區別

web3和以太坊及智慧合約互動,如何簽名廣播交易以及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安裝:

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