web3简介
注意 web3.js 有两个不兼容的版本:0.20.x及1.0beta,1.0对0.20版本做了重构。
本文档是web3.js 0.20.x版本翻译,其对应的官方文档地址在-API。 如果你使用的是 web3.js 1.0版本,其对应的官方文档地址在 。
Web3是一套和以太坊节点进行通信的API,如果我们需要基于以太坊来开发去中心化应用,则web3是必须要了解的内容,例如需要通过Web3来获取节点状态,获取账号信息java shh回调模式,调用合约、监听合约事件等等。
译者注: 智能合约是运行在节点提供的虚拟机上,因此调用智能合约也需要像节点发送请求。
基于以太坊开发DApp(去中心化应用程序),可以使用web3.js库提供的web3对象java shh回调模式, 在底层实现上,web3通 过RPC调用与本地节点通信,web3.js可以与任何暴露了RPC接口的以太坊节点连接。
web3包含下面几个对象:
web3.js使用示例:
想要学习去中心化应用(DAPP)开发,这门课程不容错过区块链全栈-以太坊DAPP开发实战
引入web3
首先你需要将web3引入到应用工程中,可以通过如下几个方法:
然后你需要创建一个web3的实例,设置一个。为了保证你不会覆盖一个已有的(Mist浏览器或安装了的浏览器会提供),需要先检查是否web3实例已存在,示例代码如下:
<pre class="has">`if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
} else {
// set the provider you want from Web3.providers
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
}
`</pre>
译者注: 官方文档中对于web3的没有更新,现在新的检查方式为:
<pre class="has">`// 检查是否是新的MetaMask 或 DApp浏览器
var web3Provider;
if (window.ethereum) {
web3Provider = window.ethereum;
try {
// 请求用户授权
await window.ethereum.enable();
} catch (error) {
// 用户不授权时
console.error("User denied account access")
}
} else if (window.web3) { // 老版 MetaMask Legacy dapp browsers...
web3Provider = window.web3.currentProvider;
} else {
web3Provider = new Web3.providers.HttpProvider('http://localhost:8545');
}
web3 = new Web3(web3Provider);
`</pre>
成功引入后,你现在可以使用web3对象的API 了。
使用回调
由于这套API被设计来与本地的RPC结点交互,所有函数默认使用同步的HTTP的请求。
如果你想发起一个异步的请求。大多数函数允许传一个跟在参数列表后的可选的回调函数来支持异步,回调函数支持Error-first回调的风格。
<pre class="has">`web3.eth.getBlock(48, function(error, result){
if(!error)
console.log(JSON.stringify(result));
else
console.error(error);
})
`</pre>
批量请求
可以允许将多个请求放入队列,并一次执行。
注意:批量请求并不会更快,在某些情况下,同时发起多个异步请求,也许更快。这里的批量请求主要目的是用来保证请求的串行执行。
<pre class="has">`var batch = web3.createBatch();
batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000000', 'latest', callback));
batch.add(web3.eth.contract(abi).at(address).balance.request(address, callback2));
batch.execute();
`</pre>
web3.js中的大数处理
如果是一个数据类型的返回结果,通常会得到一个对象,因为不能正确的处理,看看下面的例子:
<pre class="has">`"101010100324325345346456456456456456456"
// "101010100324325345346456456456456456456"
101010100324325345346456456456456456456
// 1.0101010032432535e+38
`</pre>
所以web3.js依赖 _ 。
<pre class="has">`var balance = new BigNumber('131242344353464564564574574567456');
// or var balance = web3.eth.getBalance(someAddress);
balance.plus(21).toString(10); // 转化为字符串
// "131242344353464564564574574567477"
`</pre>
下一个例子中,我们会看到,如果有20位以上的浮点值java shh回调模式-以太坊:Web3.js 0.20 使用说明,仍会导致出错。所以推荐尽量让帐户余额以wei为单位,仅仅在需要向用户展示时,才转换为其它单位。
<pre class="has">`var balance = new BigNumber('13124.234435346456466666457455567456');
balance.plus(21).toString(10); // toString(10) converts it to a number string, but can only show upto 20 digits
// "13145.23443534645646666646" // your number will be truncated after the 20th digit
`</pre>
Web3.js 0.2x.x API 手册
网络对象 net以太坊交互对象 eth数据对象 db通信协议对象 shh and