# 写给人类的Ethers.js入门教程

By [AeroXi](https://paragraph.com/@aeroxi-2) · 2022-06-15

---

以前一直用web3.js，听说ethers好用，但官方文档难以理解，参考了别的文章后发现确实很好用，于是打算写一篇中文入门教程（更新中）

本文参考了

[https://dev.to/hideckies/ethers-js-cheat-sheet-1h5j](https://dev.to/hideckies/ethers-js-cheat-sheet-1h5j)

安装
--

Import
------

    // ES Modules
    import { ethers } from 'ethers';
    // CommonJS
    const { ethers } = require('ethers');
    

Provider
--------

要与区块链交互，需要Provider，可以使用你的节点rpc，也可以使用用户钱包的节点

### 自定义节点rpc

    const provider = new ethers.provider.JsonRpcProvider(`url`);
    

url填写你的节点rpc url即可，如果是websocket则需要换成WebSocketProvider

### 使用MetaMask钱包

    const provider = new ethers.provider.Web3Provider(window.ethereum);
    

Signer
------

发出交易前需要用signer进行签名，signer需拥有私钥

### 代码中签名

用私钥初始化Wallet对象

    const wallet = new ethers.Wallet(privateKey)
    const signer = wallet.connect(provider)
    

### 使用钱包签名

当provider是钱包时，可直接获得signer

    const signer = provider.getSigner();
    

合约交互
----

### 只读

读取合约只需要provider，不发交易改变链上状态

    const contract = new ethers.Contract(`address`, `abi`, `provider`);
    

其中abi如果是etherscan上已开源的可以[通过api获取](https://docs.etherscan.io/api-endpoints/contracts)

### 读写

写合约需要signer，因此第三个参数改为signer即可以对应钱包去发交易

    const contract = new ethers.Contract(`address`, `abi`, `signer`); 
    

然后用`contract.METHOD_NAME`可以调用合约相应的方法

Event监听
-------

### 监听Pending交易

    provider.on("pending", (tx) => {
        console.log(tx)
    });
    

### 按log过滤监听，可监听指定地址

    filter = {
        address: "vitalik.eth",
        topics: []
    }
    provider.on(filter, (log, event) => {
        console.log(log)
    })
    

单位转换
----

### Ether => Wei

    const wei = ethers.utils.parseEther(`ETH`);
    

### Wei => Ether

    const ether = ethers.utils.formatEther(`wei`);
    

[https://embed.0xecho.com.ipns.page?color-theme=auto&desc=&has-h-padding=true&has-v-padding=true&modules=comment%2Clike%2Ctip&receiver=aeroxi.eth&target\_uri=https%3A%2F%2Fmirror.xyz%2Faeroxi.eth%2FNsHlKipNwhutSoEZMv\_LCFsPUCk0zziksfUFODafQbc&height=800&display=iframe](https://embed.0xecho.com.ipns.page?color-theme=auto&desc=&has-h-padding=true&has-v-padding=true&modules=comment%2Clike%2Ctip&receiver=aeroxi.eth&target_uri=https%3A%2F%2Fmirror.xyz%2Faeroxi.eth%2FNsHlKipNwhutSoEZMv_LCFsPUCk0zziksfUFODafQbc&height=800&display=iframe)

---

*Originally published on [AeroXi](https://paragraph.com/@aeroxi-2/ethers-js)*
