# Rust について ###### tags: `Engeneering` `Rust` ## version 常に最新の nightly を使用。 ## 非同期 Tokio: https://github.com/tokio-rs/tokio https://zenn.dev/magurotuna/books/tokio-tutorial-ja ## Like Clean Archtecture https://github.com/intmax-rollup/intmax 一般的なオブジェクト指向言語でのクリーンアーキテクチャは、抽象型やスーパークラスやインターフェイスを使って依存性注入を実装するが Rust ではジェネリックで依存性注入を実装する。 Rust でオブジェクト指向はしない方がいいです。 **Rust の外部依存性ライブラリのほとんどが、それを使う trait を使って具体的な実装を書いていく仕様なので `infra` を外だしするのは無理っぽい。**(頑張れば出来るが頑張りたくないし、多分あまり頑張らなくていい。) **外部ツールを注入するというより、外部ツールに注入するやり方が Rust っぽい。** core -> primitives -> infra の依存関係が良さそう。 ``` . ├── Cargo.lock ├── Cargo.toml ├── README.md ├── cli │ └── node ├── core │ ├── commiter │ ├── executor │ ├── exitor │ ├── query-receiver │ ├── su-receiver │ └── tx-receiver ├── infra │ └── json-rpc ├── primitives │ ├── db │ ├── verkle │ └── zk └── target ``` ### `cli` 実行可能なバイナリを吐く場所。 Tool や node など。 ### `core` 業務ドメインレベルの実装。primitives にあるロジックを呼び出してシナリオを実装する。 #### 例: - commiter - L1 へのコミットを行う - executor - トランザクションの実行を行う - exitor - ユーザの Exit を定期的にまとめて行う - query-receiver - クエリを受け取って、結果をユーザに返す - su-receiver - StateUpdate を受け取って、State を反映させ結果を返す - tx-receiver - Transaction を受け取って、stateless検証して tx-pool に投げる ### `primitives` `core` から参照して使うための primitive なライブラリ。 `infra` にある外部ツールに注入して使う場合も多々ある。 - db - データベースの読み書き - verkle - VerkleTree - zk - zk の検証や proof 生成 - rpc - rpc エンドポイントの送受信 - dht - 分散ハッシュテーブルの読み書き ### `infra` 外部ツールを使って、このプロジェクトで使う用の trait などを実装したもの。 一般に primitives でこの具体実装を行う。 #### 例 - SQLite - db で具象 - JSON-RPC - rpc で具象 - Filecoin - dht で具象 - zkEVM - zk で具象 微参考: https://blog.foresta.me/posts/rust-layered-architecture/ ## 論点 ### no_std を使う? https://tomoyuki-nakabayashi.github.io/book/intro/no-std.html オペレータの実行環境の自由度による #### メリット どこでも実行可能になる。特にラズパイとかがいい例。 #### デメリット no_std 未対応のライブラリが使えなくなる。 (Rust が界隈的に no_std 信仰があるので大丈夫寄りだと思われるが) ## 参考になるレポジトリ ### https://github.com/BurntSushi の Rust コード全般 - https://github.com/rust-lang/regex - https://github.com/BurntSushi/ripgrep ### みんな大好き Substrate https://github.com/paritytech/substrate ### zkSync https://github.com/matter-labs/zksync