Web3.js简介:
web3.js是包含以太坊生态系统的特定函数库的集合。主要包含以下函数库。
- web3-eth用于以太坊区块链和智能合约
- web3-shh用于whisper协议用来p2p连接和广播
- web3-bzz用于swarm协议,即分散式文件存储
- web3-utils包含对于开发者有用的帮助函数
添加web3.js
首先需要添加web3.js到项目中,可以使用以下方式:
- 使用npm的方式: npm install web3
- 使用meteor方式:meteor add ethereum:web3
- 使用pure js的方式:link the dist/web3.min.js
安装之后你需要创建一个web3的实例,并提供一个provider。像Mist或MetaMask这样的以太坊浏览器具有ethereumProvider或web3.currentProvider对象的都可以提供provider。该provider是web3接入区块链网络节点的入口。在使用web3.js的时候需要检测web3.givenProvider属性,如果该属性为空,需要手动设置一个远程或本地节点。
// in node.js use:
var Web3 = require('web3');
var web3 = new Web3(Web3.givenProvider || "ws://localhost:8546");
现在就可以直接使用web3对象了。
基于Promise的事件回调
为了将web3集合到各种不同标准的项目中,web3提供了不同的实现异步的方式。
大多数的web3对象允许在最后一个参数传入一个回调函数,相当于返回一个promises函数链。
以太坊区块链具有不同阶段的结束状态,因此一个行为可能返回多个状态。为了应对这种需求,我们为像‘web3.eth.sendTransaction’或者合约方法这样的函数返回一个“promiEvent”。这种“promiEvent”将promise函数和事件监听结合起来了,适用于区块链上不同阶段状态的行为,例如交易。
promiEvent的工作机制像一般的promises函数一样,并且带有on、once、off事件函数。通过这种方式,开发人员可以监听像‘receipt’或‘transactionHash’等其他事件。
web3.eth.sendTransaction({from: '0x123...', data: '0x432...'})
.once('transactionHash', function(hash){ ... })
.once('receipt', function(receipt){ ... })
.on('confirmation', function(confNumber, receipt){ ... })
.on('error', function(error){ ... })
.then(function(receipt){
// will be fired once the receipt its mined
});
json化接口描述
json接口是以太坊智能合约的ABI(Application Binary Interface)描述的json对象。
使用web3的json接口可以创建代表智能合约和智能合约的方法和事件的JavaScript对象,可以使用web3.eth.Contract对象进行创建。
json规范
函数:
- type:“function”;可以被省略,默认为“function”类型
- name:函数的名字
- constant:如果函数被指定不会修改区块链的状态时为‘true’
- payable:如果函数允许接收ether则为true,默认为false。
- stateMutability:一个拥有下列值的字符串,‘pure’:指定不会读取区块链的状态;‘view’和上面的‘constant’一样;‘moneyable’、‘payable’和上面的‘payable’一样。
- inputs:输入
- name:参数名
- type:参数的规范类型
- outputs:和inputs一样的对象数组,如果没有输出存在可以忽略
事件:
- type:恒定为‘event’
- name:事件的名称
- inputs:输入
- name:参数名
- type:参数的规范类型
- indexed:如果该字段为日志主题的一部分为true,如果为日志的数据段为false
- anonymous:如果事件被声明为匿名的则为true
例子:
contract Test {
uint a;
address d = 0x12345678901234567890123456789012;
function Test(uint testInt) { a = testInt;}
event Event(uint indexed b, bytes32 c);
event Event2(uint indexed b, bytes32 c);
function foo(uint b, bytes32 c) returns(address) {
Event(b, c);
return d;
}
}
// would result in the JSON:
[{
"type":"constructor",
"payable":false,
"stateMutability":"nonpayable"
"inputs":[{"name":"testInt","type":"uint256"}],
},{
"type":"function",
"name":"foo",
"constant":false,
"payable":false,
"stateMutability":"nonpayable",
"inputs":[{"name":"b","type":"uint256"}, {"name":"c","type":"bytes32"}],
"outputs":[{"name":"","type":"address"}]
},{
"type":"event",
"name":"Event",
"inputs":[{"indexed":true,"name":"b","type":"uint256"}, {"indexed":false,"name":"c","type":"bytes32"}],
"anonymous":false
},{
"type":"event",
"name":"Event2",
"inputs":[{"indexed":true,"name":"b","type":"uint256"},{"indexed":false,"name":"c","type":"bytes32"}],
"anonymous":false
}]
更多区块链技术,请关注公众号:blockchain_jiangsong