簡単にP2Pの分散型ストレージやKVSを試せる「Hypercore Protocol」を使ってみた
複数のコンピューター間で直接データを送受信するP2Pは、従来のクライアント・サーバー構造が抱える「サーバーへのアクセス集中」や「中央集権」などの問題を解決する技術として注目を集めてきました。P2Pはデータを分散して保存できる点が特徴であり、ビットコインなどの暗号通貨やBitTorrentなどで活用されています。オープンソースソフトウェアの「Hypercore Protocol」を使うと、そんなP2Pによる分散型ストレージやKVSを無料で簡単に利用できるとのことなので、実際に使ってみました。
Hypercore Protocol
https://hypercore-protocol.org/
Hypercore Protocolは「Hypercore」と呼ばれる機能を基盤として、分散型ストレージの「Hyperdrive」やKVSとして使える「Hyperbee」などの機能を含むツール群です。基盤であるHypercoreは「ブロックの追加のみ可能なログストア」となっており、ブロックチェーンと同じような性質。ブロックはHypercoreに参加するノードに分散保存されます。
Hypercoreにはブロックチェーンの性質に加え、追加したブロックを葉に持つハッシュ木を構築するといった、BitTorrentと同じデータ検証の仕組みを持っています。
例えば不審なピアから送信されたオレンジ色のブロックやハッシュを検証したい場合は……
検証したいブロックやハッシュを用いて木構造の頂点にあたるルートハッシュを逆算していき、本来のルートハッシュと一致すればデータは正しいと判断することができるというわけです。
Hypercore ProtocolはNode.jsのモジュールとして提供されており、コマンドラインインターフェースも存在しています。まずはコマンドラインからHypercore Protocolを利用するため、下記コマンドを実行してnpmからHypercore ProtocolのCLIパッケージをインストール。今回はUbuntu 20.04をOSに使用しています。
sudo npm install -g @hyperspace/cli
まずは以下のコマンドを実行し、Hypercore Protocolに含まれる機能のひとつである「Hyperdrive」を作成。HyperdriveはHypercoreを基盤とした分散型データストレージで、通常のクラウドストレージと同じように利用することができます。
hyp create drive
実行すると、こんな感じでHyperdriveのURLが表示されます。なお、HyperdriveはログストアのHypercoreやローカルストレージを管理する「Corestore」、分散ハッシュストレージの「Hyperswarm」について、それぞれのAPIを提供するデーモン「Hyperspace」上で動作しており、「hyp daemon status」でHyperspaceのデーモン動作状況を確認することができます。
Hyperdrive上にディレクトリを作成するためには以下のコマンドを実行。
hyp drive mkdir hyper://ハッシュ値/hyperdrive
ドライブの内容は以下のコマンドで確認できます。
hyp drive ls hyper://ハッシュ値
こんな感じで、先ほど作成した「hyperdrive」ディレクトリが表示されました。
続いてディレクトリにファイルを保存してみます。まずは「Hello, Hyperdrive!」という内容の「text.txt」を用意。
ファイルの保存はHyperdrive上に作成するファイルパスを指定して、そこにファイルの内容を標準入力するという感じで、少々癖があります。
hyp drive put hyper://ハッシュ値/hyperdrive/text.txt < text.txt
ファイルの内容を確認するコマンドは以下。
hyp cat hyper://ハッシュ値/hyperdrive/text.txt
こんな感じで、「Hello, Hyperdrive!」という内容のファイルを保存することができました。「mkdir」や「ls」「cat」など、Linuxでよく利用するコマンド名称を含んでいるため、直感的に操作することができます。
また、以下のようにコマンドを実行すると、ディレクトリの内容をまるごと同期することもできます。
hyp drive sync 同期元ディレクトリ hyper://ハッシュ値/同期先ディレクトリ
実行結果はこんな感じ。
Hyperdriveの内容は、コマンドラインだけでなくブラウザ上でも閲覧することが可能。以下のコマンドを実行すると……
hyp drive http hyper://ハッシュ値
「http://localhost:8080」から、Hyperdriveの内容をブラウザ上で確認することができます。
Hypercore ProtocolにはHyperdriveだけでなく、KVSとして利用できるHyperbeeという機能もあります。Hyperbeeを作成するには以下のコマンドを実行。
hyp create bee
Hyperdriveの時と同じように、HyperbeeのURLが表示されます。
Hyperbeeの使い方は至ってシンプル。表示されたURLにKeyをパスとして指定し、次にValueを指定して以下のようにコマンドを実行します。なお、Valueの型は自動で判別してくれます。
hyp bee put hyper://ハッシュ値/giga "Hello"
Valueを取り出すには以下のコマンドを実行。
hyp bee get hyper://ハッシュ値/giga
こんな感じで、KVSにKeyとValueを保存したり、取得したりすることができます。
また、Hypyercoreにはデータをストリームできる「beam」という機能があり、beamを使うと1対1のデータストリーミングを簡単に行うことができます。ストリーミング元は以下のコマンドのように、「hyp beam "パスフレーズ"」に送信したい内容を標準入力します。
cat beam.txt | hyp beam "this is a secret passphrase"
実行結果はこんな感じ。
標準出力した内容は、ストリーミング先の「hyp beam "パスフレーズ"」の標準出力として受け取ることができます。
これまではコマンドラインでHypercore Protocolを試してきましたが、Hypercore ProtocolはNode.jsのコード上で利用することもできます。以下のコードは引数に指定したファイルをHyperdriveに保存できるNode.jsのコードです。Hyperspaceデーモンが動作しているホスト上で実行できます。
import { Client as HyperspaceClient } from 'hyperspace' import Hyperdrive from 'hyperdrive' import { readFileSync } from 'fs' import { argv } from 'process' async function main () { // 引数に指定したファイルの読み込み const data = readFileSync(argv[2], "utf-8") // Hyperspaceとのコネクションを確立 const client = new HyperspaceClient() // Hyperdriveを作成 let drive = new Hyperdrive(client.corestore(), null) await drive.promises.ready() console.log('HyperdriveのURL:') console.log(' hyper://' + drive.key.toString('hex')) // ファイルを書き込み await drive.promises.writeFile(argv[2], data) // 分散ハッシュテーブル上に展開 await client.replicate(drive) await new Promise(r => setTimeout(r, 3e3)) await client.network.configure(drive, {announce: false, lookup: false}) // クライアントを終了 await client.close() } main()
実行結果はこんな感じ。ローカルに保存された「hello.txt」が、きちんとHyperdrive上に保存できていることが「hyp drive cat」コマンドから確認できました。
なお、Hypercore Protocolで保存したデータは、自分が他のノードにあるデータにアクセスするか、他の誰かが自分のノードにあるデータにアクセスするまでは「ローカルにのみ保存されている」状態である点は注意が必要。今回のレビューでは他のノードとデータのやり取りを行っていないため、例えばノードに利用しているPCを初期化した場合は、Hyperdriveに保存したデータも消えることになります。
・関連記事
「ブロックチェーン」を2分で理解できるムービー - GIGAZINE
ビットコインで億万長者なのにパスワードを忘れて大金に手がつけられないプログラマー - GIGAZINE
Bitcoinが抱え解決が求められている「ブロックサイズ問題」とは - GIGAZINE
中央主権的なHTTPから脱却し新しいインターネットの世界を生み出す壮大な分散型システム「IPFS」とは? - GIGAZINE
・関連コンテンツ
in レビュー, ソフトウェア, Posted by darkhorse_log
You can read the machine translated English article I tried using 'Hypercore Protocol' which….