視点: ブロックチェーンと分散インターネット
アプリケーションのユーザーは、おそらく深く考えることもなく、自身が利用するアプリケーションに多大な信頼を置いている。特に Facebook や Google といった巨大なサービスは、個人的な写真や動画だけではなく、他のウェブアプリケーションへのシングルサインオン (Single Sign On) の形でユーザー自身のアイデンティティまで保存・管理する。近年この事実は多くの人々によって問題とみなされ、ユーザーがサードパーティを信頼する必要がない分散プラットフォーム (decentralized platform) への関心が高まっている。分散プラットフォームのシステムは Bitcoin といった暗号通貨を利用して構築される。ここで暗号通貨は金銭的価値があるために利用されるのではなく、暗号通貨自身がブロックチェーン (blockchain) と呼ばれる単一の組織が管理できない分散テクノロジをベースとしているために利用される。世間を取り巻く熱狂に惑わされないのは難しいことだが、本質的にブロックチェーンは分散されたログ (元帳) と言える。そのログには誰でも「事実」を書き込むことができ、その「事実」が記録されたことを後から世界の誰に対してでも証明できる。
Stacks (旧称 Blockstack) はブロックチェーンを含む分散プラットフォームのオープンソース実装である。さらに興味深い事実として、Stacks はインターネットアプリケーションで自己主権型アイデンティティ (self-sovereign identity) サービスを実装するベースとして用いられる。自己主権型アイデンティティサービスとは管理が分散化されたアイデンティティサービスを言う: このサービスは管理者を持たず、アイデンティティを誰が作れて誰が作れないかを制御する単一の原則が存在しない。
Stacks はコモディティのパブリックブロックチェーンを利用してアイデンティティデータベースのログを複製する。このログを Stacks ノードで再生すると、元となったブロックチェーンが同じであれば、システムに含まれる全てのアイデンティティの同じビューが任意の Stacks ノードで得られる。このブロックチェーンに情報を付け足すことで誰でもアイデンティティを Stacks に登録できる。
Stacks のアイデンティティプロトコルは特別なアイデンティティプロバイダを信頼することをユーザーに要求せず、代わりにブロックチェーンの意思決定を行うマイナー (miner) と呼ばれるノードの過半数を信頼することを要求する。具体的に言うと、データベースに対する書き込み (トランザクション) をマイナーが正しく取り扱うことをユーザーは信頼する必要がある。内部のブロックチェーンは暗号通貨を利用してマイナーにインセンティブを与える: 通常の運用において、マイナーは正直に振る舞うことで暗号通貨を最も多く手にする。この仕組みにより、Stacks のデータベースログは個別のサービス運営者を置くことなく改竄への耐性を得ている。ログの改竄を試みる攻撃者は、内部のブロックチェーンにおける偽造されたトランザクション履歴を過半数のマイナーで作成し、それが正当な書き込み履歴だとブロックチェーンのピアネットワークに信じさせる必要がある。
Stacks のアイデンティティデータベースログに対する読み込みと書き込みのプロトコルはブロックチェーンより上の論理的な層で操作を行う。ブロックチェーンのトランザクションがログエントリーを表すデータフレームとなる。クライアントはデータベースのログエントリーが埋め込まれたブロックチェーンのトランザクションを送信することでアイデンティティのデータベースログに追記を行い、ブロックチェーンのトランザクションからログエントリーを (ブロックチェーンが規定する順序で) 抜き出すことでログの読み込みを行う。この方式を用いれば、任意のブロックチェーンの「上」にデータベースログを実装できる。
Stacks におけるアイデンティティはユーザーが選択する名前によって区別される。Stacks のアイデンティティプロトコルは名前を公開鍵とルーティングステート (routing state, 後述) に関連付ける。名前の一意性は先着順で名前を割り当てることで保証される。
名前の割り当ては次の二つのステップからなる:
-
クライアントの名前のソルト1付きハッシュにクライアントの公開鍵を関連付ける。
-
実際にクライアントの名前を明かす。
ステップの分割はフロントランニング2を避けるために必要となる。名前を明かしてよいのは名前のソルト付きハッシュに署名したクライアントだけであり、ソルト付きハッシュを計算したクライアントだけがハッシュの原像 (名前) を明かすことができる。
Stacks における名前のそれぞれにはルーティングステートが関連付けられる。ルーティングステートには一つ以上の URL が含まれ、その URL がユーザーのアイデンティティ情報が見られるオンラインページを表す。このデータは大きいためにブロックチェーンに直接保存するとコストがかさむので、Stacks は間接参照の層を一つ追加している: アイデンティティデータベースのログにはルーティングステートのハッシュが書き込まれ、Stacks ピアはルーティングステートの拡散と認証を行うためのゴシップネットワークを実装する。なお、各 Stacks ピアはルーティングステートの完全なコピーを保持する。
以上の仕組みを使って名前に対応するアイデンティティの情報を入手する様子を図 215 に示す。クライアントはまず名前に対応する公開鍵とルーティングステートを Stacks ピアに問い合わせる (ステップ 1)。その後クライアントはルーティングステートに含まれる URL からアイデンティティ情報を入手し、それが名前に対応する公開鍵で署名されていることを検証することで認証を行う (ステップ 2)。
さらに広い視点
次章の視点: クラウドが新たなインターネットにを読めば、インターネットのクラウド化についてさらに知ることができる。
Stacks とインターネット分散化についてさらに学びたい場合は、Blockstack: A New Internet for Decentralized Applications, October 2017. を勧める。