はじめてのSolidityフレームワーク「MUD」

先日行われたETHGlobal主催の**Autonomous World**ハッカソン「**ETHGlobalAW**」でファイナリストに選ばれました！

https://twitter.com/yamapyblack/status/1662281247761256450?s=20

今回のハッカソンではじめてSolidityフレームワーク「**MUD**」を使いました。MUDは「Lattice」によって作られたAWに適したフレームワークですが、その用途は限定されておらず、DeFiなどにも利用可能です。

そもそもMUDって何？という方向けに、特徴を個人の感想を交えて書いていきます。

MUD: https://mud.dev/

注意：今回使ったMUD v2は公式サイトにもある通り、alpha versionです。開発中であるため、利用は個人の責任の元でお願いします。また、私はMUD初心者であり、本記事の内容の正当性に関しては保証できません。あくまでDYORでお願いします。


## MUDの魅力的な特徴

### 1. フロントエンド、バックエンド（スマートコントラクト）一体型フレームワーク

リポジトリを見てもらえればわかるのですが、ReactベースのフロントエンドとFoundryベースのバックエンドが存在します。パッケージマネージャはpnpmが使われています。

これまでのDapps開発はバック（スマコン）とフロントで別で行われることが多かった気がしますが、一体となっています。

このメリットは、ローカルでdevコマンド一発でスマコンのデプロイ＆画面立ち上げまでできることです。

例えば、スマコン側のfunction名を変更したとしましょう。その場合、フロント側は再デプロイされた新しいアドレスへの切り替えが必要でした。かつABIを取得してきて、反映させなければなりませんでした。

MUDの場合、デプロイした最新のアドレスとABIをフロントが読みにいけるので、常に最新のコントラクトの状態で画面からテストを行うことが可能になりました。

![Untitled presentation.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117960/033cc6fb-312c-eff1-4e5b-d27f3073291d.jpeg)

便利ですよね。

### 2. テーブル定義からコントラクトが自動生成
Configでテーブルのカラムを定義すると、自動でコントラクトが生成されます。以下のConfigをご覧ください。

```
tables: {
  MyTable: {
    schema: {
      foo: "uint256",
      bar: "bool",
    },
  },
}
```

これを書くだけでスマートコントラクトが自動生成されます。

スマートコントラクトは大きく分けて「Storage」と「Logic」の役割がありますが、MUDでは完全に2つが分離されています。うちStorageコントラクトは自動生成されるわけです。

RailsやLaravel(PHP)のmigrationをイメージすると理解しやすいでしょう。

この機能のメリットは、テーブル定義の見やすさだけでなく、getterをいちいち考えなくても良いという点も挙げられます。

例えば、ownerという変数があったら、
- address public owner　なのか
- function getOwner()　なのか
- event OwnerChanged　なのか

どうやって取得するのか、ちょっと迷いますよね。このあたりが自動生成されるので、気にしなくて良くなります。

フロントエンドからスマコンの値を取るfunctionが用意されているため、値の取り方を迷う必要がなくなります。


### 3. One World
MUDでコントラクトをデプロイすると、「**World**」という名前のコントラクトが生成されます。

実は、フロントエンドから実行すべきコントラクトはこの一つだけです。

通常のアプリケーションだと、コントラクトを大量にデプロイして、フロントエンドにそれらのアドレスを全部定義し、選んでtxを起こします。MUDではそれが一つだけです。

Systemと呼ばれるLogic用コントラクトを作ると、Interfaceが自動生成されます。

```
interface IIncrementSystem {
  function increment() external returns (uint32);
}
```

WorldのInterfaceであるIWorldを見ると、作ったSystemのInterfaceを全部継承しています。

```
interface IWorld is IIncrementSystem, IBaseWorld, IAddSystem, IClearSystem, IJoinSystem, IMapSystem {
}
```

全てのロジックはWorldを通して実行されることになります。

したがって、フロントが実行するコントラクトはWorldただひとつのみとなります。

### 4. Namespaceとアクセス制御

私はまだ使ったことがないのですが、Namespace（つまりディレクトリ）を切って、Storageへのアクセス制御を実現できるようです。アクセス制御とは「OnlyOwner」のようなやつです。

１つのWorldに複数のサービスを作ることが可能です。

```
root
|-- mudswap <- Namespace
    | Balance <- Table
    | Pool <- Table
    | Transfer <- System
|-- Tetris <- Namespace
    | Board <- Table
    | Move <- System
    | Drop <- System
    | Score <- Table
    | Win <- System
```

上記は１つのワールドにmudswapというアプリとTetrisというアプリを作った場合の例です。

### 5. Optimisticレンダリング

最後に挙げるのはOptimisticレンダリングというフロントエンドの機能です。

こちらをご覧ください。

![emojimon-intro (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117960/d10d0f66-fc48-f42c-4335-29a44ed719c0.gif)

MUDでゲームを作ると、画面描画を超高速に行うことができます。どう考えてもトランザクションのスピードよりも、キャラのスピードのほうが早いです。キャラの移動は全てオンチェーンに記録されているにも関わらず、です。

この仕組みはOptimisticレンダリングというものです。

以下のような流れで動作します。

- トランザクションを起こす
- キャラクターを移動させる（フロント）
- トランザクションの結果を取得する。もしエラーが発生した場合はキャラクターを元の位置に戻す

これはOptimistic Rollupと似ていますね。とりあえず楽観的にやって、もしエラーがあれば元に戻す感じです。

この機能を数行のコードで実装できるのが素晴らしいです。

ただし、もちろん戻すことでゲーム画面がバグったりするリスクは存在するので、使用するかどうかは利用シーンによるでしょう。

（あと、この動画はローカルか何かだから早いのだと思います）

## MUDの課題
ここまでいいことばかり書きましたが、ここからは課題を書きます。

### 1. 秘密鍵管理
MUDのチュートリアルでは、.envファイルに秘密鍵を書いています。これはNGですね。

メタマスクなどのウォレットからトランザクションを実行する形にもできますが、ゲームのように大量のトランザクションが発生する場合、UX上の問題が生じます。MUD用のウォレットが必要になるかもしれません。

AAの普及によりウォレットの開発が活発化しているので、この問題が早く解決されることを期待しましょう。

### 2. 既存コントラクトのインテグレーション
MUDは分厚いフレームワークであり、他のコントラクトを統合したい場合の具体的なイメージが思い浮かびません。ERC20やERC721を組み込むことはできると思いますが、既存のコントラクトを再利用して開発する場合、逆に余分な時間がかかる可能性があります。

MUDで作成したコントラクトの事例が多く存在することが望ましいです。

### 3. Audit、セキュリティ
Auditはどうするのでしょうか。自動生成部分は問題ないと思われますが、それ以外の部分については何らかのレビューまたはAuditが必要と考えます。AuditファームにもMUDの前提知識が必要になるかもしれません。

とはいえ、DeFiのハッキング件数の多さを考慮すると、スマコンフレームワークは必要だと私は考えています。MUDによってむしろセキュリティが強化されるといいですね。

## 結論
MUDはまだ未完成で、解決しなければならない課題も多いですが、とても期待できるフレームワークだと感じました。これを開発したLatticeチームは、相当な開発力があると思います。

また、MUDの登場を機に、他のスマコンフレームワークも現れると勝手に予想しています。

引き続きMUDおよびAW界隈の動向を注視していきたいと思います。

参考
Github: https://github.com/yamapyblack/AutonomousLifeGame
MUD公式: https://mud.dev/
イーサリアムnavi: https://ethereumnavi.com/2022/11/19/lattice-mud/
AW house: https://twitter.com/AW_house