web3.js的使用,从连接metamask到回调事件

1,213 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

web3.js 库是一组包含以太坊生态系统功能的模块。

  • web3-eth :用于以太坊区块链和智能合约。
  • web3-shh:用于whisper 协议,用于p2p 和广播通信。
  • web3-bzz:用于swarm协议,去中心化文件存储。
  • web3-utils:包含对 Dapp 开发人员有用的帮助函数。

使用web3.js

1、首先,下载web3.js

分别有一下几种方法:

npm:npm install web3
yarn: yarn add web3
bower: bower install web3
meteor: meteor add ethereum:web3
pure js: link the dist/web3.min.js
vanilla: link dist/web3.min.js

2、创建一个 web3 实例并设置一个provider.

<1>、大多数支持以太坊的浏览器(如 MetaMask钱包)都有一个符合EIP-1193的提供程序在 window.ethereum

<2>、检查Web3.givenProvider.如果此属性是null您应该连接到远程/本地节点。 一般使用if语句

const web3 = new Web3(Web3.givenProvider || "ws://localhost:8545");

如果是node.js,则要引入模板:

const Web3 = require('web3');

例如: 1、

if (typeof web3 !== 'undefined') {
    web3 = new Web3(web3.currentProvider);
} else {
// 设置你想要的web3.providers
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
}

2、

// 检查是否是新的 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);

这样就可以开始使用了。。。

Callbacks Promises Events(回调承诺事件)

web3集成到具有不同标准的各种项目中,提供了多种方式来处理异步函数。大多数 web3.js 对象都允许回调作为最后一个参数,以及返回对链function的promises

web3.eth.sendTransaction为了满足这一要求,我们为类似或合约方法的函数返回一个“promiEvent”

PromiEvents 的工作方式与添加了on,onceoff功能的普通 Promise 类似。通过这种方式,开发人员可以监视其他事件


web3.eth.sendTransaction({
    from: '0x123...', 
    data: '0x432...'
    })
    .once('sending', function(payload){ ...
    })
    .once('sent', function(payload){ ... 
    })
    .once('transactionHash', function(hash){ ... 
    })
    .once('receipt', function(receipt){ ... 
    })
    .on('confirmation', function(confNumber, receipt, latestBlockHash){ ...     })
    .on('error', function(error){ ...
    })
    .then(function(receipt){
    // will be fired once the receipt is mined
    });