web app通过provider跟eth chain, wallet,client 进行监听,交互。主要有request方法发送rpc并响应事件,和监听events事件两种方式。
四个基本概念
1 Provider
一个javascript对象,用来访问eth链。
2 Client
接收 Provider 发出的 RPC请求的一个点,并返回结果。
3 Wallet
用来管理密钥和执行签名操作的应用,位于provider 和 client 之间。
4 Remote Procedure Call (RPC)
方法:
request
interface RequestArguments {
readonly method: string;
readonly params?: readonly unknown[] | object;
}
Provider.request(args: RequestArguments): Promise<unknown>;
interface ProviderRpcError extends Error { code: number; data?: unknown; }
Provider 错误类型
| Status code | Name | Description |
|---|---|---|
| 4001 | User Rejected Request | The user rejected the request. |
| 4100 | Unauthorized | The requested method and/or account has not been authorized by the user. |
| 4200 | Unsupported Method | The Provider does not support the requested method. |
| 4900 | Disconnected | The Provider is disconnected from all chains. |
| 4901 | Chain Disconnected | The Provider is not connected to the requested chain. |
Events
message
Subscriptions
connect
disconnect
chainChanged
accountsChanged
总结
Provider 的目的是提供一个可以跟eth链交互的consumer,所以它必须给dapp提供:
1 向eth链发送rpc请求
2 监听eth链,wallet 和 client 的上变化
provider的api只提供了一种方法和5种event。其中events可以分成两类
1 是否可以发送RPC了 connect disconnect
2 client 和 wallet 是否发生变化了 chainChanged accountsChanged
目前实现了provider API 的库有:
buidler.dev ethers.js eth-provider MetaMask WalletConnect web3.js
目前uniswap用到的是ethers.js