Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

Consolidate the three parallel SSZ stacks

オープン
#615 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
5/5
見積もり時間
1週間以上
初心者へのやさしさ
20/100
issue の種類
リファクタリング
明瞭さ
おおむね明確
活発さ
静か
技術スタック
rust

調査の方向性

まず crates/ssz/src/hasher.rs と既存の hasher テストを確認し、次に verify_hashes の golden-file コーパスを実行して、現在の Charon/fastssz の動作を確立します。crates/ssz/types.rs と crates/core/src/ssz_codec.rs を、一覧にある未テストのヘルパーおよび codec と併せて確認します。完了の条件は、互換性のある箇所でスタックがインターフェースと型を共有し、カバレッジに指定された境界が含まれ、Charon 固有の codec が文書化された例外として残っていることです。

索引モデルが issue の本文から書いたものです。

説明

enhancement rust

Summary

SSZ spans ~9,100 LOC across 22 files in three stacks that don't share types, hashing, or error handling:

  1. ethereum_ssz + tree_hash derives for consensus-spec containers (crates/eth2api/src/spec/, 3,498 LOC). Every container repeats a 5-derive line plus per-field #[serde_as] attributes — 93 derive lines, 155 Hex0x occurrences. ssz_types is not a dependency, so crates/ssz/types.rs reimplements SszList/SszVector/BitList/BitVector with 12 manual Encode/Decode/TreeHash impls (844 LOC).
  2. A hand-ported fastssz Hasher (crates/ssz/src/hasher.rs, 640 LOC) driving cluster/src/ssz.rs — 29 versioned free functions selected via function-pointer tables, plus an SSZError<H> that duplicates pluto_ssz::Error — and a second locally-declared SszHashable trait in app/src/obolapi/exit.rs#L30-L39.
  3. Hand-written byte-level codecs for Charon wire formats (core/src/ssz_codec.rs, 1,261 LOC), including deliberate deviations from what a derive would emit (documented in unsigneddata.rs: Charon emits an offset table even for fixed-size containers).

Consequences: two incompatible hash-tree-root paths, invisible semantic differences between types (some deliberately omit TreeHash and nothing flags it), and duplicated list/vector plumbing that upstream ssz_types already provides.

Proposed change

  • Before touching any stack: pin the current hasher against Charon/fastssz with golden-vector tests (known input → known 32-byte root, expected values captured from the Go side). The existing hasher.rs tests are self-consistency checks (manual-tree comparisons, bitlist guards) — nothing cross-implementation. Add binary round-trip tests for the zero-test codec helpers (encode.rs, decode.rs) at the same time; they are part of the surface being consolidated. Same for the crate's other untested seams: helpers.rs put_byte_list/put_bytes_n IncorrectListSize, serde_utils.rs ssz_list_u64_string_serde (string/int parse, MAX rejection, round-trip), the binary Encode/Decode bound checks of SszList/SszVector (only the JSON path is tested today), and the hasher's CountGreaterThanLimit and get_depth/next_power_of_two/calculate_limit boundaries.
  • Adopt ssz_types for List/Vector/Bitfield and delete most of crates/ssz/types.rs.
  • Merge the two hasher-side interfaces (SszHashable in obolapi vs the free-function tables in cluster) into one, e.g. a version-aware trait in pluto_ssz; collapse the duplicated error enum.
  • Keep the Charon wire-format codecs (ssz_codec.rs) as explicit, documented exceptions — they encode incompatibilities that derives cannot express.

Open question

The cluster config/definition/lock hashes must byte-match Charon's fastssz output. Before replacing the custom Hasher with tree_hash, prove equivalence on the existing fixture corpus (the verify_hashes golden files) — if fastssz semantics differ (they do for e.g. bitlist mixins and string hashing), the custom hasher stays and only the interface around it is consolidated.

主要言語
Rust
スター
8
フォーク
5
平均マージ
4日 18時間
マージ済み PR(30日)
4

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

NethermindEth/pluto のほかの issue

NethermindEth/pluto の issue をすべて見る

似ている issue

Rust の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。