週次オープンソース:libwallet のラストマイル、OxideAV のドキュメントスタック
二本柱の週になった。libwallet は go-live の手前 0.1% を詰める作業、 OxideAV は長期ビジョンに向けた構成要素を増やす作業。
libwallet:ラストマイル
libwallet はもう 99.9% できている。いま入っている修正は、実際に本物のチェーンに 向けて wallet を使っていないと見つからない種類のもので、机上で 設計した新機能ではなく、現場で出てくるエッジケースだ。1 週間で v0.4.5 から v0.4.15 まで上がった。
いちばん手が入ったのは Bitcoin まわり:
- 直前の tx がまだ伝播中でも、連続送信でダブルスペンドしないよう にするためのインメモリ UTXO トラッカ。
- コイン選択の前に「すでに使った txo」を除外(使用済みの出力を 選んでしまうフローがあった)。
- 未署名の Bitcoin 送金のドライラン(
wlttx/simulate)。UI 側で 「これだとどれくらいかかる?」を、署名を求める前に見せるための もの。 Account:listUTXOs+ Dart 側のutxosフィールドで手動 UTXO 選択ができるように。入力ごとの vsize 計算も正しく。- 受信だけでなく
m/0とm/1の両方の派生ブランチから使える ように。xpub のクエリはmodchain_lookupTxoBIP32経由に統一。
EVM — SignAndSend が自動で検証を回すようになり、fees /
nonce / gas を呼び出し側が事前に正しい形で埋めなくても、
ちゃんと収まるようになった。
Account — Account:addressFormats で多形式のアドレスピッカー
(legacy / segwit / native segwit / taproot ほか)を公開。
FindAccount は入力がインデックス済みのレコードと一致しなかった
場合、現在のネットワークから派生したアドレスにフォールバックする
ように。
これらに共通するパターンは「新しい抽象を増やしたわけではなく、 本物のユーザがぶつかる境目で正しい挙動を入れた」ということ。
OxideAV:長期ビジョン
OxideAV の目指すところは、ffmpeg と ImageMagick を 1 つの ピュア Rust プロセスに統合し、信用できない入力にも安全に走らせ られるようにすること。
両方を 1 つのプロジェクトでカバーする理屈は、人間工学の話ではなく 技術的なもの。最近の画像フォーマットは、要するに「動画コーデック を 1 フレームに使ったもの」になっている。WebP は VP8 のイントラ フレームを RIFF で包んだもの。HEIC / HEIF は HEVC のイントラを ISOBMFF に入れたもの。AVIF は AV1 のイントラを同じ要領で。 「画像」と「動画」の距離は、片方を ImageMagick、もう片方を ffmpeg に分けて扱う合理性が薄れるところまで縮んでしまった。それぞれが 何十年分の CVE と C 依存を抱えていることを思い出すと、なおさら。
既存ユースケースを呑み込むだけでなく、OxideAV はどちらの既存 プロジェクトもまだ得意としていない領域も狙っている。ベクター PDF → ベクター SVG 変換——パスやグラデーションをラスタに潰さず、 パスとグラデーションのままラウンドトリップさせるやつ——はその 一例。同じ方向にもう少しある。
それが目標。今日時点での OxideAV はまだ使える状態ではない—— 全クレートが v0.0.x / v0.1.x で、複数年かけて作るタイプの長期 プロジェクトの、回収はずっと先のフェーズ。
今週入った進捗を領域ごとに:
ドキュメントスタック
W17 の scene モデル は PDF / ライブ配信 / NLE のために scaffold だけ用意した状態で、 中身となる構成要素がなかった。今週それが入った:
- oxideav-ttf — TrueType パーサ。COLR/CPAL のベクターカラー絵文字レイヤースタック (v0 + v1)、Apple 風 sbix の PNG/JPEG ビットマップカラーグリフ、 TTC コレクションのサブフォントまで。
- oxideav-otf — OpenType / CFF パーサ(sfnt + CFF + Type 2 charstrings、 キュービックベジェのアウトライン)。
- oxideav-scribe — フォントラスタライザ+シェイパ+レイアウト。週中でベクター 専用にリファクタした。ピクセルパイプラインは捨てた——ドキュ メントスタックの他の層は最後までベクターで持ちたいから。
- oxideav-raster — ベクター→ラスタの描画カーネル。Lanczos2(4×4 windowed sinc)の 画像リサンプリング。
- oxideav-pdf — ベクターがベクターのままの PDF リーダ/ライタ。パスはパス、 グラデーションはグラデーションのまま、途中でラスタ化しない。 bytes → Scene のラウンドトリップを top-level walker で実装。
- oxideav-svg —
SVG のリーダ/ライタ。
<text>/<tspan>は scribe の ベクターファースト API 経由。<mask>/<clipPath>は マルチシェイプ clip + SoftMask 合成つき。<filter>は graceful にパススルー。
加えて画像フォーマットで oxideav-tiff(TIFF 6.0) と oxideav-pbm (Netpbm — PBM/PGM/PPM/PNM/PAM)。
ロスレス系の一括追加
アーカイブ/編集向けのロスレスデコーダを 7 本: TTA(True Audio)、 Ut Video、 Shorten、 HuffYUV / FFVHuff、 Lagarith、 MagicYUV、 WavPack。
旧来+現代ニッチ
旧来: Cinepak(CVID)、 Indeo 2(RT21/IV20)、 SVQ1(Sorenson)、 Cook(RealAudio)、 WMA、 Musepack、 aptX(classic + HD Bluetooth)、MIDI (SoundFont 2 / SFZ / DLS のソフトシンセ scaffold つき)。
現代: EVC(MPEG-5)、 JPEG XS(プロダクション /IP 映像向けの低レイテンシ)、 DTS(Core + EXSS / XCH / XXCH / X96 / XLL 拡張)。
合成メディア
oxideav-generator —
正弦波、グラデーション、フラクタル、テストパターンを生成。
generate:// URI のソースとしても、入力なしフィルタとしても
使える。label でテキスト → 画像も(scribe 経由)。
ほかに今週
ほぼ背景作業:
- goro(Go で書く PHP)
— 最適化フェーズ。コンパイル時にリテラルの
*ZValをキャッシュ、 ラッパーなしのZVal.SetVal高速パス、operatorMathのアロケ 削減。 - goro-rs(Rust で書く PHP)— PCRE 正規表現エンジンを大幅に書き直し。PHP テストスイート での通過率は今のところ約 50%。
- cterm — 入力 RPC を ストリーミング化(バッチフォールバック付き)。タイピングの 低レイテンシ化。
- klbslog + rest — リトライ/ トークン更新リトライ時にリクエストボディをリセットする修正。
来週
goro に VM が入る。libwallet は go-live への詰めが続く。