2022/08/08 Web3库介绍

# 2022/08/08 Web3.Js 入门

### web3库功能简介

**`web3.js` 库是一系列模块的集合,服务于以太坊生态系统的各个功能,如:**

- web3-eth 用来与以太坊区块链及合约的交互;

- web3-shh Whisper 协议相关,进行p2p通信和广播;

- web3-bzz swarm 协议(去中心化文件存储)相关;

- web3-utils 包含一些对 DApp 开发者有用的方法。

**一些前提共识:**

1. 每一个`web3`实例都需要设置一个授权者(`provider`).`Mist`或`MetaMask`会有提供一个`ethereumProvider`或`web3.currentProvider` ---> 因为底层是基于`rpc`框架去和区块链进行交互.该交互会连接到区块链节点上,链接上去需要一个授权者. ---> 可以检查授权者`web3.givenProvider`(该值可能为`null`)

**链接本地或者远程节点:**

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

#### 回调`Promises`事件

**特点:**

大多数`web3.js`对象都允许回调作为最后一个参数,以及返回对链函数的`Promises`

**以太坊作为区块链具有不同级别的确定性,因此需要返回一个动作的多个“阶段”.`web3.eth.sendTransaction`为了满足要求,为类似或合约方法的函数返回一个`promiEvent`.`promiEvent`是一个与事件发射器相结合的`Promise`,允许在区块链上的不同行动阶段采取行动.**

**示例代码:**

`
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 is mined
});
`

`PromiEvents`的工作方式与添加了`on`,`once`和`off`功能的普通`Promise`类似.该方式可以让开发人员可以监视其他事件

#### 库内部介绍

- `Web3`是`web3.js`库的主类.下面包含一些属性:
- > Web3.utils
- > Web3.version
- > Web3.givenProvider
- > Web3.providers
- > Web3.modules

**一些返回值:**

`Object`模块构造函数:
- `Eth`: `Constructor`: 与以太坊网络交互的`Eth`模块
- `Net`: `Constructor`: 与网络属性进行交互的`Net`模块
- `Personal`: `Constructor`: 与以太坊账户交互的`Personal`模块

**与以太坊相关的模块:**

`
> web3.eth
> web3.shh
> web3.bzz
> web3.utils -> `Web3`类的静态可访问属性也`Web3`实例的属性. `web3.utils`的工具方法也直接在`Web3`类对象上公开
> web3.version
`

**具有以下`Provider`的`object`:**

- Object- :HttpProvider 不推荐使用`HTTP`提供程序,因为它不适用于(`subscriptions`).

- Object- WebsocketProvider:`Websocket`提供程序是在旧版浏览器中使用的标准.

- Object- IpcProvider:运行本地节点时使用`IPC`提供程序`node.js dapps`.提供最安全的连接.

- Object - HttpProvider: **不推荐使用**。

- Object - WebsocketProvider: `Websocket provider`用于传统的浏览器中的标准方法.

- Object - IpcProvider: 当运行一个本地节点时,`IPC provider`用于`node.js`下的`DApp`环境,提供最为安全的连接.

**示例代码:**

`
var Web3 = require('web3');
// 使用指定的 Provider (e.g 比如在 Mist 中) 或者实例化一个新的 websocket provider
var web3 = new Web3(Web3.givenProvider || 'ws://remotenode.com:8546');
// 或者
var web3 = new Web3(Web3.givenProvider || new Web3.providers.WebsocketProvider('ws://remotenode.com:8546'));

// 在 node.js 中使用 IPC provider
var net = require('net');

var web3 = new Web3('/Users/myuser/Library/Ethereum/geth.ipc', net); // mac os 路径
// 或者
var web3 = new Web3(new Web3.providers.IpcProvider('/Users/myuser/Library/Ethereum/geth.ipc', net)); // mac os 路径
`

**`methods-object`:扩展对象:**

- `property - String`: (可选)要添加到模块上的属性名称。如果没有设置属性,则直接添加到模块上
- `methods - Array`:
- `name - String`: 要添加的方法名称。

- `call - String`: `RPC`方法名称。

- `params - Number`: (可选)方法的参数个数,默认值为 0

- `inputFormatter - Array`: (可选) 输入格式化函数数组,每个成员对应一个函数参数,或者使用`null`来对应不需要进行格式化处理的参数。

- outputFormatter - ``Function: (可选) 用来格式化方法输出。

**下面这些方法没有指定 "from" 属性,则使用该地址作为默认的 "from" 属性值**

- web3.eth.sendTransaction()

- web3.eth.call()

- new web3.eth.Contract() -> myContract.methods.myMethod().call()

- new web3.eth.Contract() -> myContract.methods.myMethod().send()

**签名交易使用的默认通用属性:**

- customChain - Object: 自定义链属性
- name - string: (可选) 链名称

- networkId - number: 自定义链的网络 ID

- chainId - number: 自定义链的链 ID

- baseChain - string: (可选) mainnet, goerli, kovan, rinkeby, or ropsten

- hardfork - string: (可选) chainstart, homestead, dao, tangerineWhistle, spuriousDragon, byzantium, constantinople, petersburg, or istanbul

**示例代码:**

`
// 设置默认通用属性
web3.eth.defaultCommon = {customChain: {name: 'custom-network', chainId: 1, networkId: 1}, baseChain: 'mainnet', hardfork: 'petersburg'};
`

posted @   俊king  阅读(221)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示