- ./run.sh & またはrun.batをダブルクリック(windowsの場合)
- .ipfs/configが生成され,自身のPeerIDとPrivate Keyが書き込まれる.
- 一旦,CTRL+CにてIPFSを終了させる.
- kadrtt.propertiesのipfs.endpointを以下のようにする.
ipfs.endpoint=/ip4/[bootstrapのIP]/tcp/4001/ipfs/[bootstrapのPeerID]
例: ipfs.endpoint=/ip4/1.2.3.4/tcp/4001/ipfs/abcdedfta
- .ipfs/config内のBootstrapの部分を,以下のようにする.
"Bootstrap":[
"/ip4/[bootstrapのIP]/tcp/4001/ipfs/[bootstrapのPeerID]"
],
例:
"Bootstrap":[
"/ip4/1.2.3.4/tcp/4001/ipfs/abcdedfta"
],
- そして再び,./run.sh & またはrun.batをダブルクリック(windowsの場合)して実行する.
- .ipfsディレクトリに,configファイルが無いことを確認(もしあれば削除する)
- kadrtt.propertiesのipfs.endpointを以下のようにする.
ipfs.endpoint=/ip4/[bootstrapのIP]/tcp/4001/ipfs/[bootstrapのPeerID]
例: ipfs.endpoint=/ip4/1.2.3.4/tcp/4001/ipfs/abcdedfta
- そして,以下のコマンドでipfsプロセスを開始します.
./run.sh & またはrun.batをダブルクリック(windowsの場合)
以降は,ipfsプロセスが稼働した後の操作です.ipfs-nabuでは,httpサーバが稼働しているため,ローカルにてhttpでの通信をすることによってコマンドを発行します.
- ipfs起動中に以下のコマンドを実行するか,もしくは./ipfs/configファイルで確認する.
curl -X POST "http://127.0.0.1:5001/api/v0/id"
- 自身のコンテンツをチャンクに分割し,公開用フォルダに複製します.その後,チャンクのCIDに最も近いノードへ各チャンクをputします.
- コンテンツをチャンクへ分割する
- 複数のチャンク+1つのメタデータ(MerkleDAG)が生成される.MerkleDAGには,全チャンクのCIDが書き込まれる.
- MerkleDAGは,ipfs.providersフォルダへ保存される.
- 全チャンクは,ipfs.getdataフォルダへ保存される.
- まずは,MerkleDAGは,Hash(コンテンツ)のCIDでput先をKademliaで探す.
- もしHash(コンテンツ)とのXOR距離が最小のものがノードBであれば,MerkleDAGをノードBへPUTする.
- その後,チャンクごとにPUT先を決めて,非同期でそれぞれPUTする.
- 非同期PUT用のスレッド数はipfs.chunkputthreadsパラメータで設定可能.
- ipfs.providersにはMerkleDAG**, ipfs.getdata**にはチャンクがPUTされる.
//Addコマンド
curl -X POST "http://127.0.0.1:5001/api/v0/dht/add?file=xxx"
//属性付きコンテンツのAdd.書式: attrs=属性名1_属性値1-属性名2_属性値2-....
curl -X POST "http://127.0.0.1:5001/api/v0/dht/add?file=xxxx&attrs=time_0824"
//Tag付きコンテンツのAdd (値を文字列とする場合にtagsを使う).書式: tags=tag名1_tag値1-tag名2_tag値2-...
curl -X POST "http://127.0.0.1:5001/api/v0/dht/add?file=xxxx&tags=location_tokyo"
//複数属性と複数Tag付きコンテンツのAdd (値を文字列とする場合にtagsを使う)
curl -X POST "http://127.0.0.1:5001/api/v0/dht/add?file=xxxx&attrs=time_20240323-temp_34&tags=area_fe43-id_345t"
//実行結果の出力:
{"CID_file":"addしたコンテンツのCID","Addr0":"12D3KooWRwtcPecyqCLkzwwP3xSVo8XtuVDSQMkoi7NJc2sjRTjR: [/ip4/xx.xx.xx.xx/tcp/4001]"}
//Getコマンド:
curl -X POST "http://127.0.0.1:5001/api/v0/dht/getvalue?cid=addしたコンテンツのCID"
- PUT対象のデータのCIDを取得し,あとはKademliaに従ってPUT先ノードが決まり,そのノードへ保存させる.
- putされたコンテンツは,propertiesファイル内で定義されているipfs.datapathのpathへ保存される.
//文字列をPUTする場合
curl -X POST "http://127.0.0.1:5001/api/v0/dht/putvaluewithattr?value=文字列"
//ファイルをPUTする場合
curl -X POST "http://127.0.0.1:5001/api/v0/dht/putvaluewithattr?file=ファイルパス"
- GET対象のコンテンツのCIDを指定することで,コンテンツをgetできる.
- getしたコンテンツは,propertiesファイル内で定義されているipfs.datapathの場所に保存される.
curl -X POST "http://127.0.0.1:5001/api/v0/dht/getvalue?cid=対象コンテンツのCID"
- 例えば,24時間を1時間単位で検索させたい場合は,例えばtimeという属性名で1,2,3,...24という値をputします.各時間の担当ノードが決められて,それらにputされます.
- 属性検索をする場合は,事前にこの処理が必要となります.
//以下の例は,timeという属性について,08時~10時までの値を担当ノードへputしている.各値の担当ノードはKademliaによって自動的に決められます.書式: attrname=属性名&min=最小値&max=最大値
curl -X POST "http://127.0.0.1:5001/api/v0/dht/putattrs?attrname=time&min=08&max=10"
//1属性で文字列をputする場合.属性の書式は,attrs=KEY_VALUE-KEY_VALUE-....
curl -X POST "http://127.0.0.1:5001/api/v0/dht/putvaluewithattr?value=xxxx&attrs=time_0824"
//1属性でファイルをputする場合.
curl -X POST "http://127.0.0.1:5001/api/v0/dht/putvaluewithattr?file=xxxx&attrs=time_0824"
//複数属性と複数Tagつきコンテンツput
curl -X POST "http://127.0.0.1:5001/api/v0/dht/putvaluewithattr?file=xxxx&attrs=time_20240323-temp_34&tags=area_fe43-id_345t"
//文字列をputする場合.属性の書式は,attrs=KEY_VALUE-KEY_VALUE-....
curl -X POST "http://127.0.0.1:5001/api/v0/dht/putvaluewithattr?value=xxxx&attrs=time_0824-temp_25"
//ファイルをputする場合.
curl -X POST "http://127.0.0.1:5001/api/v0/dht/putvaluewithattr?file=xxxx&attrs=time_0824-temp_25"
//timeが08~10で,かつcidのみを取得する場合
curl -X POST "http://127.0.0.1:5001/api/v0/dht/getbyattrs?attrs=time_08_10"
//timeが08~10で,かつtemp(温度)が25~35である場合で,cidのみを取得する場合
curl -X POST "http://127.0.0.1:5001/api/v0/dht/getbyattrs?attrs=time_08_10-temp_25_35"
curl -X POST "http://127.0.0.1:5001/api/v0/dht/listattrs"
//tag名前をareaで,値を指定して取得する場合
curl -X POST "http://127.0.0.1:5001/api/v0/dht/getbyattrs?tags=area_a23fa"
//複数属性範囲と複数タグでの取得
curl -X POST "http://127.0.0.1:5001/api/v0/dht/getbyattrs?attrs=time_08_10-temp_25_35&tags=area_a23fa-id_234fs"
- tagによる検索時に,showallオプションでCIDだけでなく属性すべてを表示させることができます.
curl -X POST "http://127.0.0.1:5001/api/v0/dht/getbyattrs?tags=dir_/abc/def/&showall=true"
[{"extension":"txt","filename":"testfile","dir":"/abc/def/","cid":"xxxxxx","timestamp":"20240112"},{"extension":"mp4","filename":"testfile","dir":"/abc/def/","cid":"yyyyyyyy","timestamp":"20240113"}]
curl -X POST "http://127.0.0.1:5001/api/v0/dht/listtags"
curl -X POST "http://127.0.0.1:5001/api/v0/dht/peerlist"
- 各ノードは,h2 DBにてメタ情報を管理しています.これらを空にするには以下のコマンドを実行させてください.
curl -X POST "http://127.0.0.1:5001/api/v0/dht/inittable"
- Ctrl+Cか,もしくは以下のコマンドでkillできます.
curl -X POST "http://127.0.0.1:5001/api/v0/exit"
- クライアントから要求を受け付けるAPIHandler.javaと,要求元からのクエリを受けるKademliaEngine.javaがあります.
- 一式をコピーする.
- .ipfs/configがあればconfigを削除してください.初回起動時に自動生成して,かつピアIDも自動生成してconfigに書き込まれます.
- Merkle DAG関連のデータはpropertiesファイルにあるipfs.providerspath, コンテンツ生データはipfs.datapathで指定したディレクトリに保存されます.このディレクトリ名は,kadrtt.propertiesで指定してください.
- kadrtt.propertiesのipfs.endpoint,つまりbootstrapノード情報を適切なものにしてください./ip4/IPアドレス/tcp/4001/ipfs/ピアID という形式です.ピアIDは,後述の方法で取得可能.
- Javaがインストール済みである必要があります.実行するためには,できればJava Runtime17以上が望ましいです.開発するには,JDK17以上が望ましいです
- antでコンパイルします.antが設定済み(PATH含めて)である必要があります.以下のコマンドでコンパイルしてください.
//コンパイル
ant compile
//classファイル→lib/ipfs-ncl.jarを生成
ant build
//クリーンする場合
ant clean
- もしくは,IDEで開発する場合は,以下のものをclasspathに入れてビルドすればコンパイルは通ります.
- . (現在のトップディレクトリ)
- \classes\production\nabu-master
- libディレクトリ内の全てのjarファイル
- 以下のコマンドでは,一斉に実行に必要なファイル群をそれらにアップロードします.その際,peerlistファイルで,ノードのIP,sshログインユーザ名,パスワードを指定する必要があります.
- classes/, ./にある設定ファイル群,lib/をuploadします.
./upload.sh