2 章で仕分けたとき、17 個の記録のうち内容を持つものは 1 個だけでした。それが MetadataCreated の中の 2,872 バイトです。

data = 0x04009ab5bfa68348330fb182c0e8a8eb85… (2,872 バイト)

貼り付けても読めません。この章では、読めないデータがチェーンに載っているとき何が起きるのかを扱います。

暗号化されていることは、チェーンに書いてある

同じイベントに flags という項目が付いていました。

flags = 0x02

Ocean の仕様では、このフラグの各ビットが意味を持ちます(0x01 が lzma 圧縮、0x02 が ECIES 暗号化)。Ocean Node の実装も、0x02 をビットとして検査していました。

if ((flags & 2) !== 0) {          // 0x02 = ECIES で暗号化されている
  decrypt(encryptedDocument, EncryptMethod.ECIES)
}
if ((flags & 1) !== 0) {          // 0x01 なら LZMA で圧縮されている
  lzma.decompress(...)
}

今回は 0x02 なので、暗号化はされていて圧縮はされていない、と読めます。どう処理すればよいかがチェーン上に書いてあるわけです。

ECIES は楕円曲線を使った暗号方式で、対応する秘密鍵を持つ者だけが復号できます。

誰が復号できるのか

同じイベントに、もう 1 つ手がかりがあります。

decryptorUrl = http://…:8001

「復号を頼むサーバ」の URL です(Ocean の実装ではノードと呼びます)。ただし注意が必要で、この URL は道案内にすぎません。実際に復号できるのは、そのサーバが持っている秘密鍵です。

区別すると、こうなります。

必要なものどこにあるか
暗号化された本体チェーン上(消えない)
処理方法(flagsチェーン上(消えない)
復号先の URLチェーン上(消えない)
復号のための秘密鍵そのサーバの中だけ

URL を保っても、鍵が失われれば復号できません。逆に鍵さえあれば、どのサーバからでも復号できます。本質は鍵のほうにあります。

実際に試すとどうなるか

付属ツールは、チェーンに記録された decryptorUrl に問い合わせて、復号済みの内容を取得しようとします。

サーバが動いていれば、題名・説明・ライセンス・サービス定義が表示されます。動いていなければ、こう出ます。

記録された復号先に到達できません。サーバが止まっているか、接続を許していないかです。この状態では、資産の題名もライセンスも誰にも分かりません。チェーン上の記録は無傷なのに、です。

この本を書いている時点では、そのサーバは常時稼働していません。読者が試したときにどちらの表示になるかは、そのときの状態によります。どちらが出ても、それ自体がこの章の主題を示しています。

何が保証されていて、何が保証されていないか

「ブロックチェーンだから記録が永久に残る」と言われます。この例で永久なのは、次のものです。

  • 誰が、いつ、どのハッシュのメタデータを登録したか
  • 暗号化されたかたまり(読めないまま)
  • 復号先として記録された URL

一方、次のものはチェーンの外に依存しています。

  • メタデータの内容 — 復号できる鍵が残っているかどうか
  • データ本体 — 元の URL のサーバが生きているかどうか

つまり永続しているのはポインタとハッシュであって、中身の生存は別の仕組みに委ねられています。

長期保存の観点では、ここに向きの違う 2 つの力が働きます。暗号化は内容を守りますが、同時に鍵の管理が資料の可読性の条件になるということでもあります。平文で登録していれば、サーバが消えても題名と URL は誰でも読めました。暗号化したことで、鍵を失えば記述ごと読めなくなります。

どちらが良いという話ではなく、秘匿と可読性が交換関係にあるということです。何を暗号化し、鍵をどう保全するかは、公開範囲の設計と一体で決める必要があります。

読めないまま、正しさは確かめられる

もう 1 つ、同じイベントに載っていた項目があります。

metaDataHash = 0xc717a9eb053d7b23db3da5b30a26ba4c57a19939e697fc52c10691b055d5d78b

復号した結果からハッシュを計算し、この値と突き合わせれば、途中で書き換えられていないことを確認できます。

これは便利な性質です。復号を代行するサーバを完全に信用しなくても、返ってきた内容が登録時のものと同じかどうかは、受け取った側で検証できます。

ただし保証の範囲には注意が要ります。確かめられるのは「登録された内容と同じであること」までで、登録された内容そのものが正しいかどうかは別です。誤った題名を登録すれば、その誤った題名が改竄なく保存されます。

この章で見たこと

  • 暗号化されているかどうか、どう処理するかは flags としてチェーンに書かれている
  • 復号先の URL は道案内であり、本質はサーバが持つ秘密鍵のほう
  • 鍵を失うと、記録は無傷のまま内容が読めなくなる
  • 永続しているのはポインタとハッシュで、中身の生存はチェーンの外に依存する
  • 暗号化は秘匿と引き換えに、鍵の管理を可読性の条件にする
  • ハッシュにより、読めないまま改竄の有無だけは検証できる

次章では、ここまで見てきた「チェーンが保証すること」の外側——誰が登録したのかという身元の話に移ります。