| 知乎專欄 | 多維度架構 | | | 微信號 netkiller-ebook | | | QQ群:128659835 請註明“讀者” |
var Web3 = require('web3');
var web3 = new Web3('http://localhost:8545');
web3.eth.getAccounts().then(console.log);
var Web3 = require('web3');
var web3 = new Web3('http://localhost:8545');
web3.eth.getCoinbase().then(console.log);
Callback 方式
web3.eth.getCoinbase(
function(error, result){
if (error) {
console.error(error);
} else {
console.log(result);
}
})
web3.eth.getBalance(req.query.address).then(function(balance){
res.json({"status": true, "code":0, "data":{"account":req.query.address, "balance": web3.utils.fromWei(balance)}});
});
Callback 方式
web3.eth.getBalance(req.query.address, function (error, wei) {
if (!error) {
var balance = web3.utils.fromWei(wei, 'ether');
res.json({"status": true, "code":0, "data":{"account":req.query.address, "balance": balance}});
}else{
console.log(error);
res.json({"status": false, "code":1, "data":{"error":error.message}});
}
});
捕捉錯誤
router.get('/balance.json', function(req, res) {
try {
web3.eth.getBalance(req.query.address, function (error, wei) {
if (!error) {
var balance = web3.utils.fromWei(wei, 'ether');
res.json({"status": true, "code":0, "data":{"account":req.query.address, "balance": balance}});
}else{
console.log(error);
res.json({"status": false, "code":1, "data":{"error":error.message}})
}
});
}
catch(error){
res.json({"status": false, "code":1, "data":{"error":error.message}});
};
});
web3.eth.sendTransaction({
from: coinbase,
to: '0x2C687bfF93677D69bd20808a36E4BC2999B4767C',
value: web3.utils.toWei('2','ether')
},
function(error, result){
if(!error) {
console.log("#" + result + "#")
} else {
console.error(error);
}
});
var code = "0x603d80600c6000396000f3007c01000000000000000000000000000000000000000000000000000000006000350463c6888fa18114602d57005b6007600435028060005260206000f3";
web3.eth.sendTransaction({from: coinbase, data: code}, function(err, transactionHash) {
if (!err)
console.log(transactionHash); // "0x7f9fade1c0d57a7af66ab4ead7c2eb7b11a91385"
});
web3.eth.sendTransaction({from: coinbase, data: code}).then(function(receipt){
console.log(receipt);
});
var account = web3.eth.accounts.privateKeyToAccount(privateKey);
web3.eth.accounts.signTransaction({
from: account.address,
to: "0x0013a861865d74b13ba94713d4e84d97c57e7081",
gas: "3000000",
value: '100000000000000000',
gasPrice: '0x09184e72a000',
data: "0x00"
}, account.privateKey)
.then(function(result) {
console.log("Results: ", result)
web3.eth.sendSignedTransaction(result.rawTransaction)
.on('receipt', console.log);
})
獲取 pending 狀態的區塊
[ethereum@netkiller web3.example]$ vim test.js [ethereum@netkiller web3.example]$ export PRIVATE_KEY=585a219fd6a5583b325e96770a88e69660f404efc06e56be71d82beedb7a989e [ethereum@netkiller web3.example]$ echo $PRIVATE_KEY 585a219fd6a5583b325e96770a88e69660f404efc06e56be71d82beedb7a989e [ethereum@netkiller web3.example]$ node > process.env["PRIVATE_KEY"] '585a219fd6a5583b325e96770a88e69660f404efc06e56be71d82beedb7a989e'
[ethereum@netkiller web3.example]$ cat transfer.js
fs = require('fs');
const Web3 = require('web3');
var Tx = require('ethereumjs-tx');
const web3 = new Web3('http://localhost:8545');
console.log(web3.version)
coinbase = "0xaa96686a050e4916afbe9f6d8c5107062fa646dd";
address = "0x372fda02e8a1eca513f2ee5901dc55b8b5dd7411"
contractAddress = "0x9ABcF16f6685fE1F79168534b1D30056c90B8A8A"
const main = async () => {
var balance = await web3.eth.getBalance(coinbase);
console.log(`Balance ETH: ${balance} \n`);
const abi = fs.readFileSync('output/NetkillerToken.abi', 'utf-8');
const contract = new web3.eth.Contract(JSON.parse(abi), contractAddress, { from: address});
var balance = await contract.methods.balanceOf(address).call();
console.log(`Balance before send: ${balance} \n`);
var count = await web3.eth.getTransactionCount(coinbase);
const gasPrice = await web3.eth.getGasPrice();
console.log(`gasPrice: ${gasPrice}\n`)
var gasLimit = 1000000;
var transferAmount = 1000;
// Chain ID of Ropsten Test Net is 3, replace it to 1 for Main Net
var chainId = 1;
var rawTransaction = {
"from": coinbase,
/* "nonce": "0x" + count.toString(16),*/
"nonce": web3.utils.toHex(count),
"gasPrice": web3.utils.toHex(gasPrice),
"gasLimit": web3.utils.toHex(gasLimit),
"to": contractAddress,
"value": "0x0",
"data": contract.methods.transfer(address, transferAmount).encodeABI(),
"chainId": web3.utils.toHex(chainId)
};
console.log(`Raw of Transaction: \n${JSON.stringify(rawTransaction, null, '\t')}\n`);
// The private key for myAddress in .env
var privateKey = new Buffer(process.env["PRIVATE_KEY"], 'hex');
var tx = new Tx(rawTransaction);
tx.sign(privateKey);
var serializedTx = tx.serialize();
// Comment out these four lines if you don't really want to send the TX right now
console.log(`Attempting to send signed tx: ${serializedTx.toString('hex')}\n`);
var receipt = await web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'));
// The receipt info of transaction, Uncomment for debug
console.log(`Receipt info: \n${JSON.stringify(receipt, null, '\t')}\n`);
// The balance may not be updated yet, but let's check
var balance = await contract.methods.balanceOf(address).call();
console.log(`Balance after send: ${balance}`);
}
main();
[ethereum@netkiller web3.example]$ node test.js
1.0.0-beta.34
Balance ETH: 8695480352861952
Balance before send: 100
gasPrice: 3000000000
Raw of Transaction:
{
"from": "0xaa96686a050e4916afbe9f6d8c5107062fa646dd",
"nonce": "0x20",
"gasPrice": "0xb2d05e00",
"gasLimit": "0xf4240",
"to": "0x9ABcF16f6685fE1F79168534b1D30056c90B8A8A",
"value": "0x0",
"data": "0xa9059cbb000000000000000000000000372fda02e8a1eca513f2ee5901dc55b8b5dd741100000000000000000000000000000000000000000000000000000000000003e8",
"chainId": "0x1"
}
Attempting to send signed tx: f8a92084b2d05e00830f4240949abcf16f6685fe1f79168534b1d30056c90b8a8a80b844a9059cbb000000000000000000000000372fda02e8a1eca513f2ee5901dc55b8b5dd741100000000000000000000000000000000000000000000000000000000000003e825a05017058348d8f751cc40e71c13a63b8d8e21683841bd002c9f6bf691d34b6a4ba07df3fa8792aa66cc272ff89373509f6335272a4298e98177536a79c8ab7c947c
Receipt info:
{
"blockHash": "0x32f45f27040b1df616ff4efd25557416793782541b995a6d4ecbd66f8441783f",
"blockNumber": 5518045,
"contractAddress": null,
"cumulativeGasUsed": 5054117,
"from": "0xaa96686a050e4916afbe9f6d8c5107062fa646dd",
"gasUsed": 36184,
"logs": [
{
"address": "0x9ABcF16f6685fE1F79168534b1D30056c90B8A8A",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x000000000000000000000000aa96686a050e4916afbe9f6d8c5107062fa646dd",
"0x000000000000000000000000372fda02e8a1eca513f2ee5901dc55b8b5dd7411"
],
"data": "0x00000000000000000000000000000000000000000000000000000000000003e8",
"blockNumber": 5518045,
"transactionHash": "0x203ebcbe1cc8340c4b5a13f4e6c36a4f63142754437e0f43b0ff5e5c0bf512cc",
"transactionIndex": 104,
"blockHash": "0x32f45f27040b1df616ff4efd25557416793782541b995a6d4ecbd66f8441783f",
"logIndex": 94,
"removed": false,
"id": "log_7ef3f104"
}
],
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000100000000040000000000000000000000000000000008000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000002000000000000000000000000000000001200000000000000000000200000000000000000000000000000100000000000000000000000000000000000",
"status": true,
"to": "0x9abcf16f6685fe1f79168534b1d30056c90b8a8a",
"transactionHash": "0x203ebcbe1cc8340c4b5a13f4e6c36a4f63142754437e0f43b0ff5e5c0bf512cc",
"transactionIndex": 104
}
Balance after send: 1100