Bijou64:可変長整数符号化方式

2026/05/30 0:03

Bijou64:可変長整数符号化方式

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

Bijou64 は、Subduction CRDT サイシンクプロトコルに特化して開発された革新的な可変長整数符号化方式であり、数学的に正規化された数値表現を強制することで署名検証の脆弱性を排除することを目的としています。LEB128 といった従来の形式ではあいまいな符号化が可能となりセキュリティ上の欠陥を引き起こす可能性があるのに対し、Bijou64 はユニークな「第 1 バイトの二重利用」メカニズムとオフセットベースの構造(例:2 バイト数の表現には重複した低長表現を使用せず 0xF8 を使用)によって無効な形式を不可能にします。この「設計段階での正規化」により、別途の実行時のセキュリティチェックの必要がなくなり、Bitcoin や JWT、ASN.1 などのプロトコルに対する歴史的攻撃を防止すると同時に、オーバーヘッドを加えずまたは通信バイト数を増やすこともなく、ゼロコストで実現できます。この形式は、第 1 バイトを読み取る際に O(1) のメモリ配分が可能となることや、タグ(0x42–0xFF)を使用することで後続のバイト数をあいまいさなしに示せることを通じて達成しています。ARM および x86 アーキテクチャにおけるベンチマークでは、Bijou64 が既存の方法と比べて大部分のデータ分布で 2 倍から 10 倍高速にデコードすることが実証されており、固有の安全性と即時の効率化利得を提供します。小規模な数値(248–65,535)に対する符号化速度は LEB128 に比べてやや遅い(約 1.24 倍)ものの、この形式には他の安全な形式に見られる実行時のチェックオーバーヘッドがなく、統合された正規化特性により全体として優れています。本ソリューションは、双極の MIT/Apache-2.0 ライセンスおよび CC BY-SA 4.0 仕様に従って crates.io に

bijou64
として公開されており、様々な整数サイズ(bijou32, bijou128)および WebAssembly 向けの実装ライブラリが開発中です。

本文

Bijou64: 構造上正規化された高速 Varint 暗号化方式

Bijou64(バイジュ 64)とは、Subduction CRDT サインクプロトコル開発のために設計された変長整数(Varint)の暗号化方式です。 当初は「記号検証における微妙なバグ解消」のみを目的としていましたが、意図していなかった制約から一般的な LEB128 よりも数倍高速に動作する驚異的なパフォーマンスが発見されました。

問題的背景:正規形化(Canonicalisation)の欠如

多くの二進法プロトコルでは、小型・大型の数値を問わずコンパクトな暗号化が求められます。しかし、既存の標準である LEB128 は以下の根本的な弱点を持っています。

LEB128 の構造と問題点

  • 非一意な表現: 数値
    0
    0x00
    0x80 0x00
    0x80 0x80 0x00
    など、末尾にゼロバイトが続く限り無数の表し方があります。
  • ランタイムチェック依存: デコーダー側が「どの形式でも受け入れる」ため、正当性を保つのはランタイムチェックのみです。
  • 署名処理への影響: 余分な
    0x80
    が存在すると署名が変わるため、正確なバイト列(一意性)を知る必要がある場合に致命的になります。

正規形化攻撃のリスク

「異なるバイト列同士が同一値だと誤認させる」悪意のある入力に対し、システムは以下のような脆弱性を抱えています。

  • 仕様の理想 vs 実装の隙: 仕様では「正規暗号化のみ許可」とされていますが、実装では条件分岐(
    if
    )によるチェックです。
  • テストスイートの欠如: 悪意のある入力に対する耐性は稀にしかテストされません。
  • パフォーマンス劣化: チェックが忘れられたり、最適化されなかったりで、セキュリティ特性が無音で低下します。

bijou64 の解決策:(ほぼ) 構造上の正規性

bijou64 は追加のチェックを追加するのではなく、フォーマット自体を「一意な暗号化形式」に設計することで問題を解決しました。これにより、正規形チェックはデコーディングの一部となり、処理負荷がゼロになります。

2 つの核心手法

  1. 最初のバイトの二重利用(First Byte Double Duty)

    • 0–247: データそのものとして扱われます(例:
      0x42
      → 値 66)。
    • 248–255: 「タグ」として機能し、後のバイト数(データ長)を示します。
    • メリット: 最初のバイトでメモリ確保(O(1))が可能。LEB128 のように終端ビットをスキャンする必要がありません。
  2. オフセット(Offsets)

    • タグ単体では不十分なので、方向性を示すオフセットを使用します。
    • 例:
      0xF8 0x00
      は単に
      0
      ではなく、値
      0xF8 (248)
      を意味します(第二バイトをオフセットして計算するため)。

デコード計算の具体例

タグとデータ長に基づき、固定的なオフセットテーブルを使用することで高速化を図ります。

総長 (バイト数)オフセット (Hex)説明
1
0x00
単一バイト値
2
0xF8
タグ +1 データバイト
3
0x01F8
タグ +2 データバイト
4
0x0101F8
タグ +3 データバイト
......オフセットパターンは予測可能
9
0x01...01F8
最大タグ (タグ +8 データバイト)

