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