Ganache-cliでEIP1559 Type 2 トランザクションを試す


# はじめに

現時点(2021/12/21)の[ganache-cli](https://github.com/trufflesuite/ganache)のstable versionでは、Type2のトランザクション(EIP-1559)がサポートされていないようです[^1]。

現時点ではベータ版のv7でType2のトランザクションがサポートされているようです。

本記事では、ganache-cliのv7ベータ版において、EIP-1559の特徴の1つである`max_priority_fee_per_gas`と`max_fee_per_gas`が、[MetaMask](https://metamask.io/)、Web3(javascript)で指定できることを確認します。



https://twitter.com/trufflesuite/status/1440397961150697480


[^1]: 例えば、Web3+MetaMaskで、トランザクションを発行しようとした際に`Invalid transaction params: params specify an EIP-1559 transaction but the current network does not support EIP-1559`のようなエラーに遭遇します。


# インストール&起動

## インストール

```
npm install ganache@beta
```

私の場合、ganache-cliはプロジェクト内にインストールしたいため上記のようにしました。

参考

https://github.com/trufflesuite/ganache/releases/tag/ganache%407.0.0-beta.2


## 起動

```
npx ganache-cli -d -p 7545
```

ログ（一部省略しています）

```
ganache v7.0.0-beta.1 (@ganache/cli: 0.1.1-beta.1, @ganache/core: 0.1.1-beta.1)
Starting RPC server

Available Accounts
==================
(0) 0x90 ..... (1000 ETH)
(1) 0xFF ..... (1000 ETH)
(2) 0x22 ..... (1000 ETH)
(3) 0xE1 ..... (1000 ETH)
(4) 0xd0 ..... (1000 ETH)
(5) .... 
(6) ....
(7) ....
(8) ....
(9) ....

Private Keys
==================
(0) 0x4 ....
(1) 0x6 ....
(2) .... 
(3) ....
(4) ....
(5) ....
(6) ....
(7) ....
(8) ....
(9) ....

HD Wallet
==================
Mnemonic:      myth .....
Base HD Path:  m/44'/60'/0'/0/{account_index}

Default Gas Price
==================
2000000000

BlockGas Limit
==================
12000000

Call Gas Limit
==================
9007199254740991

Chain Id
==================
1337

RPC Listening on 127.0.0.1:7545
```


### 引数について補足

 - `-d`は`--deterministic`の省略形で、起動毎にテスト用アドレスを変えたくないため、指定しています。
 - `-p`は`--port`の省略形で、JSPN-RPCのリクエストなどを受け付けるポート番号を指定します。デフォルトとは異なるポートを使用したかったため、指定しています。

参考

https://www.npmjs.com/package/ganache-cli/v/6.12.2

# 試す

## MetaMaskで送金

MetaMaskにNetworksの設定および、起動時のログをもとにアカウント×2を追加したのちETH
の送金を行います。この時`max_priority_fee_per_gas`と`max_fee_per_gas`が指定できることを確認します。

「send」
 ![metamask_1_b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338425/5d82811d-7a34-8a01-a0cf-fe34a6bba7e6.png)

 
適当に送金するETHの額を入力し、「Next」
![metamask_2_b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338425/fc2c2d8f-ddd9-9ed3-3c65-8ed7ae2301c9.png)


「Estimated gas fee」の部分の「EDIT」をクリック
![metamask_3_b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338425/e8023b1d-4799-a141-80ee-f4a00b12cdaa.png)

「Advanced Options」をクリック
![metamask_4_b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338425/c38c6bf8-691f-58f9-b628-f2acbe86e278.png)

「Max priority free」と「Max fee」が指定できます。このまま「Save」、「Confirm」すれば送金のトランザクションが発行されます。
![metamask_5_b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338425/b2481a75-09a0-1c43-7809-c7dcfc9463cd.png)

![metamask_6_b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338425/393d283d-d561-5405-a3b4-19fa98fb4f24.png)

 
# Web3(javascript)で送金

やっていることは上記のMetaMaskの例と同じですが、一応web3.jsのAPIでも試してみます。

簡易的なWebアプリケーションを作って試します。

トランザクションを発行している部分のソースコードは以下です(→[全ソースコード](https://github.com/st-user/learning-dapps/tree/main/simple-eip1559-test))。

``` javascript

    const ethToSendInWei = web3.utils.toWei(eth, 'ether');
    const maxFeePerGasInWei = web3.utils.toWei(maxFeePerGas, "gwei");
    const maxPriorityFeePerGasInWei = web3.utils.toWei(maxPriorityFeePerGas, "gwei");
  
    const receipt = await web3.eth.sendTransaction({
      from: accounts[0], 
      to: toAddress,
      value: ethToSendInWei,
      type: "0x2",
      gas, 
      maxFeePerGas: maxFeePerGasInWei, 
      maxPriorityFeePerGas: maxPriorityFeePerGasInWei
    });

```

参考

https://web3js.readthedocs.io/en/v1.5.2/web3-eth.html#id85


MetaMask上のアカウントとサイトが接続された状態で「send」
![web3app_1_b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338425/9ef16c99-66a0-e821-2b4a-39a0c53badd7.png)

「Estimated gas fee」の部分の「EDIT」をクリック
![web3app_2_b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338425/1be1d0a4-9cfd-441c-206c-b85bd675bb28.png)

「Edit suggested gas fee」をクリック
![web3app_3_b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338425/324394ae-fe9a-b986-2255-3d5c744d5a99.png)

「Max priority free」と「Max fee」が指定できます。ここには、Webアプリケーション(javascript)で指定した`maxPriorityFeePerGas`、`maxFeePerGas`の値が表示されています。このまま「Save」、「Confirm」すれば送金のトランザクションが発行されます。
![web3app_4_b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338425/ec32da2c-87cb-2502-c47f-948f5bf5199d.png)


![web3app_5_b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338425/f55357d0-014a-de1d-74c4-4ad29d7cfe97.png)




# その他参考

 - [GAS AND FEES - ethereum.org](https://ethereum.org/en/developers/docs/gas/)
 - [MetaMask 1559 - metamask.io](https://metamask.io/1559)