この記事は、 Getting to know IPFS を自分用に翻訳したものを 許可を得て 公開するものである。

ソース中にコメントの形で原文を残している。 内容が理解できる程度のざっくりした翻訳であり誤字や誤訳などが多いので、気になったら Pull requestだ!


この記事はBlockchain train journalの3本目の記事です。 まずこちらから読み始めましょう: まだ間に合うブロックチェーン【翻訳】

読み込んでみましょう

すでに前の記事で出しましたが、IPFSとそのコンテキストを理解するのに最適な記事なのでもう一度言及します: HTTP is obsolete. It’s time for the distributed, permanent web

この記事からはいくつかのことがわかります(要約します):

  • IPFSはpeer-to-peerノード(他のコンピュータと直接話すコンピュータ)のネットワークからなる
  • ノードはコンテンツ(任意のタイプのファイル)を保持できる
  • コンテンツはハッシュによって表現され、イミュータブルである(コンテンツが変化すると、ハッシュも変化する)
  • ノードはハッシュを使って他のノードにコンテンツを要求できる。これは素晴らしいです。ハッシュとコンテンツの間には不変の関係があります。現在のWebではURLと対応したコンテンツは変わってしまうことがあります
  • ノードはコンテンツのコピーを保持できる
  • 多くのノードがコンテンツを保持するほど、コンテンツは消失しにくくなる(パーマネントWeb)
  • シーダーが増えるほどBitTorrentが速くなるのと同じように、このネットワークも速くなる(IPFSは一部BitTorrentプロトコルをベースにしていますが、同一のコンテンツの重複を排除するところが異なります)

さらに詳しく見ていきます:

  • コンテンツ(ファイル)はブロックに分割され、各ブロックにハッシュが与えられる
  • 内容が同じなのにハッシュが異なる重複したブロックはネットワークから削除される
  • IPFSにはコンテンツのハッシュを指すディレクトリの概念がある
  • ブロックによりGitのようなバージョン管理ができる
  • IPNSによりコンテンツの最新版を探すことができる
  • IPNSにより誰もがコンテンツへのユニークなパブリックリンクを作ることができる
  • IPFSハッシュはバージョンに関係なくイミュータブルなコンテンツへのポインタとなる。IPNSアドレスはそのアドレスの作者が決めたファイルやディレクトリへのポインタである
  • IPNSアドレスはBitcoinウォレットのパブリックアドレスと同じpubkeyhashとして実装されている
  • IPNSアドレスは長く醜いし、ブラウザはIPFSに対応していない。これを解決する方法がいくつかあるので後に見ていく

IPFSについてもっと知るのに、GitHubのipfs/ipfsは良い開始地点でしょう。 quick summaryを見てください。

抽象的なところは大体わかったので、早速始めましょう。

ターミナルを使おう

私たちには少し行動を始めるための知識がついています。

まずインストールし(ipfs-updateを使うやり方をおすすめします)、getting startedに従いましょう。

ブログを非中央集権化する最初の一歩を踏み出す時です。 ところで、このサイトのドメインは素晴らしいと思いませんか!ええ、あなたが中央集権バージョンを読んでいる間までの話ですが :)

私は静的に生成したウェブサイトを私のサーバーにアップロードしており、それはこのようなものです:

├── archives.html
├── author
│   └── mark-pors.html
├── authors.html
├── catching-the-blockchain-train.html
├── categories.html
├── category
│   └── blockchain-train-journal.html
├── feeds
│   ├── all.atom.xml
│   └── blockchain-train-journal.atom.xml
├── getting-to-know-ipfs.html
├── index.html
├── picking-a-decentralized-storage-system.html
├── tags.html
└── theme
    ├── css
     ... // ...
            └── youtube.png

ファイルを惑星間ファイルシステムに向けて打ち上げるには、このようにします:

$ ipfs init # これはノードのピアIDを生成します
$ ipfs daemon # ローカルノードを開始します
$ ipfs add catching-the-blockchain-train.html
added QmXyZcrThrfWQSTKzPiNT4Nd2RcqcVQ3tr7rmFqHYZ3fq4 catching-the-blockchain-train.html

