コンテンツにスキップ

プロトコル仕様

本ページは、サードパーティのプロトコル実装者と、ワイヤ形式・データ構造・ネットワークの挙動を理解する必要のある開発者を対象としています。アプリケーションを開発する場合は、まずはじめかたを参照するか、アーキテクチャ概要と Go パッケージから読み進めてください。

A2AL の Address は固定長の 21 バイトです。

[ バージョンバイト (1 バイト) ][ ハッシュ (20 バイト) ]

バージョンバイトは鍵アルゴリズムとハッシュの導出方法を表します。

バージョンバイト名称鍵アルゴリズム20 バイト導出用途
0xA0Ed25519Ed25519SHA-256(pubkey)[0:20]A2AL ネイティブのアイデンティティ
0xA1P256P-256 (NIST)SHA-256(pubkey)[0:20]A2AL ネイティブの P-256 アイデンティティ
0xA2Paralismsecp256k1RIPEMD160(SHA-256(pubkey))Paralism、Bitcoin P2PKH、Cosmos SDK
0xA3Ethereumsecp256k1Keccak-256(pubkey)[12:32]Ethereum および EVM 互換チェーン
範囲状態ポリシー
0xA0〜0xA7正式専門家レビューが必要
0xA8〜0xAD予約凍結。将来の標準化プロセス専用
0xAE実験登録不要。一意性は保証されない
0xAFプライベート登録不要。一意性は保証されない

割り当ての全体像と申請手順はアドレスバージョン登録表にまとめています。

  • 0xA0(Ed25519)と 0xA1(P256):42 文字の 16 進文字列。大文字・小文字は SHA-256 に基づくチェックサムとして機能します。
  • 0xA2(Paralism)と 0xA3(Ethereum):0x 接頭辞付きの 16 進表記。

パースは形式から自動的に判別します。コードに組み込む際は daemon が返す文字列をそのまま使い、大文字・小文字を独自に変換しないでください。

DHT のルーティングキーは Address から決定的に導出します。

NodeID = SHA-256(バージョンバイト ‖ 20 バイトハッシュ) = 32 バイト

NodeID は DHT 内部の XOR 距離ルーティングにのみ使用し、アプリケーション層には露出しません。この分離により、ルーティング方式をアイデンティティ方式から独立して進化させられます。

ワイヤ形式のデータ構造(CBOR)

Section titled “ワイヤ形式のデータ構造(CBOR)”

すべてのレコードは CBOR でエンコードし、SignedRecord コンテナに包みます。

フィールド型説明
RecTypeuint80x01 端点、0x10 トピック、0x80 メールボックス、0x02〜0x0f はカスタム
Address21 バイト発行者の AID
Pubkeybytes署名用の公開鍵(操作鍵の場合もあります)
PayloadbytesCBOR でエンコードした種別ごとのペイロード
Sequint64単調増加するシーケンス番号
Timestampuint64Unix 秒
TTLuint32有効期間(秒)
Signaturebytes正規化したフィールドに対する Ed25519 または secp256k1 の署名
Delegationbytes省略可能な CBOR DelegationProof(マスター鍵から導出した AID に対し操作鍵が署名する場合に付与)

レコードは書き込み時と読み取り時の両方で検証します。署名の完全性、timestamp + TTL が現在時刻を含むこと、そして署名権限です。署名鍵は、この Address を直接導出するか、マスター鍵が発行した有効な委任を携えている必要があります。

