web3.js入门

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规范

函数:
  1. type:“function”;可以被省略,默认为“function”类型
  2. name:函数的名字
  3. constant:如果函数被指定不会修改区块链的状态时为‘true’
  4. payable:如果函数允许接收ether则为true,默认为false。
  5. stateMutability:一个拥有下列值的字符串,‘pure’:指定不会读取区块链的状态;‘view’和上面的‘constant’一样;‘moneyable’、‘payable’和上面的‘payable’一样。
  6. inputs:输入
    1. name:参数名
    2. type:参数的规范类型
  7. outputs:和inputs一样的对象数组,如果没有输出存在可以忽略
事件:
  1. type:恒定为‘event’
  2. name:事件的名称
  3. inputs:输入
    1. name:参数名
    2. type:参数的规范类型
    3. indexed:如果该字段为日志主题的一部分为true,如果为日志的数据段为false
  4. 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


web3.js入门_第1张图片

你可能感兴趣的:(web3.js入门)