はじめに
今回はReact.jsを使ってブラウザで動作するKademliaのクライアントアプリを作成し、前回作成したKademliaのプログラムの動作確認を行います。
前回作成したプログラムをReactから利用しやすくするため、Typescriptで書き直したものがhttps://github.com/shinyoshiaki/kademlia-with-webrtc/tree/typescriptにアップロードされています。今回はこれを利用するので、動作確認を実際に行う場合はこれをダウンロードしてください。Typescriptはクラスの型定義に利用しただけなので、前回作成したプログラムと互換性があります。
本記事で作成するReact製のクライアントはhttps://github.com/shinyoshiaki/kademlia-client-reactにアップロードされています。
本記事は、過去にコンセンサス・ベイスが主宰していたオンラインサロンの記事です。記事は2017年~2018年にかけて執筆されたため、一部は、既に古くなっている可能性があります。あらかじめご了承ください。
関連する記事
Kademliaの解説と実装 1
Kademliaの解説と実装 2
動作環境
・Node.js v10.x
(nvm, nodebrewなどを使ってNode.jsのバージョンを設定してください)
・Yarn(https://yarnpkg.com/lang/ja/)
使用技術
今回使用する主なライブラリを以下に示します。
名前 | 内容 |
kademlia-with-webrtc(#typescript) | 前回作成したKademliaのプログラムのTypescript版 |
React.js | ブラウザ用のフロントエンドフレームワーク |
実装の解説
プログラムの構成
以下の図のようにNode.js上で動作するポータルノードを経由してクライアント(ブラウザのタブ)同士でP2Pネットワークを構築していきます。(以下の図ではメッシュ状になっていますが、実際はKademliaのルールにしたがってP2Pネットワークを構築します)
ソースコードのファイル構成
Kademliaのクライアントアプリのソースコードのファイル構成を以下に示します。
.
├── App.js
├── components
│ ├── findvalueForm.js
│ ├── keyValueList.js
│ ├── nodeList.js
│ └── storeForm.js
├── index.js
└── node
└── Node.js
アプリのページであるApp.jsとcomponents以下のコンポーネントから成るシンプルな構成です。node以下のNode.jsでKademliaのネットワークに接続します。クライアント側の解説を簡単に行います。
クライアントのコード解説
App.js
メインの画面です。Node.jsファイルを使ってポータルノードへの接続と各コンポーネントの制御を行います。
class App extends Component {
constructor(props) {
super(props);
this.state = { kbuckets: undefined };
//localhost:20000のポータルノードに接続
this.node = new Node("localhost", "20000");
const kad = this.node.kad;
//ノードが追加された際のコールバック
kad.callback.onAddPeer = data => {
console.log({ data });
this.setState({ kbuckets: kad.kbuckets });
};
}
render() {
return (
{/* ノードID */}
{this.node.kad.nodeId}
{/* Kbucketsの状態 */}
{createNodeList(this.state.kbuckets)}
{/* KademliaのStore */}
{createStoreForm(this.node.kad)}
{/* KademliaのFindvalue */}
{createFindvalueForm(this.node.kad)}
{/* KademliaのKeyValueList */}
{createKeyValueList(this.node.kad)}
);
}
}
動作確認
では動作確認に入っていきます。まずポータルノードを立ち上げるためにhttps://github.com/shinyoshiaki/kademlia-with-webrtc/tree/typescriptのプロジェクトをダウンロードします。次に lib/cli ディレクトリに入ってsetup.jsを実行します。
// projectのダウンロード
$ git clone https://github.com/shinyoshiaki/kademlia-with-webrtc.git
// 必要なパッケージをインストールする
$ yarn
// ディレクトリ移動
$ cd lib/cli
// setup.jsを実行
kademlia-with-webrtc/lib/cli$ node setup.js
続けて表示される「my port」には20000と入力し、「ip address」と「port」は空欄にします。入力が終わるとポータルノードが立ち上がります。
? my port 20000
? ip address
? port
test:20000::
nodeid 7515d4292109b13f558797e4831c14e7f7937bf3
start kad 7515d4292109b13f558797e4831c14e7f7937bf3
{ responce:
{ peerlist: [Function],
store: [Function],
findvalue: [Function],
keyValueList: [Function],
id: [Function],
help: [Function] } }
続いてクライアントの方を立ち上げます。https://github.com/shinyoshiaki/kademlia-client-reactからプロジェクトをダウンロードします。次にターミナルで「yarn start」と入力するとブラウザが立ち上がります。
(macOSでは「ネットワーク接続を許可しますか?」とのポップアップが出るので、「許可する」を選択してください)
$ git clone https://github.com/shinyoshiaki/kademlia-client-react.git
// yarnで必要パッケージをインストール
$ yarn
kademlia-client-react$ yarn start
上から順に、
・KademliaのノードIDの文字列
・Kbucketsの表(テーブル)
・Storeのフォーム
・FindValueのフォーム
・KademliaのKeyValueListの中身
が表示されます。
タブを複製すると、新しいノードが立ち上がります。複数のノードを立ち上げてみましょう。
kbucketsの表は左側が自分のノードIDとの距離、右側が接続しているノードのノードIDとなります。
Store機能の動作確認
次にStore機能の動作確認を行います。Storeのフォームに「test」と打ち込んで「Store」ボタンをクリックします。するとKademliaネットワーク内に「test」が保存されます。
クリックすると、「test」のkeyがボタン右側に表示されます。
FindValue機能の動作確認
次にFindValue機能の動作確認を行います。Findvalueのフォームにさきほどの「test」のキーを打ち込んで、ボタンをクリックします。
すると、Kademliaネットワーク内から入力したキーに対する値が右側に表示されます。今回は「test」に対応するキーを入力したので、「test」と表示されています。
まとめ
今回と前回の記事でKademliaの基本的な機能を実装と動作確認を行いました。Kademliaは様々な分散型のソフトウェアに応用されている非常に将来性のあるアルゴリズムだと考えられます。興味のある人は実際にKademliaを利用しているIPFSなどのソースコードを読んでみたりして勉強するのも良いのではないでしょうか?