私のノードはこのファイルを配信できるようになり、ネットワークに向けて誰かが以下のハッシュを要求した場合に利用できるコンテンツ(私の最初のブログポストです!)があると発信します:

QmXyZcrThrfWQSTKzPiNT4Nd2RcqcVQ3tr7rmFqHYZ3fq4

あなたのターミナルで:

ipfs cat QmXyZcrThrfWQSTKzPiNT4Nd2RcqcVQ3tr7rmFqHYZ3fq4

は以下と同じ結果を返します(もちろん私がファイルをHTTPでホストしている間に限った話です):

curl http://decentralized.blog/catching-the-blockchain-train.html

あなたのこのファイルをIPFSで2度リクエストした場合、結果は非常に早く返ってきます。 これはノードがコンテンツのコピーをローカルに保つためです。 クールでしょう?

IPFSノードにはHTTPゲートウェイが付属しているため、ブラウザからもファイルにアクセスできます: http://decentralized.blog:8080/ipfs/QmXyZcrThrfWQSTKzPiNT4Nd2RcqcVQ3tr7rmFqHYZ3fq4

このようなことが起きています(getting startedより):

ゲートウェイはあなたのコンピュータからファイルを配信します。 ゲートウェイはDHTにクエリを投げ、あなたのマシンを見つけ、ファイルを要求し、あなたのマシンはゲートウェイにそれを送り、ゲートウェイはあなたのブラウザにそのファイルを送ります。

Note: これは明らかに中央サーバがありますが、少なくともゲートウェイは誰でも実行が可能です。 なのでこれは非中央集権の一種です。 あとでより良い何かが必要でしょう。

非中央集権化!ついに進捗

Webサイト全体を惑星間ファイルシステムにプッシュするのはこれ以上ないほど簡単で、-rフラグをつけてすべての静的ファイルを含むディレクトリを指定するだけです。

$ ipfs add -r ../../www/dcb
added QmWu4hsywXoSrw5JRhjUadyMnDuxuvcgExwVD62cWeLVjb dcb/archives.html
added QmUCJ6z2EfikXEDUYbxfjdkrX2zw62XCAM93HHC61Qrmwg dcb/author/mark-pors.html
added QmV13vUiKU64oHoxbp5MN7bnehraW46de82PLvndbisn64 dcb/authors.html
added QmXyZcrThrfWQSTKzPiNT4Nd2RcqcVQ3tr7rmFqHYZ3fq4 dcb/catching-the-blockchain-train.html
added QmRiWHfYLQEJoKz2dDq2sXnW2keiKZG1nHbnaN55TTXN8b dcb/categories.html
added QmSCx2eV3BjHJWoXMBc7rKakPv3fAcewyroFCRmovcsYSy dcb/category/blockchain-train-journal.html
added QmVxVLT22KLGasBLxzSv6yXofx3GVXmWEd3HqSjPp1X6Zz dcb/feeds/all.atom.xml
added QmdKJY5VVd8Qm5xsLt8Vj5XwvTbe5mCQhK6DnZ9LkqTHwz dcb/feeds/blockchain-train-journal.atom.xml
added QmYpyQ3MXYZum3q2E9pRxUWnJXK74cLvFbuMDYukK9ivK1 dcb/index.html
added QmXkfv9ZXb9evxPXTMJC8fvgeZymYpTQo3CVFv7mDoSRTN dcb/picking-a-decentralized-storage-system.html
added QmSyuSjmzhwkoj6qH7s4MmKeB98Ub1DZ1Hm5anBBnR9yVu dcb/tags.html
added QmSfLETTMQc1b9cBJENH1S4NK5qniXSf79KSP8h5CbU3U8 dcb/theme/css/main.css
... // ...
added QmU8CmEYWV5aUuqoToq1xiyqftdY8MHQ8MdViA2ex23uyV dcb/theme/images/icons/youtube.png
added QmYBVeJkBRdJYj8jr3YTGWE537h26YqcfjvbX4ttjZ65X2 dcb/author
added QmPwQPX86RQi6MrZQigh2tWgztcbf46EjhRg1hzMzELvHN dcb/category
added QmfRxCPp417G3NTqEpBmwtGwtUKFzgQjBRvxNBq88HhC9F dcb/feeds
added QmYUnPcDPcnKA3WFembvNYG48m1oUWa7QLNWZxrkLv1vcE dcb/theme/css
added QmfBq8BDXxhu9cLAG4qhxqY6K5xDQCBWyoYqX5fTmQbfwW dcb/theme/images/icons
added Qme4Dt6vQ1eAVcEs7dY55cAMhTsRJxTakANhZjX9EKvGfF dcb/theme/images
added QmciTMAUiEqMpar2u9n1dJNJStmrP6fjMESyH6ZS5eo56H dcb/theme
added QmcPx9ZQboyHw8T7Afe4DbWFcJYocef5Pe4H3u7eK1osnQ dcb

