Freenet/Dev
FCP
[編集]FCPとはFreenet Client Protocol(フリーネット・クライアント・プロトコル)の頭文字を取ったもので、これを使えばフリーネットのフロントエンドソフト(以下クライアントと呼ぶ)を開発することができる。なお、FCPの使用ポートは9481であるが将来変更される可能性もあるのでプログラミングの際は考慮すること。
通信準備
[編集]各FCP通信の始めにクライアントから、
00 00 00 02 EndMessage
の4バイト+エンドメッセージを送る。[要出典]
Header [Field1=Value1] . . [FieldN=ValueN] EndMessage
上記メッセージがノードより返ってくれば通信準備完了である。
【ノード → クライアント】 FormatError [Reason=] EndMessage
または、
【ノード → クライアント】 Failed [Reason=] EndMessage
上記メッセージがノードから返ってきたり、返信が無い場合は通信準備の失敗である。
ハンドシェイク
[編集]ノードとのハンドシェイクを行う。
【クライアント → ノード】 ClientHello EndMessage
とメッセージを送る。これを受けて、
【ノード → クライアント】 NodeHello Protocol=<number: プロトコル バージョンナンバー> Node=<string: ノードの記述> [HighestSeenBuild=<number: データストア内にある最新ビルドナンバー>] MaxFileSize=<hex number: 許可された最大データサイズ> EndMessage
がノードより返ってくる。
ノードステータス
[編集]ノードステータスの収得する。
【クライアント → ノード】 ClientInfo EndMessage
とメッセージを送る。これを受けて、
【ノード → クライアント】 NodeInfo Architecture=<string> OperatingSystem=<string: free form> OperatingSystemVersion=<string> JavaVendor=<string: free form> JavaName=<string: free form> JavaVersion=<string> AllocatedMemory=<number> FreeMemory=<hex number> DatastoreMax=<hex number> DatastoreUsed=<hex number> DatastoreFree=<number> MaxFileSize=<number> MostRecentTimestamp=<hex number> LeastRecentTimestamp=<hex number> RoutingTime=<number> (0) AvailableThreads=<number> ActiveJobs=<number> NodePort=<hex number> NodeAddress=<string> EstimatedLoad=<number> IsTransient=<true|false> EndMessage
とノードステータスが返ってくる。
ダウンロード
[編集]クライアントからノードへのダウンロード要求を行う。
【クライアント → ノード】 ClientGet RemoveLocalKey=<true|false> URI=<string: (例) KSK@gpl.txt> HopsToLive=<number: hops to live> EndMessage
ノードより下記のメッセージが返ってくる。
【ノード → クライアント】 DataFound DataLength=<number: メタデータ + データ のバイト数> [MetadataLength=<number: デフォルト = 0, メタデータのバイト数>] [Timeout=<number: ノードが返信するまでの秒数>] EndMessage
この後データが送られてくる。
【ノード → クライアント】 DataChunk Length=<number: 引き続き送られてくるデータのバイト数> Data <データ>
以上でダウンロードができる。ただし、諸条件により失敗することがあり、下記のエラーメッセージがノードより返ってくる。
- URIError
- 指定したURIが不正の為接続終了。
- DataNotFound
- データが見あたらない為接続終了。
- RouteNotFound
- ルートが見あたらない為接続終了。
この時、再度ダウンロード要求をしなければならない。
- Restarted
- 再試行の為そのまま待機。
この時、ノードからのメッセージを待っていなければならない。
インサート
[編集]クライアントからノードへのインサート(アップロード)要求を行う。
【クライアント → ノード】 ClientPut RemoveLocalKey=<true|false> HopsToLive=<number: hops to live> URI=<string: (例) KSK@gpl.txt> DataLength=<number: メタデータ + データ のバイト数> [MetadataLength=<number: デフォルト = 0, メタデータのバイト数>] Data <データ>
インサートに成功すると、
【ノード → クライアント】 Success URI=<string: (例) KSK@gpl.txt> [PublicKey=<string: 公開鍵>] [PrivateKey=<string: 秘密鍵>] EndMessage
がノードより返ってくる。 インサートに失敗すると、次のメッセージがノードより返ってくる。
- URIError
- 指定したURIが不正の為接続終了。
- Restarted
- 再試行の為そのまま待機。
- RouteNotFound
- ルートが見あたらない為接続終了。
- KeyCollision
- フリーネット上でキーの重複が発生した為接続終了。
- SizeError
- データサイズが大きすぎる為接続終了。データサイズは32KB以内にしなければならない。(CHKキーは除く)
- Pending
- データのインサートは成功したが、インサート処理が完全に終わっていない。
鍵の生成
[編集]CHKキーを生成する
[編集]【クライアント → ノード】 GenerateCHK DataLength=number: メタデータ + データ のバイト数> [MetadataLength=<number: デフォルト = 0, メタデータのバイト数>] Data <データ>
ノードより下記のメッセージが返ってくる。
【ノード → クライアント】 Success URI=<string: (例) CHK@ecUZTREns826SoiYGhZyAZMz1lsMAwI,JBZkaLd0Jxy3wSVF~C6qiQ> EndMessage
SVKキーペアを生成する
[編集]【クライアント → ノード】 GenerateSVKPair EndMessage
ノードより下記のメッセージが返ってくる。
【ノード → クライアント】 Success PublicKey=<string: 公開鍵> PrivateKey=<string: 秘密鍵> CryptoKey=<string: 暗号化用エントロピー> EndMessage
この公開鍵と秘密鍵がペアで使用できる。
秘密鍵から公開鍵を生成する
[編集]【クライアント → ノード】 InvertPrivateKey Private=<string: 秘密鍵> EndMessage
ノードより下記のメッセージが返ってくる。
【ノード → クライアント】 Success PublicKey=<string: 公開鍵> EndMessage
データサイズを収得する
[編集]【クライアント → ノード】 GetSize URI=<string: (例) KSK@gpl.txt> EndMessage
ノードより下記のメッセージが返ってくる。
【ノード → クライアント】 Success Length=<number: データサイズを2乗して切り上げたサイズ> EndMessage