Communitygithub.com

voluminor/skill-yggdrasil

YggdrasilメッシュネットワークアプリをGoで構築するためのエージェントスキル(ratatoskrライブラリ経由):組み込みクライアント、HTTP/TCP/UDPサーバー、SOCKS5、ポートフォワーディング、ピア管理、NodeInfo/シジル — ユーザースペース、TUNやroot不要。

skill-yggdrasil とは?

このスキルは、Go言語でYggdrasilエンドツーエンド暗号化IPv6メッシュネットワークに接続・サービス提供するプログラムを構築するためのものです。gVisor netstack上でユーザースペース動作するため、TUNデバイス、root権限、外部yggdrasilデーモンは不要です。標準Goインターフェース(net.Conn、net.Listener、net.PacketConn、http.Transport)をそのまま利用でき、組み込みライブラリ `github.com/voluminor/ratatoskr` がすべてのAPIを提供します。高レイテンシ・低帯域幅・断続的なメッシュ環境に特化した設計思想(タイムアウト、並行性制限、チャンク分割・検証・再開可能転送、バックオフ付きリトライ)を持ち、SOCKS5プロキシ、ポートフォワーディング、NodeInfo/シジル公開、ピア管理など多彩な機能をサポートします。

対応✓Claude Code~Codex CLI~Cursor
npx skills add voluminor/skill-yggdrasil

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

GoにおけるYggdrasilネットワーキング

概要

このスキルを使用して、Yggdrasil エンドツーエンド暗号化IPv6メッシュに接続し、サービスを提供するGoプログラムを構築します。クライアント、HTTP/TCP/UDPサーバー、SOCKS5プロキシ、ポートフォワーダー、ディスカバリメタデータを公開するノードなどに対応。ノードはgVisor netstack上のユーザースペースで動作します。TUNデバイス不要、root不要、外部 yggdrasil デーモン不要、 yggstack バイナリも不要。標準Goインターフェース(net.Conn、net.Listener、net.PacketConn、http.Transport)でYggdrasil経由のダイヤルとリスンを行います。

組み込みライブラリは github.com/voluminor/ratatoskr です。ratatoskr.New でノードを作成し、すべてをそのGo APIで駆動します。パッケージのスコープと安定性は以下にまとめられています。

制約のあるメッシュ向け設計

Yggdrasilはエンドツーエンド暗号化オーバーレイメッシュであり、データセンターファブリックではありません。リンクは高レイテンシ、低帯域幅、損失が多く、断続的です。今到達可能なピアが1秒後にはいなくなり、トラフィックは多くのホップを経由する可能性があります。すべてのYggdrasilソリューションを、弱く不安定な接続向けに構築してください。これはオプションの装飾ではなく、ここで正しいコードのデフォルトの形状です。

  • 無制限にしない。 すべてのダイヤルとリクエストに期限を設定(context.WithTimeout)。制限付きリトライ、制限付きキュー。無限待機は禁止。
  • 並行性を制限する。 処理中の作業を制限:SOCKS MaxConnections、フォワード SetMaxUDPSessions、http.Transport.MaxConnsPerHost/MaxIdleConnsPerHost、独自のワーカープール。どちらもデフォルトは無制限 — 実際の制限を設定すること。
  • 大きな転送はチャンク分割し、検証し、再開可能にする。 大きなファイルを一度に移動しない。小さなチャンク(例:HTTP Range)に分割し、各チャンクを検証(サイズ/チェックサム)し、再開可能にすることで、リンク切断時に全体ではなく1チャンクのみが失われるようにする。
  • べき乗バックオフ+ジッターで冪等にリトライする。 処理中切断を想定。処理を再開可能/冪等にすること。指数バックオフ+ジッター。試行回数に上限を設定。
  • ペイロードを小さく保つ。 おしゃべりなプロトコルやポーリングを避け、圧縮し、コンパクトなエンコーディングを使用。NodeInfo/シジルは16KB制限を十分下回るように保つ。
  • バッファをリンクに合わせる。 パケットバッファには node.MTU() を使用(ユーザースペースMTUは動的で、最小1280)。
  • 劣化し、叩かない。 失敗時はバックオフして部分結果を返す。ピアを積極的にリトライしたり、メッシュをフラッドさせたりしない。

