ethers.jsのオブジェクトを眺めてみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7103/050625f7-65a9-eca6-f070-dae6f4e94ed8.png)

「[霊園ガイド](https://reien.top/)」サイト開発日記の高橋です。＜誰も知らんがな＜お約束

前回は、[web3.jsをほぼゼロからGCPのVM(Ubuntu)に入れてみる](https://qiita.com/toshirot/items/bbab6a407c333555715d)ということで、勇んでweb3.jsを始めようとしていたのですが、

「web3.jsより最近はethers.jsが人気あるよ？」とのうわさを耳にして、急遽、方針転換し、前回構築したGCPのVMをそのまま使ってethers.jsを勉強していくことにしました。すみません。

君子豹変すなのであり、気を見るに敏、なのであります。＜三日坊主ですらない

さて、そういうことで朝令ではweb3.jsがテキストでしたが、暮れてから改定したテキストはこちら
https://docs.ethers.io/v5/

ethers.jsです。きっぱり。

一応、web3.jsもethers.jsもJavaScriptからEthereum nodeにJSON RPCで接続してあそべるライブラリですが、ethers.jsの方が新しく、web3.jsの方が歴史があります。

ただ最近は、期間を区切ると ethers.js の方がダウンロード数が多く「最近はethers.jsが人気あるよ」を裏付けてるような気もします。

詳しい比較情報はこちらに譲ります。
>web3.jsとethers.jsのどちらを使うべきか(両者の比較)
https://zenn.dev/nft/books/410be300912936/viewer/0a5ab8

では、Getting Startedページから始めます。
# Getting Started

テキストはこのページです
https://docs.ethers.io/v5/getting-started/
gitではここ
https://github.com/ethers-io/ethers.js

## Installing
インストールのためのコードはこう書いてあります。
```shell
/home/ricmoo> npm install --save ethers
```
因みに --saveは、npmのオプションで package.json の dependencies に追記してくれるものですが npm v5 以降なら勝手にやってくれるので不要です。

あと、ricmoo は作者の名前で、github の説明では、「/home/ricmoo/some_project> npm install --save ethers」となっています。

さてGCPにVMを作るところは前回終わったので、とりま ethers というディレクトリを作って進めようと思います
```shell
mkdir ethers
cd ethers
```
こんな感じで今回は、/home/web3/ethersというディレクトリができました。web3.jsのつもりだったので名前がweb3なのは許してください(^^;

一応、/home/web3/ethersにいれるモジュールは他と混ぜたくないので、このディレクトリにnode_modulesディレクトリを作っておきます。
```shell
mkdir node_modules
```
そして、ethersをインストール
```shell
npm i ethers
```
どうかな？
```shell
ls -l
total 60
drwxrwxr-x 17 info info  4096 Apr  8 11:45 node_modules
-rw-rw-r--  1 info info 51991 Apr  8 11:45 package-lock.json
-rw-rw-r--  1 info info    51 Apr  8 11:45 package.json

#package.jsonに入ってるかな？
cat package.json
{
  "dependencies": {
    "ethers": "^5.6.2"
  }
}
```
v5.6.2が入りました。

## Importing
次はNode.jsまたはブラウザ内にインポートする方法です。

Node.jsでもブラウザでも読み込めるので夢ひろがりんぐではありますが、特にコードがむき出しのブラウザ側ではお金の絡むことではありますので慎重さが必要かなぁとは思います。個人的には自分の [libra-Auth](https://github.com/toshirot/libra-auth) 的な使い道に使えそうで少しわくわくしてきました＾＾

### Node.js
```Node.js
const { ethers } = require("ethers"); #requireの場合
```

```TypeScript
import { ethers } from "ethers"; #ES6 or TypeScriptの場合
```
### Web Browser
```html
<!--ES6 in the Browserの場合-->
<script type="module">
    import { ethers } from "https://cdn.ethers.io/lib/ethers-5.2.esm.min.js";
    // Your code here...
</script>
```
```html
<!--ES3 (UMD) in the Browserの場合-->
<script src="https://cdn.ethers.io/lib/ethers-5.2.umd.min.js"
        type="application/javascript"></script>
```

# 読み込んだethers オブジェクトを確認してみる

ここで前回同様に、テキストを離れて、読み込まれたethers オブジェクトを確認してみます。

```shell
mkdir test
vi test/test1.js
```
作業用のtestディレクトリを作り そこに「test1.js」というファイルを置きます。
中身はこんな感じ。
```Node.js
const { ethers } = require("ethers");
console.log(ethers)
```
実行してみます
```shell
node test/test1.js
```
読み込まれた ethers オブジェクトが出力されました。
[API ](https://docs.ethers.io/v5/api/)のページにあるメソッドなどが並んでいるように見えます。
では、この辺を覗きながら試していけばよいのかな。

```js
{
  Signer: [Getter],
  Wallet: [Getter],
  VoidSigner: [Getter],
  getDefaultProvider: [Getter],
  providers: {
    Provider: [Getter],
    BaseProvider: [Getter],
    Resolver: [Getter],
    UrlJsonRpcProvider: [Getter],
    FallbackProvider: [Getter],
    AlchemyProvider: [Getter],
    AlchemyWebSocketProvider: [Getter],
    AnkrProvider: [Getter],
    CloudflareProvider: [Getter],
    EtherscanProvider: [Getter],
    InfuraProvider: [Getter],
    InfuraWebSocketProvider: [Getter],
    JsonRpcProvider: [Getter],
    JsonRpcBatchProvider: [Getter],
    NodesmithProvider: [Getter],
    PocketProvider: [Getter],
    StaticJsonRpcProvider: [Getter],
    Web3Provider: [Getter],
    WebSocketProvider: [Getter],
    IpcProvider: [Getter],
    JsonRpcSigner: [Getter],
    getDefaultProvider: [Function: getDefaultProvider],
    getNetwork: [Getter],
    isCommunityResource: [Getter],
    isCommunityResourcable: [Getter],
    showThrottleMessage: [Getter],
    Formatter: [Getter]
  },
  BaseContract: [Getter],
  Contract: [Getter],
  ContractFactory: [Getter],
  BigNumber: [Getter],
  FixedNumber: [Getter],
  constants: {
    AddressZero: [Getter],
    NegativeOne: [Getter],
    Zero: [Getter],
    One: [Getter],
    Two: [Getter],
    WeiPerEther: [Getter],
    MaxUint256: [Getter],
    MinInt256: [Getter],
    MaxInt256: [Getter],
    HashZero: [Getter],
    EtherSymbol: [Getter]
  },
  errors: [Getter],
  logger: Logger { version: 'ethers/5.6.2' },
  utils: {
    AbiCoder: [Getter],
    defaultAbiCoder: [Getter],
    Fragment: [Getter],
    ConstructorFragment: [Getter],
    ErrorFragment: [Getter],
    EventFragment: [Getter],
    FunctionFragment: [Getter],
    ParamType: [Getter],
    FormatTypes: [Getter],
    checkResultErrors: [Getter],
    Logger: [Getter],
    RLP: { encode: [Function: encode], decode: [Function: decode] },
    _fetchData: [Getter],
    fetchJson: [Getter],
    poll: [Getter],
    checkProperties: [Getter],
    deepCopy: [Getter],
    defineReadOnly: [Getter],
    getStatic: [Getter],
    resolveProperties: [Getter],
    shallowCopy: [Getter],
    arrayify: [Getter],
    concat: [Getter],
    stripZeros: [Getter],
    zeroPad: [Getter],
    isBytes: [Getter],
    isBytesLike: [Getter],
    defaultPath: [Getter],
    HDNode: [Getter],
    SigningKey: [Getter],
    Interface: [Getter],
    LogDescription: [Getter],
    TransactionDescription: [Getter],
    base58: [Getter],
    base64: { decode: [Getter], encode: [Getter] },
    hexlify: [Getter],
    isHexString: [Getter],
    hexConcat: [Getter],
    hexStripZeros: [Getter],
    hexValue: [Getter],
    hexZeroPad: [Getter],
    hexDataLength: [Getter],
    hexDataSlice: [Getter],
    nameprep: [Getter],
    _toEscapedUtf8String: [Getter],
    toUtf8Bytes: [Getter],
    toUtf8CodePoints: [Getter],
    toUtf8String: [Getter],
    Utf8ErrorFuncs: [Getter],
    formatBytes32String: [Getter],
    parseBytes32String: [Getter],
    dnsEncode: [Getter],
    hashMessage: [Getter],
    namehash: [Getter],
    isValidName: [Getter],
    id: [Getter],
    _TypedDataEncoder: [Getter],
    getAddress: [Getter],
    getIcapAddress: [Getter],
    getContractAddress: [Getter],
    getCreate2Address: [Getter],
    isAddress: [Getter],
    formatEther: [Getter],
    parseEther: [Getter],
    formatUnits: [Getter],
    parseUnits: [Getter],
    commify: [Getter],
    computeHmac: [Getter],
    keccak256: [Getter],
    ripemd160: [Getter],
    sha256: [Getter],
    sha512: [Getter],
    randomBytes: [Getter],
    shuffled: [Getter],
    solidityPack: [Getter],
    solidityKeccak256: [Getter],
    soliditySha256: [Getter],
    splitSignature: [Getter],
    joinSignature: [Getter],
    accessListify: [Getter],
    parseTransaction: [Getter],
    serializeTransaction: [Getter],
    TransactionTypes: [Getter],
    getJsonWalletAddress: [Getter],
    computeAddress: [Getter],
    recoverAddress: [Getter],
    computePublicKey: [Getter],
    recoverPublicKey: [Getter],
    verifyMessage: [Getter],
    verifyTypedData: [Getter],
    getAccountPath: [Getter],
    mnemonicToEntropy: [Getter],
    entropyToMnemonic: [Getter],
    isValidMnemonic: [Getter],
    mnemonicToSeed: [Getter],
    SupportedAlgorithm: [Getter],
    UnicodeNormalizationForm: [Getter],
    Utf8ErrorReason: [Getter],
    Indexed: [Getter]
  },
  wordlists: [Getter],
  version: [Getter],
  Wordlist: [Getter]
}
```
今日はここまで。