| 知乎專欄 | 多維度架構 | | | 微信號 netkiller-ebook | | | QQ群:128659835 請註明“讀者” |
下面的例子,實現查詢餘額,創建賬號,ETH轉賬,代幣轉賬。
安裝以太坊環境
curl -s https://raw.githubusercontent.com/oscm/shell/master/lang/gcc/gcc.sh | bash curl -s https://raw.githubusercontent.com/oscm/shell/master/lang/golang/golang-1.10.2.sh | bash curl -s https://raw.githubusercontent.com/oscm/shell/master/blockchain/ethereum/centos/go-ethereum-1.8.8.sh | bash curl -s https://raw.githubusercontent.com/oscm/shell/master/blockchain/ethereum/systemd/private.sh | bash curl -s https://raw.githubusercontent.com/oscm/shell/master/lang/node.js/binrary/node-v10.1.0.sh | bash curl -s https://raw.githubusercontent.com/oscm/shell/master/lang/node.js/binrary/profile.d.sh | bash curl -s https://raw.githubusercontent.com/oscm/shell/master/blockchain/ethereum/truffle/truffle.sh | bash
安裝開發包
npm install express npm install web3 npm install ejs
var express = require('express');
var app = express();
app.use(express.static('public'));
app.set("view engine","ejs");
app.set('views', __dirname + '/views');
var async = require('async');
fs = require('fs');
var net = require('net');
var Web3 = require('web3');
var web3 = new Web3('/home/ethereum/.ethereum/geth.ipc', net);
const abi = fs.readFileSync( __dirname + '/abi/NKC.abi', 'utf-8');
const coinbase = "0xaa96686a050e4916afbe9f6d62fa646dd8c51070"
const contractAddress = "0x5F75DA091aBb25e055B91172C04371Ff4Dd563a0";
console.log(web3.version)
app.get('/', function (req, res) {
// res.send('Hello World');
res.render("index",{});
})
app.get('/account.html', function (req, res) {
var accounts;
web3.eth.getAccounts(function(err, acc) {
accounts = acc
res.render("account",{"accounts":accounts});
});
})
app.get('/new', function (req, res) {
web3.eth.personal.newAccount(req.query.password).then(function(){
res.redirect('/account.html');
});
})
app.get('/balance.html', function (req, res) {
web3.eth.getAccounts(function(err, accounts) {
res.render("balance",{"accounts":accounts});
});
})
app.post('/showbalance.html', function (req, res) {
// web3.eth.getBalance(req.query.account).then(function(balance){
// res.render("transfer",{"account":req.query.account, "balance": balance});
// });
res.render("showbalance",{"account": "sss", "balance": 1000});
})
app.get('/getbalance.html', function (req, res) {
var contract = new web3.eth.Contract(JSON.parse(abi), contractAddress, { from: coinbase , gas: 100000});
web3.eth.getBalance(req.query.account).then(function(balance){
contract.methods.balanceOf(req.query.account).call().then(function(token){
// console.log(contract.symbol.call());
// contract.methods.symbol().call().then(console.log);
contract.methods.symbol().call().then(function(name){
res.render("showbalance",{"account":req.query.account, "balance": web3.utils.fromWei(balance, 'ether'), "token": token, "name": name});
});
});
});
})
app.get('/transfer.html', function (req, res) {
var contract = new web3.eth.Contract(JSON.parse(abi), contractAddress, { from: coinbase , gas: 100000});
web3.eth.getAccounts(function(err, accounts) {
contract.methods.symbol().call().then(function(symbol){
res.render("transfer",{"accounts":accounts, "symbol": symbol});
});
});
})
app.get('/send', function (req, res) {
// console.log(req.query)
web3.eth.personal.unlockAccount(req.query.from, req.query.password).then(function(error){
if(req.query.token == "ETH"){
web3.eth.sendTransaction({
from: req.query.from,
to: req.query.to,
value: web3.utils.toWei(req.query.amount ,'ether')
},
function(error, result){
if(!error) {
console.log("#" + result + "#")
res.render("done",{"hash":result});
} else {
console.error(error);
}
});
}else{
var contract = new web3.eth.Contract(JSON.parse(abi), contractAddress, { from: req.query.from , gas: 1000000});
contract.methods.transfer(req.query.to, req.query.amount).send().then(function(hash){
console.log(hash)
res.render("done",{"hash":hash.transactionHash});
});
}
});
})
var server = app.listen(8080, function () {
var host = server.address().address
var port = server.address().port
console.log("應用實例,訪問地址為 http://%s:%s", host, port)
})
[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","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":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burn","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"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":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"}]
<%- include header.ejs %>
<h1>Users</h1>
<ul id="accounts">
<% accounts.forEach(function(account, index){ %>
<li><%= index %>, <%= account %></li>
<% }) %>
</ul>
<p>
新建賬號
<form method="get" action="/new">
密碼:<input type="password" name="password" />
<input type="submit" value="新建賬號" />
</form>
</p>
<%- include header.ejs %>
<h1>Account</h1>
<form method="get" action="/getbalance.html">
<select name="account">
<% accounts.forEach(function(account, index){ %>
<option value ="<%= account %>"><%= account %></option>
<% }) %>
</select>
<input type="submit" value="Submit" />
</form>
<%- include header.ejs %> <p>轉賬完成</p> <p>查看交易 <a href="https://etherscan.io/tx/<%= hash %>" target="etherscan">主網<%= hash %></a> <br /> </p>
<a href="/account.html">賬號</a> | <a href="/balance.html">餘額</a> | <a href="/transfer.html">轉賬</a> <br /> <hr />
<%- include header.ejs %>
<p>
<h1>Account: <%= account %>, Balance: <%= balance %></h1>
</p>
<p>
Token: <%= token%> <%= name%>
</p>
<%- include header.ejs %>
<h1>Account</h1>
<form method="get" action="/send">
From:
<select name="from">
<% accounts.forEach(function(account, index){ %>
<option value ="<%= account %>"><%= account %></option>
<% }) %>
</select>
<br />
To:
<select name="to">
<% accounts.forEach(function(account, index){ %>
<option value ="<%= account %>"><%= account %></option>
<% }) %>
</select>
<select name="token">
<option value ="ETH">ETH</option>
<option value ="<%= symbol %>"><%= symbol %></option>
</select>
<br />
金額: <input type="text" name="amount" /> ETH
<br />
密碼:<input type="password" name="password" />
<br />
<input type="submit" value="Submit" />
</form>