Note: 私は最初シンボリックリンクをネットワークに追加しようとして失敗しました。

dcb/catching-the-blockchain-train.htmlのハッシュは先程のものと同じです。これが重複排除です。

このリストから1番下のハッシュを取ってゲートウェイに送ると、ブログが閲覧できます: http://decentralized.blog:8080/ipfs/QmcPx9ZQboyHw8T7Afe4DbWFcJYocef5Pe4H3u7eK1osnQ/ すべての相対リンクはちゃんと動作します。 素晴らしい!

私のゲートウェイがダウンしている場合は、IPFSが提供しているもの: https://gateway.ipfs.io/ipfs/QmcPx9ZQboyHw8T7Afe4DbWFcJYocef5Pe4H3u7eK1osnQ/ またはあなたのローカルゲートウェイ: http://127.0.0.1:8080/ipfs/QmcPx9ZQboyHw8T7Afe4DbWFcJYocef5Pe4H3u7eK1osnQ/ を使ってみてください。 まさにクールでしょう?

ちょっと問題があります: これはこのブログの古いバージョンです。 私はこの記事を書いてアップロードしている途中であり、アップロードするとハッシュが変わり、そのハッシュは最新の記事には含まれることがないからです……

解決方法はあります:

IPNSによるこのブログの不変のアドレス

IPNSの使い方はこちらで説明されています: The Inter-Planetary Naming System

私たちの、ノードが自分のサーバーで動いているケースでは、このようにします:

$ ipfs name publish QmcPx9ZQboyHw8T7Afe4DbWFcJYocef5Pe4H3u7eK1osnQ
Published to QmRf4ERGvYpVo6HRa2VueZT8pWi8YvyLS3rW6ad2y83tdN: /ipfs/QmcPx9ZQboyHw8T7Afe4DbWFcJYocef5Pe4H3u7eK1osnQ

このブログのアドレスは変化しません: QmRf4ERGvYpVo6HRa2VueZT8pWi8YvyLS3rW6ad2y83tdN

このアドレスは(私が先ほどのように実行した場合)静的ファイルを含むディレクトリを指し示します(index.htmlがそのディレクトリにある場合それが配信されます)。

あなたがこれを読んでいる時も、アドレスQmRf4ERGvYpVo6HRa2VueZT8pWi8YvyLS3rW6ad2y83tdNはまだホームページアドレスですが、コンテンツは新しいものになっています(記事を書いたらpublishしなおします)。

こうして、私たちの静的ブログは非中央集権化され、http://decentralized.blog:8080/ipns/QmRf4ERGvYpVo6HRa2VueZT8pWi8YvyLS3rW6ad2y83tdN/で利用できるようになりました。 今度はipfsのかわりにipnsとなっていることに注意してください。

IPFSは超クールであり、人生をより簡単にします。 ブログを改善する前に、ちょっとIPFS(とIPNS)の内部動作について見ていきたいです。