【ITニュース解説】Os exemplos do repositório
2026年10月29日に「Dev.to」が公開したITニュース「Os exemplos do repositório」について初心者にもわかりやすく解説しています。
ITニュース概要
IPFSとNabuの連携を学ぶ初心者向けに、リポジトリのサンプルコードを解説。CIDで識別したデータの書き込み・読み込みや、IPNSによる名前解決など、多様な操作をコマンドラインで体験できる。デモノードはRAM上にデータを一時保存する。
ITニュース解説
この解説では、IPFS(InterPlanetary File System)とNabuというプロジェクトの「examples」モジュール、つまりサンプルプログラムの動作について詳しく説明する。システムエンジニアを目指す初心者でも理解できるよう、技術的な専門用語も丁寧に解説する。
IPFSとは、ファイルやデータをP2P(ピアツーピア)ネットワーク上で共有するための分散型ファイルシステムである。従来のWebサイトが特定のサーバーに依存するのに対し、IPFSではネットワークに参加する複数のコンピューターが協力してデータを保持・提供するため、中央集権的な障害点に強く、より堅牢なデータ共有が可能になる。Nabuは、このIPFSの機能をJavaなどのプログラミング言語で利用するためのライブラリやツール群と考えれば良い。今回紹介する「examples」モジュールは、Nabuを使ってIPFSの基本的な機能がどのように動作するかを具体的に示すためのサンプルコード集である。
これらのサンプルプログラムの目的は、IPFSの核心である「CID(Content Identifier)」と、そのコンテンツのやり取りの方法を体験することにある。CIDとは、コンテンツの内容から計算される一意な識別子のことで、データの改ざんを検知したり、同じデータを重複して保存しないようにするために使われる。CIDがあれば、そのコンテンツがどこにあるかを知らなくても、ネットワーク上の誰かが提供していれば取得できるのがIPFSの大きな特徴である。これらのサンプルは、コマンドラインインターフェース(CLI)と呼ばれる、ターミナルで命令を入力して実行する形式のプログラムとして提供され、それぞれが特定のタスクを実行する。
デモンストレーションでは、「DemoNode」という特別なIPFSノードが使われる。このノードは、デモンストレーションのために毎回新しいIDを生成し、ブロックと呼ばれるデータを「RamBlockstore」に、IPNS(InterPlanetary Name System)の記録を「RamRecordStore」に保存する。ここで重要なのは、「Ram」が「Random Access Memory(メモリ)」を意味しており、データはプログラムが実行されている間だけメモリに保持され、プログラムを終了すると失われてしまう点である。つまり、これらのデモではデータの永続性は考慮されておらず、一時的な動作確認が目的だ。ネットワーク通信にはTCP(Transmission Control Protocol)が使われ、特定のポート(通信の窓口)を通して他のノードと接続する。
DemoNodeを起動する際には、そのノードがネットワーク上でどのように振る舞うかを指定できる。「--public」というオプションがない場合、ノードは「127.0.0.1」というアドレスにバインドされる。これは「localhost」とも呼ばれ、自分のコンピューター上からしかアクセスできないローカル専用のアドレスだ。この場合、接続先の他のノード(bootstrapノード)は、通常は指定されないか、ユーザーが明示的に指定する必要がある。一方、「--public」オプションを付けると、ノードは「0.0.0.0」というアドレスにバインドされる。これはコンピューターのすべてのネットワークインターフェース(有線LAN、Wi-Fiなど)からの接続を許可する設定で、外部のコンピューターからもアクセスできるようになる。この場合、IPFSネットワークがデフォルトで用意している公開されたbootstrapノード群に自動的に接続を試みる。この二つのモードは同時に指定できない。また、「--public」を有効にすると、特定のコマンド実行時に、自分が特定のCIDのブロックを提供していることをネットワークに告知する「provideBlocks」機能も有効になる。DemoNodeが起動すると、ネットワーク上のアドレス(multiaddr)が表示されるが、これは他のプロセスがこのノードに接続するために使う情報となる。
デモンストレーションの種類は、ネットワークへの要求内容に応じていくつか存在する。
「Drop」は、最も基本的なブロックの保存と取得のデモである。このデモでは、テキストやファイルを「raw」形式のブロックとして保存し、そのCIDを出力する。raw形式とは、IPFSのブロック形式の一つで、他のブロックへのリンクを持たない生データをそのまま保存する形式だ。保存の際に提供元をネットワーク全体に告知するDHT(Distributed Hash Table)という仕組みは使われず、接続相手のマルチアドレスとCIDを直接指定してデータをやり取りする。ブロックを保存する側(put)はノードをローカル専用で起動し、ブロックの取得側(get)も同様に起動し、put側が出力したマルチアドレスとCIDを使って直接通信を行うことでブロックを取得する。
「Find」は、DHTを使ったコンテンツ提供者の発見をデモンストレーションする。ブロックを保存する側(put)は、ブロックを保存した後に、自分がそのCIDのブロックを提供していることをDHTに告知する。その後、取得側(get)は、CIDだけを頼りにDHTを使ってそのブロックを提供しているノード(プロバイダー)を探し出す。get側はDHTから得られたプロバイダーのPeerId(ノードの識別子)とアドレス情報を表示し、その情報を使ってブロックの取得を試みる。このデモでは、DHTを通じてコンテンツの場所を知るというIPFSの分散型の側面が強調される。
「Name」は、IPNSの機能をデモンストレーションする。IPNSは、CIDのように固定ではなく、時間とともに内容が変化するコンテンツに対して、一貫した名前を提供するための仕組みだ。例えば、最新バージョンのWebサイトのCIDは頻繁に変わるが、IPNSを使えば常に最新のCIDを指すような固定の名前を割り当てることができる。このデモでは、publish側がブロックを保存し、そのブロックのCIDをIPNSレコードの値として公開する。IPNSレコードには「sequence」と呼ばれるバージョン番号と、「TTL(Time To Live)」と呼ばれる有効期限が設定される。resolve側は、特定の発行者のPeerIdを指定してIPNSレコードを解決し、現在その名前が指しているCIDを取得し、さらにそのCIDのブロックをフェッチする。
「Chat」は、IPFSのP2Pストリーム上でHTTPプロトコルを使ってピアツーピアのメッセージ交換を行うデモである。それぞれのノードが特定のPeerIdまたはマルチアドレスを知っている相手に対してメッセージを送信し、受信したメッセージを表示する。これは、IPFSのネットワーク層の上に独自のアプリケーションプロトコルを構築できることを示している。
「ApiBlocks」は、既存のIPFSデーモン(バックグラウンドで動作するIPFSプロセス)が提供するAPI(Application Programming Interface)を利用してブロック操作を行うクライアントプログラムのデモである。これまでのデモと異なり、ApiBlocks自身はIPFSノードを起動せず、すでに稼働しているIPFSデーモンのAPIエンドポイント(通常は「/ip4/127.0.0.1/tcp/5001」)に接続して、ID取得、ブロックの保存(put)、ブロックの取得(get)、プロバイダーの検索(findprovs)などの操作を実行する。これにより、アプリケーションがIPFSの機能を簡単に利用できることが示される。
これらのデモは、「examples/scripts/」ディレクトリにあるPowerShellスクリプト(Windows用)やシェルスクリプト(Linux/macOS用)を使って実行できる。スクリプトは、MavenというJavaプロジェクトのビルドツールを使ってNabuプロジェクトをビルドし、個々のデモプログラムを起動する。例えば、「mvn install」コマンドはNabuライブラリをローカルにインストールし、その後「mvn -f examples/pom.xml exec:java」コマンドで各デモプログラムを実行する。APIデモだけは、全ての依存関係を含んだ実行可能なJARファイルを「mvn package -DskipTests」で作成し、それを使ってNabuプロセス自体を起動する点が異なる。スクリプトは二つのプロセスを立ち上げて互いに通信させ、期待通りの出力が得られたかを確認し、「PASS」と表示されれば成功となる。
デモの実行時に、Chat、Drop、Find、Nameの各ノードは一時的なポートを使用する。一方、ApiBlocksのデモは、IPFSデーモンがデフォルトで使用するポート(swarm、API、metricsなど)を使用し、さらに公開のbootstrapノードに接続するため、インターネット接続が必要となる場合がある。もしポートがすでに使用されている場合は、特定のオプションを使ってAPIデモをスキップすることも可能だ。ApiBlocksのデーモン起動には時間がかかることがあり、ログに「Starting RPC API server」というメッセージが表示されるまで待機する必要がある。デモによって作成されるIPFSのリポジトリ(データが保存される場所)は、毎回「target/example-tests/ipfs-repo」というディレクトリに新しく作成されるため、以前の実行で問題が発生したデータが残っていても影響を受けないようになっている。
これらのサンプルプログラムは、S3クラウドストレージ連携、ブロックのフィルタリング、UPnP(Universal Plug and Play)によるルーター設定、リレーノード(NAT越えを助けるノード)といった高度な機能には触れていない。また、DemoNodeはメモリ上にデータを保存するため、プロセスを終了するとすべてのブロックとIPNSレコードが消滅するという点も理解しておくべきである。ApiBlocksデモだけが公開のIPFSネットワークと通信する可能性があり、他の4つのデモは基本的にローカル環境でピアツーピア通信を行うように設計されている。
この「examples」モジュールを通して、IPFSとNabuの基本的な仕組み、CIDによるコンテンツ識別、DHTによるプロバイダー発見、IPNSによる名前解決、P2P通信、そして既存のIPFSデーモンとのAPI連携といった、分散型システムの中核的な概念を実際に動かしながら学ぶことができる。