「net/http で大きなファイルを提供する」や「1つの巨大なリクエスト/レスポンス」という単純なアプローチは誤った形状です。正しい形状は、制限付き、チャンク化、再開可能、フォールトトレラントがデフォルトです。制約のあるメッシュ転送パターンについては references/integrations.md を参照。

信頼できる情報源

アクティブなモジュールが信頼できる情報源です。メモリ、古いREADMEテキスト、このスキルではありません。バージョン固有のガイダンスを書く前に、プロジェクトが実際に依存しているものを確認してください:

go list -m github.com/voluminor/ratatoskr   # 選択されたバージョン
go doc github.com/voluminor/ratatoskr       # コンパイルされたルートAPI
go doc github.com/voluminor/ratatoskr/mod/peermgr ConfigObj

選択されたバージョンの実際のソースを読むには、パスを推測する代わりにモジュールキャッシュから解決します:

go list -m -f '{{.Dir}}' github.com/voluminor/ratatoskr

READMEテキストから最小Goバージョンを固定しないでください。go.mod ディレクティブより遅れる可能性があります。選択されたRatatoskrバージョンのアクティブな go.mod を読んでください。

デフォルトワークフロー

  1. アプリケーションの形状を特定する:組み込みノード、HTTPクライアント/サーバー、生のTCP/UDP、SOCKS5、ポートフォワーディング、ピア管理、またはNodeInfo/シジル。
  2. アプリケーションにはルートパッケージ github.com/voluminor/ratatoskr を使用する。mod/core には core.Interface コントラクトを通じてのみアクセスし、低レベルパッケージが本当に必要としない限り *core.Obj/UnsafeCore() を避ける。
  3. context.Context を所有し、それを ratatoskr.ConfigObj.Ctx として渡し、かつ 正常起動後に defer node.Close() を行う。両方が必要。
  4. ピアは厳密に1箇所で設定する:
    • 静的Yggdrasilピア:cfg.Config.Peers
    • Ratatoskrピアマネージャー:ratatoskr.ConfigObj.Peers(その場合 cfg.Config.Peers は空のままにする。さもないと New は ErrPeersConflict を返す)。
  5. アウトバウンドTCP/UDPには node.DialContext、Yggdrasil内のサービスには node.Listen / node.ListenPacket を使用する。
  6. URLやホスト-ポート文字列ではIPv6アドレスを角括弧で囲む:http://[200:abcd::1]:8080、決して http://200:abcd::1:8080 としない。
  7. リンクを弱いものとして扱う:すべての呼び出しに期限を設定し、並行性を制限し、大きな転送はチャンク/検証/再開可能にする(「制約のあるメッシュ向け設計」参照)。
  8. 実際のプロジェクトにコードを生成する際は、ビルドできると仮定するのではなく、コンパイルチェックまたは焦点を絞ったテストを追加する。

モジュールスコープと安定性

Yggdrasilアドレスはノードキーから派生するため、ネットワーク表面は小さく安定しています。ライブラリが完成済みとして扱う部分を優先し、残りは明示的にフラグを立てて、その上に構築しないようにします。

