使用web3.js进行开发
参考地址:here and here
零、在私有链上部署合约
// 本文中用到的MetaCoin合约
pragma solidity ^0.4.2;contract MetaCoin {mapping (address => uint) balances;event Transfer(address indexed _from, address indexed _to, uint256 _value);function MetaCoin() {balances[tx.origin] = 10000;}function sendCoin(address receiver, uint amount) returns(bool sufficient) {if (balances[msg.sender] < amount) return false;balances[msg.sender] -= amount;balances[receiver] += amount;Transfer(msg.sender, receiver, amount);return true;}function getBalance(address addr) returns(uint) {return balances[addr];}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
一、新建一个项目
新建一个node.js项目并初始化
$ mkdir web3test && cd web3test
$ npm init
- 1
- 2
二、导入web3.js
npm install web3 --save
- 1
三、创建web3对象
var Web3 = require("web3");
//创建web3对象
var web3 = new Web3();
// 连接到以太坊节点
web3.setProvider(new Web3.providers.HttpProvider("http://localhost:8545"));
- 1
- 2
- 3
- 4
- 5
可以测试一下:
var version = web3.version.node;
console.log(version);
==>
在app目录下,终端输入:
prodeMacBook-Pro:web3test pro$ node app.js
输出:
Geth/linoy/v1.6.5-stable-cf87713d/darwin-amd64/go1.8.3
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
四、调用合约
部署合约:
私有链上查看地址,abi可以通过here获取
var abi = [{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"amount","type":"uint256"}],"name":"sendCoin","outputs":[{"name":"sufficient","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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"}];var address = "0x6a0a87bd4da65b39a1b27597edb1a5b505a55a0b";var metacoin = web3.eth.contract(abi).at(address);
- 1
- 2
- 3
- 4
- 5
调用合约:
/* 查看账户余额 */
var account_one = web3.eth.accounts[0];
var account_one_balance = metacoin.getBalance.call(account_one);
console.log("account one balance: ", account_one_balance.toNumber());
===>
终端查看:
prodeMacBook-Pro:web3test pro$ node app.js
account one balance: 10000/* 转账操作 */
var account_one = web3.eth.accounts[0];
var account_two = web3.eth.accounts[1];var txhash = metacoin.sendCoin.sendTransaction(account_two, 100, { from: account_one });var myEvent = metacoin.Transfer();
myEvent.watch(function (err, result) {if (!err) {if (result.transactionHash == txhash) {var account_one_balance = metacoin.getBalance.call(account_one);console.log("account one balance after sendCoin:", account_one_balance.toNumber());}} else {console.log(err);}myEvent.stopWatching();
});
====>
这里可能会遇到错误:Error: authentication needed: password or unlock
原因是账户没有解锁:在终端,personal.unlockAccount(user1, "123456")
然后再次尝试可以看到:
account one balance: 10000
account one balance after sendCoin: 9900
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
创建账户:
var account_three = web3.personal.newAccount("123456");
console.log(account_three);
- 1
- 2
五、与web界面交互
1 . 安装express
查看:here
npm install express --save
- 1
2 . 导入BigNumber.js
处理大数字需要使用BigNumber库
npm install --save bignumber.js
===>
var BigNumber = require('bignumber.js');
- 1
- 2
- 3
3 . 调用合约
a. call
var returnValue = metacoin.getBalance.call(address).toString();
- 1
b. sendTransaction
var txhash = metacoin.sendCoin.sendTransaction(address_b, trans_value, {from:address_a});
- 1
4 . 界面
六、代码部分
1 . app.js代码
/* 现连接到geth节点,并获取已部署合约的引用 */
var express = require("express");
var app = express();
var server = require("http").createServer(app);
var io = require("socket.io")(server);
var BigNumber = require('bignumber.js');app.use(express.static("public"));app.get("/", function(req, res){res.sendFile(__dirname + "/index.html");
})// 现连接到geth节点
var Web3 = require("web3");
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); /* 部署合约 */
var abi = [{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"amount","type":"uint256"}],"name":"sendCoin","outputs":[{"name":"sufficient","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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"}];var address = "0x6a0a87bd4da65b39a1b27597edb1a5b505a55a0b";var metacoin = web3.eth.contract(abi).at(address);app.get("/register", function(req, res){//获取输入的密码var password = req.query.password;//创建账户var account = web3.personal.newAccount(password);res.send(account);})app.get("/getBalance", function(req, res){var address = req.query.address;//获取address的余额var returnValue = metacoin.getBalance.call(address).toString();res.send(returnValue);})app.get("/sendcoin", function(req, res){var address_a = req.query.address_a;var address_b = req.query.address_b;var trans_value = req.query.trans_value;//转账操作var txhash = metacoin.sendCoin.sendTransaction(address_b, trans_value, {from:address_a});res.send(txhash);})
server.listen(8080);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
2 . html代码
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>转账操作</title><link rel="stylesheet" href="">
</head>
<body><div><div> <h3>注册:</h3><br><label for="identity">请输入密码:</label><input type="text" id="password" ></input><button type = "submit" onclick="register()">注册</button><p id = "address_test">地址:</p></div><div> <h3>查询余额:</h3><br><label for="identity">请输入地址:</label><input type="text" id="address" ></input><button type = "submit" onclick="getBalance()">查询余额</button><p id = "address_balance">余额:</p></div> <div><h3>转账</h3><label for="identity">转出用户地址</label><input type="text" id="address_a" ></input><br><label for="identity">转入用户地址</label><input type="text" id="address_b" ></input><br><label for="identity">金额</label><input type="text" id="trans_value" ></input><button type = "submit" onclick="sendcoin()">确定</button><p id = "tx_hash">交易:</p></div></div><script type="text/javascript" src="/sha1.min.js"></script><script type="text/javascript" src="/jquery.min.js"></script><script type="text/javascript" src="/socket.io.min.js"></script><script type="text/javascript" src="/main.js"></script><script type="text/javascript" src="/bignumber.js"></script></body>
</html>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
3 . main.js代码
function register()
{var password = document.getElementById("password").value;$.get("/register?password=" + password, function(data){if(data == "Error"){$("#address_test").text("An error occured.");}else{$("#address_test").html("地址: " + data);}});
}function getBalance()
{var address = document.getElementById("address").value;$.get("/getBalance?address=" + address, function(data){if(data == "Error"){$("#address_balance").text("An error occured.");}else{$("#address_balance").html("余额: " + data);}});
}function sendcoin()
{var address_a = document.getElementById("address_a").value;var address_b = document.getElementById("address_b").value;var trans_value = document.getElementById("trans_value").value;var tx_hash = document.getElementById("tx_hash").value;//转账$.get("/sendcoin?address_a=" + address_a + "&address_b=" + address_b + "&trans_value=" + trans_value, function(data){$("#tx_hash").html("交易: " + data);});}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
使用web3.js进行开发相关推荐
- 以太坊智能合约开发,Web3.js API 中文文档 ethereum web3.js入门说明
以太坊智能合约开发,Web3.js API 中文文档 ethereum web3.js入门说明 为了让你的Ðapp运行上以太坊,一种选择是使用web3.js library提供的web3.对象.底层实 ...
- 【区块链 | Solidity】Solidity开发教程:用Web3.js构建第一个Dapp
Web3.js 使用的实用介绍 原文 作者:wissal haji 欢迎订阅<Solidity智能合约零基础开发教程专栏>系列文章. 如果你一直在跟着这个系列学习,那么你已经掌握了编写自己 ...
- 以太坊Web3.js开发基础
简介 web3.js是一个通过RPC调用和本地以太坊节点进行通信的js库.web3.js可以与任何暴露了RPC接口的以太坊节点连接 .web3中提供了eth对象 - web3.eth来与以太坊区块链进 ...
- 智能合约开发 Ganache | Truffle | Solidity | Web3.js
Truffle Truffle是最全面的智能合约开发套件 内置智能合约编译.链接.部署和二进制管理. 使用断点.变量分析和步骤功能进行高级调试. Truffle基于JavaScript编写,可以在智能 ...
- 以太坊开发攻略五:以太坊的编程接口web3.js API的使用上:转账
以太坊开发攻略一:准备篇上:各种相关工具安装和环境配置 以太坊开发攻略二:准备篇下:以太坊的编译.安装 以太坊开发攻略三:以太坊私有链的搭建(基于ethash共识挖矿) 以太坊开发攻略四:以太坊私有链 ...
- 在vue中使用web3.js开发以太坊dapp
前端如何使用以太坊智能合约方法 这里讲的是前端与MetaMask之间的交互 文中涉及到的官方文档 web3.js 1.0中文手册 MetaMask官方文档 web3.js文件 链接:https://p ...
- 【一步步一起学DApp开发】(四)web3.js 基本使用 | 连接geth | 创建web客户端
概述 web3.js内部使用JSONRPC与geth通信.它把所有JSON-RPC API当作JavaScript API,也就是说,它不仅支持所有与以太坊相关的API,还支持与Whisper和Swa ...
- Web3.js 0.20.x API 中文版翻译
文档原始链接为:https://web3.learnblockchain.cn/0.2x.x/,欢迎大家前往查阅,本文只是节选开头部分的介绍及API列表索引,以下为翻译正文: 为了开发一个基于以太坊的 ...
- Web3.js 0.20.x API 中文版翻译 1
2019独角兽企业重金招聘Python工程师标准>>> 本文首发于深入浅出区块链社区 原文链接:Web3.js 0.20.x API 中文版翻译原文已更新,请读者前往原文阅读 文档原 ...
最新文章
- Ubantu Mark
- 【高级数据结构】并查集
- Android Studio 第四十九期 - Sqlite数据库四种写法
- monkey测试===ios-monkey测试工具
- bzoj 1058: [ZJOI2007]报表统计 (Treap)
- 超级大汇总!200多个最好的机器学习、NLP和Python教程
- You have new mail
- 《P5R》的反派设计有什么可取之处?
- weakhashmap_Java WeakHashMap entrySet()方法与示例
- ip别名及其在tcp压力测试时候的作用
- Jmeter(一)http接口添加header和cookie
- moss2007-搜索服務
- 数学归纳法在数据结构与算法分析设计中的应用
- 如何进行多语言发布,做国际化开发
- 【编程开发】 C与C++中的关于函数指针的强制类型转换与指针函数的关系
- RTMP 封包详解
- python桌面程序臃肿_Python自动化整理文件“大升级”,任意路径下文件,都给你整理的明明白白!...
- 令人困惑的strtotime
- cad线性标注命令_CAD中线性标注的快捷命令是什么
- ASO关键词排名优化如何操作联想词,aso 联想词 工具
热门文章
- Linux gdb调试器
- WebForm页面使用Ajax
- iOS开发 贝塞尔曲线UIBezierPath(后记)
- [LeetCode] Decode Ways
- Razor Engine,动态脚本语言,mvc上的语法,适用于文件内容生成,静态网页生成等。...
- JSP连接数据库 - MySQL
- Xtreme ToolkitPro 初使用
- 深度学习问题解决:Check failed: stream-parent()-GetConvolveAlgorithms( conv_parameters.ShouldIncludeWinogra
- 1.在Linux下如何使用软盘、光盘以及DOS等非Linux分区
- 常见测量矩阵的MATLAB实现