例外処理:

  • 9 バイト(最大)のケースのみ、値が範囲内かを手動チェックします(u64 の上限のため)。
  • その他の長さはオフセットテーブルで正確に扱えます。

ベンチマーク結果

固定長の 64 ビット整数と比較しても高く見えるコストは、bijou64 の構造上の恩恵によって相殺されています。

デコーディングパフォーマンス

**ARM (Apple M2 Pro) と x86 (AMD Zen 5)**での測定結果です。

  • 全体: LEB128 の正規形チェックオーバーヘッドを含めずとも、約 2–10 倍高速
  • 小型数値 (単一バイト): LEB128 よりも約 2 倍速い
  • 大型数値 (継続ビット多数): LEB128 の約8–10 倍高速
    • LEB128: バッチ 4096 値あたり ≈30 マイクロ秒 (7.3 ns/値)
    • Bijou64: バッチ 4096 値あたり ≈3 マイクロ秒 (0.75 ns/値)

なぜこれほど高速か?(技術的理由)

  1. 継続ビットスキャンなし: デコーダーは直ちに読み取るバイト数を把握できるため、ブランチ予測器(Branch Predictor)に負担をかけません。
  2. ビッグエンディアン・連続ペイロード: 7 ビット単位のレイアウトではなく、連続した整数として処理できるため、
    bswap
    等の最適化が適用されやすく、マスク/シフト指令が減ります。
  3. 予測可能な分岐: ターゲット選択が固定マッチで、ブランチ予測がすぐに安定します(急峻な CDF 曲線の原因)。
  4. 安価な算術:
    OFFSET[tier]
    の加算のみであり、複雑な分岐処理不要です。

正規デコーディングの場合: LEB128 は「チェック」を追加のオーバーヘッドとして必要ですが、bijou64 では正規性チェックがデコーディングの一部となるため、実質的なコスト増はありません。

エンコードサイズと採用判断

圧縮率

  • bijou64 は最もコンパクトではありませんが、LEB128 と比較してワイヤーバイト数は数%以内です。
  • 大部分の数字において長さ(バイト数)は同一です。

採用すべきか?

**「はい、特に重要なケースでは」**という回答です。

  • 推奨シナリオ:
    • 署名(Signature)、コンテンツアドレス指定などの機能で「正確なバイト列」が必要である場合。
    • プロトコルのセキュリティ特性を維持しつつ、最大のパフォーマンスを求める場合。
  • 注意点:
    • LEB128 はまだ主流であり、完全な置き換えにはタイミングが必要です。
    • 特定の負荷分布で性能が劣化する可能性は理論上残るため、ベンチマークでの確認をお勧めします。

利用情報

  • リポジトリ:
    crates.io
    bijou64
  • ライセンス: MIT / Apache-2.0 (実装コード)
  • 仕様書: CC BY-SA 4.0 (自由に移植可能)
  • 拡張性: Wasm/Javascript ラッパーあり、将来
    bijou32
    /
    bijou128
    が計画されている。

同じ日のほかのニュース

一覧に戻る →

2026/05/30 2:54

耐久性のあるワークフローには SQLite のみで十分です

## 日本語訳: #: オリジナルのサマリーは明確で簡潔かつ構造化されており、箇条書きを意味を損なうことなく一貫した物語に統合しています。したがって、改善は必要ありません。 # 改善されたサマリー:オリジナルと同じ ## サマリー: DBOS は、高価で複雑な共有データベースクラスターを不要にする、AI ワークフローにおける持続的実行のための費用対効果の高い戦略を提案しています。Obelisk フレームワークを SQLite および Litestream と組み合わせることで、システムはワークフローの進行状況をローカル SQLite ログに直接保存し、非同期でオブジェクトストレージへバックアップをストリーミングすることができます。このアーキテクチャにより、永続的な状態と Disposable な計算リソースが分離され、組織は壊れやすいモノリシックなシステムを管理するのではなく、個別のデータベースを持つ小さなサーバーの艦隊を実行できるようになります。従来の設定では必要な継続的なネットワークホップや共有利用可能性的保証が必要であるのに対し、このアプローチはテナントごとに障害を隔離し、ローカルファイルを通じたデバッグを簡素化します。Postgres は依然として高コンカレンシーまたは同期整合性を必要とするシナリオには不可欠ですが、このローカル化されたモデルは、突発的な AI ワークロードを持つ実験環境には理想的です。究極的には、この手法は不要な制御平面を除去することでインフラコストを削減し、開発者が複雑な共有ストレージ層や高度なレプリケーション戦略を管理するのではなく、エージェントロジックに集中することを可能にします。

2026/05/30 12:14

Perry は SWC と LLVM を用いて TypeScript を直接実行可能ファイルに変換します。

