Manifest Format
まだ誰も着手していません。
評価
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 初心者へのやさしさ
- 20/100
- issue の種類
- 機能追加
- 明瞭さ
- 説明が足りない
- 活発さ
- 停滞
- 技術スタック
- rust
- 領域
- cli, cryptography, security
調査の方向性
実装ファイル、テスト、エントリポイントのいずれも特定されていません。まずマニフェストの要件と、CBOR、MessagePack、BLAKE3、flat/tree、release-layout に関して提案されている選択肢を確認してください。これらの選択肢が、定義済みのマニフェスト仕様と実装計画に整理された時点で、設計は完了です。
索引モデルが issue の本文から書いたものです。
説明
Many features are gated on the basic design of the Intermodal manifest. So let's get started on it right away.
Desiderata
-
Allow integrity checking. Given a manifest, an accompanying release can be checked for integrity using the manifest. This will require including secure hashes of accompanying files in the manifest.
-
Hashing the manifest should give a secure hash that uniquely identifies the contents of the release.
-
Multi-level manifest. A lower-level manifest should commit to the contents of a release. A higher -level manifest should commit to both the lower level manifest, as well as any files containing signatures over the lower level manifest. It would be nice to only have one manifest, but since data can't self-sign or contain hashes to itself, it seems necessary to have at least a two-level manifest so that we can produce a hash that uniquely identifies a collection of files, as well as signatures and other commitments to that collection of files.
I'm thinking about calling the lower-level manifest the "content manifest" and the lower-level "bundle manifest". I'm definitely open to naming suggestions though. Other ideas are "file manifest" and "root manifest".
Why not use BitTorrent metainfo?
-
BitTorrent v1 uses SHA1, which is insecure.
-
BitTorrent v2 uses a custom tree hash that is vulnerable to attack if the length of the content is not included.
-
Bencoding is not a particularly popular encoding format.
Why not use the web packaging format?
The web bundle format is a single-file format, so it would be impossible to use natively with BitTorrent, which is an important transport.
Out of Scope
To keep things simple, it would be a good idea to limit the scope of the initial manifest design as much as possible. Things that we should consider for the design, but not worry about the details:
-
Metadata. Structured metadata can be included in a file that the content manifest commits to.
-
Signatures, timestamps, and related functionality. A two-level manifest leaves open the ability to include files that are signatures over the hash of the content manifest, which are committed to by the bundle manifest.
In scope
-
Manifest format. I'm thinking either CBOR or messagepack. They are both lightweight, binary, schemaless formats with an object model that is similar to JSON. The web packaging format uses CBOR, so that's what I'm leaning towards. Keybase's saltpack, however, uses messagepack, so that's a contender too.
-
The hash function. Since manifests will have to include secure hashes, we should pick a hash function. I'm leaning towards BLAKE3, although someone could probably talk me out of it. BLAKE3 is extremely fast, supports random access and streaming verification, and has a strong rust implementation, all of which are nice features. On the downside, it is very new, and uses a reduced strength construction. However, that reduced strength is argued to not be vulnerable now or in the future.
-
Whether the manifest should be flat or a tree. Nested will be more compact when there are long directory names with many entires, but is more complex. Nested doesn't explicitly encode path separators, which I think is a bonus.
flat: {"foo/bar": "BAR_HASH", "foo/baz": "BAZ_HASH"} tree: {foo: {bar: "BAR_HASH", baz: "BAZ_HASH"}}BitTorrent V2 uses a tree, so that's what I'm leaning towards.
-
Where to put the manifest in a release. Since it seems likely that we'll eventually want multiple files, I'm thinking that putting everything into a subdirectory is a good idea, either
imdl/orintermodal/.For example, if we go with CBOR, the structure could be:
intermodal/root.cbor # root manifest intermodal/content.cbor # content manifest intermodal/signatures # signatures over hash of content.manifest intermodal/timestamp.ots # open timestamps timestamp intermodal/metadata.cbor # metadata intermodal/README.txt # human readable info about intermodal
Postscript
A very weird but nonetheless interesting choice of format would be FIDL, Fuchsia's IPC system:
- Modular compiler and language bindings.
- Message encoding is canonical — there is exactly one encoding for a given message.
- Supports both fixed-size messages where space is important, and extensible tables and unions where schema evolution is important.
- Defined to be little endian and uses natural alignment, so no portability issues.
- Zero copy and zero parse, by storing variable sized members out-of-line. Can be memory mapped with LMDB or mmap(2) for extremely fast access.
- Certain types can be introspected without access to a schema, namely tables and unions.
- Could make it fully introspectable where needed by including hash of schema as first element of messages.
Another less wacky choice would be flatbuffers. Flatbuffers also support zero copy and zero parse deserialization.
Misc
- Would like to compare the encoding choices of flatbuffer and FIDL.
- Would like to add some kind of
linkattribute, that would indirect through a hash. - Unsure of how to approach "canonical encoding". Forcing the format to output a buffer in a canonical format is inflexible. A more flexible approach would be to calculate hashes over logical traversals of the physical data, so the physical data may be in multiple forms, but hash to the same value, as long as the traversal doesn't change.
- Flatbuffers binary format documentation
- fleetfs flatbuffers schema
- proc macro attribute parser
- syn helper
- 主要言語
- Rust
- スター
- 661
- フォーク
- 36
- PR マージ指標
- 30日以内にマージされた PR はありません
環境構築
- Dockerfile または Docker Compose ファイルあり
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
casey/intermodal のほかの issue
-
documentation
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
casey/intermodal#453 ·
-
Retracker commandオープン
難易度 4/5 3〜5日 初心者へのやさしさ 55/100
casey/intermodal#564 ·
-
難易度 3/5 1〜2日 初心者へのやさしさ 35/100
casey/intermodal#559 ·
-
難易度 3/5 1〜2日 初心者へのやさしさ 30/100
casey/intermodal#538 · コメント 6 件 ·
-
難易度 5/5 1週間以上 初心者へのやさしさ 35/100
casey/intermodal#535 ·
casey/intermodal の issue をすべて見る
似ている issue
-
api bug entity mobai
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
Pumpkin-MC/Pumpkin#4312 ·
メンテナーはふだん 1 日以内に返信
-
bug easy good first issue
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
lacs-project/sysknife#659 ·
メンテナーはふだん 2 日以内に返信
-
E_FIT_INPUT_MISSING (mixture overrides): the message says ferx-r bundles lack mixture_overridesオープンP3
難易度 1/5 1時間未満 初心者へのやさしさ 83/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
-
documentation
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
registrystack/registry-stack#2431 ·
メンテナーはふだん 1 日以内に返信