---
# System prepended metadata

title: Rust について
tags: [Rust, Engeneering]

---

# 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
