ERC 4337: account abstractionとは何か_勉強会資料


# はじめに

先週、ERC4337: account abstraction (AA)がmainnetにdeployされたことで、
ERC-4337トークン標準が利用可能となりました。
ETHDenverで開催されたWalletConで、Ethereum FoundationのYoav Weiss氏によって発表されました。

https://twitter.com/erc4337/status/1631087958949531648

“The next billion users are not going to write 12 words on a piece of paper. Normal people don’t do that” (次の 10 億人のユーザーは、1 枚の紙に 12 語を書くことはありません。普通の人はそんなことはしません)

と述べられたように、「アカウントの抽象化」や「スマートアカウント」とも呼ばれるテクノロジーによって標準のスマートフォンのセキュリティモジュールに固有の暗号化キーを入れることで、複雑なシードフレーズを記録する必要がなくなります。

https://blog.openzeppelin.com/eth-foundation-account-abstraction-audit/

これまでも、秘密鍵の流出によって資産が失われるなどの被害が起きてきましたが、これらの応用によって、FIDOなどの生体認証ベースの認証技術と連携させた2要素認証 (2FA) や
信頼できるグループ内のソーシャルリカバリなどへの応用が期待されています。

# EOAとAA

https://www.youtube.com/watch?v=eyT6WzJmWyc

AA は Ethereum デベロッパーの長年の夢であり、Vitalik氏が2016年頃から実現に向けて取り組んできました。
https://notes.ethereum.org/@vbuterin/account_abstraction_roadmap
コントラクトをdeployしてみると、すぐに理解できますが、Ethereum のアカウントは下記のように2種類存在します。


名前|詳細
---|---
EOA|外部所有アカウント、Metamaskなどで作ったアカウント
CA |ContractAccount、Contractをdeployすることで作成されたAccount。PKはない。

Ethereumにおいてトランザクションの起点となれるのはEOAのみとなっていますが、理由は、「トランザクションは、EOA による ECDSA 電子署名を基準にした検証をパスしないとブロックに含めることができない」とプロトコルとして規定されているからです
署名方式はECDSAで、楕円曲線はspec256k1のみで回避することはできません。

AAは、Account abstraction (AA) allows a contract to be the top-level account that pays fees and starts transaction execution.
と定義されていますが、「コントラクトを最上位アカウント（トランザクションの起点、つまり手数料を支払うことができるアカウント）にすること」 です。

# Abstraction(抽象化)という名前の所以(ゆえん）とEntory Point Contract


今回の変更の実態はあくまで、コントラクトの追加であり、プロトコル自体が変わるわけではないので、ECDSAは残り続けています。

ERC-4337 ( Account Abstraction via Entry Point Contract specification ) は、エントリ ポイント コントラクト(https://etherscan.io/address/0x0576a174D229E3cFA37253523E645A78A0C91B57#code
)　を使用することで、Ethereum自体のprotocolを変更せず実現することを目的とした仕様となります。アップグレード自体は、スマートコントラクトの追加によって行われており、
https://notes.ethereum.org/@vbuterin/account_abstraction_roadmap#Transaction-inclusion-lists
全てのEVM互換のある場所であればどこからでも利用できるようになっています。

ではどのようにして、トランザクションの身元を確認するのかというと、
具体的な検証や処理はEntryPointContractというコントラクトが行うことになっています。

1.UserがUserOperationを作成する

詳細はこちら... >　コントラクトWalletや署名などが含まれている

2.BundlerがUserOperationを束ねる

3.BundlerがUserOperationをトランザクションにする

4.トランザクションがEntryPointのコントラクトを経由してblockに入る

![スクリーンショット 2023-03-03 14.19.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/54086e27-b7eb-803e-3ef7-4aa690d6b78f.png)

引用元　https://notes.ethereum.org/@vbuterin/account_abstraction_roadmap

https://www.youtube.com/watch?v=Ob1s_w01HT8


# 実装を試してみる

EIPの実装自体はこちらのリポジトリにあります
https://github.com/eth-infinitism/account-abstraction



AAを実装するにおいて、stackupというSDKが使いやすいようなので、こちらを試してみました。
https://www.stackup.sh/pricing

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/3f9e43e9-eb67-0f13-b40a-861707418211.png)


```
git clone git@github.com:stackup-wallet/erc-4337-examples.git

yarn install

//config.jsonが作成される
yarn run init
```



![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/d58f9bda-de34-09f6-24ef-da9c4a983bc3.png)

BunderURLにコピーする
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/5ad85532-4a37-0021-d0be-e693ac9f1c11.png)

```
//アドレスを取得する
yarn run simpleAccount:address
```



# Conclusion