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安裝:
npm install web3
安裝指定的版本號:
npm install [email protected]^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