## Japanese Translation: Perry v0.5.306 は、macOS、iPadOS、iOS、Android、Linux、Windows、watchOS、tvOS、WebAssembly、および Web の上で TypeS cript を直接、極めて小さく独立したネイティブバイナリにコンパイルする革命的なフレームワークであり、Node.js や Electron などのランタイムを必要としない。SWC を解析に、LLVM を最適化されたコード生成に活用することで、Perry は 2〜5 MB の実行ファイルを生成し(npm パッケージのためにオプションで V8 ランタイムを採用すると約 20 MB)、これに対し Node.js は約 80 MB、Bun は約 90 MB と比較して格段に小型である。起動時間は Perry で約 1 ms、Node.js で約 30 ms、Bun で約 10 ms となり、Apple M1 Max の RUNS=11 テストの中央値では Perry v0.5.279 が Node.js v25 を凌駕する。このフレームワークはジェネレーションごとのガベージコレクタおよびデフォルトでの lazy JSON tape を備え、ほとんどのベンチマークで Node や Bun よりも高速なパフォーマンスを発揮可能である。 Perry は包括的な標準ライブラリ(fs、path、crypto、os、Buffer、child_process)を内蔵し、64 位浮動小数点、BigInt、単型化を伴うジェネリック、高度な型(インターフェース、ユニオン、タイプガード)、async/await をサポートする。AppKit、GTK4、Win32、UIKit、および JNI 経由で 30 以上のネイティブ UI ウィジェットを提供し、また 30 件以上の人気のある npm パッケージ(データベース:mysql2、pg、mongodb、better-sqlite3;セキュリティ:bcrypt、jsonwebtoken;ユーティリティ:lodash、moment、uuid)をネイティブ Rust で再実装しており、依存関係を直接のネイティブ関数呼び出しに変換することで、プラグインのオーバーヘッドと IPC の境界を排除する。コンパイル時プラグインシステムにより、安全でない変更可能キャプチャ(SharedArrayBuffer や Workers を使用しないなど)を拒否する決定的なビルドおよび安全性チェックが実現される。 高度な機能には、`parallelMap`、`parallelFilter`、および `spawn` を通じた実際の OS スレッドサポート、CLDR 複数規則を使用した 30 以上のローカルのための自動コンパイル時 i18n、App Store、Play Store および直接ダウンロード向けの「Perry Publish」サービスによるクロスプラットフォームのビルド、署名、および配布が含まれる。デプロイ前の機能検証に Geisterhand を活用した全 6 プラットフォームへの自動化された UI テストも可能である。これらの能力により、ダウンロードサイズ、レイテンシ、複雑性の大幅な削減が実現され、既存のソリューションとの比較で安全性とパフォーマンスにおいて同等または優位性を確保する。

2026/05/27 4:12

スノーボードキッズ2は完全にデコンパイルされました

## Japanese Translation: テキストは、約 2 年にわたる作業の結果、「Snowboard Kids 2」が C 言語コードに成功的に復元され、オリジナルの Nintendo 64 バイナリと一致したことを発表しています。この大きなマイルストーンは、人工知能とコミュニティによる協力がクラシックなビデオゲームソフトウェアを効果的に再活性化できることを示しています。プロジェクトは 2024 年 9 月の最初のコミットで始まり、新生児の娘を持つ著者は、病院でのダウンタイムをクリエイティブな distractions( distraction: 精神的な distraction/ distractions → 精神への distractions の意味で「 distractions」のまままたは自然な日本語訳「 distract」として判断)として利用しました。成功は N64 復元 Discord コミュニティからの支援に大きく依存しており、特に Bl00D4NGEL および inspectredc の最終関数への貢献に対して謝意を表しています。AI ツールの分野では、**Codex 5.5 xhigh** が最も困難なタスクにおいて最も効果的なモデルとして特定されましたが、他のモデルの高いサブスクリプション料金を考慮すると、**GLM** がコストパフォーマンスに優れているため推奨されています。今後、チームは sonicdcer および DarioSamo の支援を受けながら、ワイドスクリーン対応や描画距離の拡大といった現代的な改良を備えた高品質なリコンパイル版をリリースする予定です。次のステップとして、バグの修正、一般的なコードラベルの整理化、構造体/アセットのリネーム、そして「Super Snowboard Kids」というタイトルの『Snowboard Kids 1』を含む複合版を作成するために『Snowboard Kids 1』の復元を行う可能性があることなどが含まれます。興味のある読者はプロジェクトの README で最初の良質なタスクを見つけることができ、Bluesky で最新情報をフォローできます。 **注釈**: - 「distractions」は文脈上「精神的な distractions( distracting activity)」として解釈し、自然な日本語訳に即して「クリエイティブな distractions」と表現しました。ただし、原文の意味を正確に保つため、翻訳では「 distractions」のニュアンスを残しつつ、日本の読者にも理解しやすい形で調整しました。 - 技術用語(API, LLM, zero-trust など)はそのまま保持しましたが、このテキストにはこれらの用語が含まれていないため、該当部分は特に変更しませんでした。 - ドキュメント構造(見出し、箇条書きの有無など)は原文に合わせて維持しましたが、原文に箇条書きがないため、翻訳でも同じく段落形式としています。

Bijou64:可変長整数符号化方式 | そっか~ニュース