パッケージステータス使用経路
ルート ratatoskr安定、プライマリAPINew、EnableSOCKS、Ask/AskAddr、Snapshot、Close
mod/core安定コントラクトノードに埋め込まれた core.Interface メソッド
mod/peermgr安定ratatoskr.ConfigObj.Peers
mod/socks安定node.EnableSOCKS(直接インスタンス化しない)
mod/resolver安定EnableSOCKS により自動作成。直接使用は高度
mod/forward安定forward.New → Add* → Start
mod/sigils(+ info、services、public、inet)安定ratatoskr.ConfigObj.Sigils
mod/ninfo安定node.Ask / node.AskAddr
mod/probe高度/不安定 — UnsafeCore() が必要、APIは変更可能性ありトポロジ/経路トレースが明示的に必要な場合のみ
mod/settings作業中 - スキーマ未確定避ける;代わりに yggdrasil-go/src/config を直接使用
cmd/*サンプルアプリ、インポート可能なライブラリAPIではないパターンとして読み、インポートしない

ルート vs サブモジュール: デフォルトでは ratatoskr.New を使用(コア + SOCKS + ピアマネージャー + ninfo + シジルを1つの Close で管理)。最小表面(生のダイヤル/リスン)には mod/core に降りて core.New を使用するか、カスタムトランスポートやテストのために core.Interface の周りにサブモジュールを構成する。各サブモジュール(peermgr/socks/forward/resolver/ninfo)は core.Interface を取ります。詳細は references/overview.md を参照。

システムシジル — ここで先に公開する

NodeInfoは、ノードが自分自身をネットワークに説明する方法です。4つの組み込み(「システム」)シジルはすべてのノードで自動的に解析されるため、そこに配置したデータは他の参加者に認識されます。カスタムシジルを発明する前にこれらを活用してください。ratatoskr.ConfigObj.Sigils を介して渡します。それぞれを小さく保ってください — これらは1つの16KB NodeInfo予算を共有します。

シジルここに含めるもの使用理由
infoノードのアイデンティティ:名前、タイプ、場所、連絡先、説明他のノードにあなたのノードが誰/何かを知らせる。
servicesYggdrasil内で公開するポート。name → portポートスキャンなしでのサービスディスカバリ。
publicネットワーク別にグループ化された公開ピアリングURI他のノードが直接ピアリングできるようにする。
inet実際のアドレス(ドメイン/IP)Yggdrasilノードをクリアネットアイデンティティにマッピング。

発見可能で標準的なデータをこれらに配置し、ネットワーク全体が読めるようにします。これらの4つでカバーされないデータに対してのみカスタムシジルを定義してください。そして、あなたのコードを実行しているピアだけがそれを解析することを忘れないでください。コンストラクタは検証とエラー返却を行います。ratatoskr.New の前にエラーを処理してください。詳細、正確な制限、型付きアクセス、カスタムシジル作成:references/nodeinfo-sigils.md および references/custom-sigils.md。

リファレンスマップ

現在のタスクに必要なファイルのみを読んでください:

よくある間違い

間違い修正
組み込みアプリのために外部Yggdrasilデーモンを起動するratatoskr.New を使用。ユーザースペースgVisor netstackを実行する。
ライブラリ統合に yggstack を推奨するyggstack はエンドユーザーバイナリ。Go API制御にはRatatoskrを使用。
cfg.Config.Peers と ConfigObj.Peers の両方を設定する静的ピアまたはピアマネージャーのどちらかを選択。両方は不可 → ErrPeersConflict。
Ctx を渡すが Close をスキップする(またはその逆)両方を行う:キャンセルはシャットダウンをトリガーし、Close はリソースを解放する。
IPv6角括弧なしでURLを構築するfmt.Sprintf("http://[%s]:%d", ip, port) を使用。
基本的なクエリに ninfo.New を作成するnode.Ask / node.AskAddr を使用。ルートオブジェクトはすでにninfoを構築する。
実行時にシジルを動的に組み立てたり登録したりするシジルは厳密にコード内で組み立てられる。重複や上書きキーはデフォルトのマージではなくハードエラー。ConfigObj.Sigils を介して公開。自分のキーは res.Node.Extra から読み取る。
デフォルトで UnsafeCore() / mod/probe / mod/settings に手を伸ばすルートAPIに留まる。これらは高度または作業中。
READMEからGoバージョンをハードコーディングする選択されたモジュールバージョンのアクティブな go.mod を読む。

検証

SKILL.md をナビゲーションレイヤーとして保持し、重いAPI詳細は references/ に配置する。公開前に evals/evals.json のシナリオに対して変更をフォワードテストする。

関連スキル