一、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】。。。
欢迎各位大神萌新一起专研分享各行各业技术!
Chain区块链开发社区:593674370