フィールド型説明
Endpoints[]string端点 URL(例:quic://1.2.3.4:4122、quic://[2001:db8::1]:4122)
NatTypeuint80 不明、1 フルコーン、2 制限付き、3 ポート制限付き、4 対称
Signalstring省略可能な ICE trickle のシグナリング基点(旧来のピア向け)
Signals[]string複数のシグナリングアドレス。空でない場合は Signal より優先
Turns[]string旧レコードからのデコード時のみ。新しいノードは turn:// ヒントを書き込みません。中継の資格情報はローカルにとどまります

各レコードは複数の端点候補を公開します。接続する側はすべての候補に同時にダイヤルし(Happy Eyeballs)、最初に成功したものを採用します。

agent 自身の NodeID ではなく SHA-256("topic:" + 能力名) に保存され、同じ能力名の複数の発行者は DHT が集約します。

フィールド型説明
Namestring人が読める agent 名
Protocols[]string対応プロトコル(例:"mcp"、"http"、"a2a")
Tags[]string絞り込み用のタグ
Briefstring短い説明(140 文字以内)
Metamap省略可能な拡張メタデータ

TopicPayload 全体の CBOR エンコードは 512 バイトを上限とします。

操作鍵をマスター AID に結びつける委任表明です。

フィールド説明
MasterAID委任される恒久的な AID
OperationalPubkeyMasterAID の代理で発行する権限を与えられた公開鍵
Scope権限の範囲(現在はネットワーク操作)
IssuedAt / ExpiresAt有効期間(Unix 秒)
Signature上記の正規化フィールドに対するマスター鍵の署名

マスター鍵が必要になるのは DelegationProof を生成するときだけです。以降 a2ald が保持するのは操作鍵と CBOR エンコードされた証明のみです。資格情報のローテーションは証明の再発行であり、AID は変わりません。

NodeID(recipient) に保存します。外側の SignedRecord.Address が送信者を示し、ペイロードは X25519 + HKDF + AES-256-GCM で暗号化されるため、受信者の秘密鍵を持つ者だけが復号できます。

A2AL は Kademlia 系の DHT を使い、FIND_NODE、FIND_VALUE、STORE を反復的に実行します。

レコードの保存時には RecordAuth を適用します。書き込まれるレコードは、自身の Address に対して自己署名されているか、その Address を導出するマスター鍵が発行した有効な DelegationProof を伴っている必要があります。

ブートストラップノードは、初回起動時にネットワークへ参加するための公開ノードです。参加後は a2ald が自身のルーティングテーブルを構築し、ブートストラップノードに依存しなくなります。

ConnectFromRecord は、対象の端点レコードにあるすべての Endpoints へ同時にダイヤルし、最初に QUIC ハンドシェイクが成功したものを採用します。双方は自身の Ed25519 鍵から導出した証明書で認証するため、認証は相互 TLS の内部で完結し、CA やドメイン名、証明書配布に依存しません。ワイルドカードで待ち受ける場合は既定でデュアルスタックとなり、IPv6 の候補があれば優先します。

直接接続がすべて失敗し、レコードにシグナリングアドレスがある場合、双方は 2 つの AID から決定的に導出した room ID でシグナリングサービスに接続し、WebSocket trickle で ICE 候補を交換して、点対点の UDP 経路を確立したうえで QUIC を流します。この段階では、任意で外部 TURN が中継候補を提供できます。**A2AL は中継を設けません。**資格情報はローカルにとどまり、DHT には公開しません。

TLS ハンドシェイクの後、クライアントは a2r2 + 21 バイトの対象 AID(4 バイトのマジックとアドレス)を送り、続いて短い制御交換を行います。データは以降のストリームで流れます。これにより、1 つの QUIC リスナーを共有する複数の AID を個別に宛先指定できます。受信側では旧版の a2r1(25 バイトのフレームのみ)も引き続き受け付けます。

プロトコルが担うのはアドレス解決と接続のみです。以下はプロトコルではなく daemon(a2ald)に属します。便箋、対話、ルーム、ファイルオブジェクト、そしてアクセス制御です。ACL は特定の AID への受信 HTTP とオブジェクトのダウンロードにのみ作用し、DHT、便箋、対話のエンベロープには作用しません。

0xA4〜0xA7 の未割り当てのバージョンバイトを申請するには、Address Version Request テンプレートで GitHub Issue を作成し、名称、鍵アルゴリズム、20 バイト導出、署名検証の方法、理由、代表実装を記載します。審査基準と詳細な手順はアドレスバージョン登録表にあります。

目的ページ
バージョンバイトの割り当てと申請アドレスバージョン登録表
階層構造と実装構成アーキテクチャ概要
実装とドキュメントへの参加コントリビュートガイド