为了让你的Ðapp运行上以太坊,一种选择是使用web3.js library提供的web3。
对象。底层实现上,它通过RPC 调用与本地节点通信。web3.js可以与任何暴露了RPC接口的以太坊节点连接。
web3
中有eth
对象 - web3.eth
具体来表示与以太坊区块链之间的交互。shh
对象 - web3.shh
表示Whisper
协议的相关交互。后续我们会继续介绍其它一些web3协议中的对象。可用的example can be found here
如果你想找一些更复杂的示例,可以看看这里useful Ðapp patterns.
入门
添加web3
首先你需要将web3引入到你的工程中,通过如下步骤:
npm:
npm install web3
bower:
bower install web3
metor:
meteor add ethereum:web3
vanilla:
dist./web3.min.js
然后你需要创建一个web3的实例,设置一个provider
。为了保证你不会覆盖一个已有的provider
,比如使用Mist时有内置,需要先检查是否web3
实例已存在。
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")); }
成功引入后,你现在可以使用web3
的相关API了。
使用callback
由于这套API被设计来与本地的RPC结点交互,所有函数默认使用同步的HTTP的请求。
如果你想发起一个异步的请求。大多数函数允许传一个跟在参数列表后的可选的回调函数来支持异步。回调函数支持error first callback的风格。
web3.eth.getBlock(48, function(error, result){ if(!error) console.log(result) else console.error(error); })
批量请求
可以允许将多个请求放入队列,并一次执行。
注意:批量请求并不会更快,在某些情况下,同时发起多个请求,由于是异步的,会变得更快。但这里的批量请求主要目的是用来保证请求的串行执行。
关于web3.js中的Big Number
的说明
数据类型的返回结果,你将始终会得到一个BigNumber
对象,因为Javascript不能正确的处理BigNumber
,如下面的例子:
"101010100324325345346456456456456456456"// "101010100324325345346456456456456456456"101010100324325345346456456456456456456// 1.0101010032432535e+38
所以web3.js依赖BigNumber Library1,且会自动进行引入。
var balance = new BigNumber('131242344353464564564574574567456');// or var balance = web3.eth.getBalance(someAddress);balance.plus(21).toString(10); // toString(10) converts it to a number string// "131242344353464564564574574567477"
下一个例子中,我们会看到,如果有20位以上的浮点值,仍会导致出错。所以,我们推荐尽量让帐户余额以wei
为单位,仅仅在需要向用户展示时,才转换为其它单位。
var balance = new BigNumber('13124.234435346456466666457455567456'); balance.plus(21).toString(10); // toString(10) converts it to a number string, but can only show max 20 floating points // "13145.23443534645646666646" // you number would be cut after the 20 floating point