コミットチェーン
コミットがノードとして連なっていて、各ノードは前のノードの属性値から得られたハッシュ値を、ノードハッシュとして持つ。
この構造はブロックチェーンに似ている。
{ Commit chain
{ Node -> { Node -> { Node -> ...
@Data @Data @Data
@NodeHash } @NodeHash } @NodeHash }
}
ノードにはデータを持たせる。ハッシュ値はそのデータを全部くっつけて計算する。
ノードは1つ前のノードのデータ列のハッシュ値を@NodeHash
としてもっているので、コミットチェーンの改ざんが難しくなる。
たとえば、コミットチェーンのノードを1つ改ざんしたとする。データやハッシュ値を。
だが、コミットチェーンを走査してノードのハッシュ値がちゃんと前のノードのデータ列のハッシュになっているかチェックすれば、改ざんは検出できる。
なぜならデータなどを改ざんすると計算されるハッシュ値も変わるからである。1つ先のノードは1つ前のノードのハッシュ値を記憶していて、それが再帰的に連なっているので、1つの改ざんによってチェイン全体のハッシュ値が変わる。
だがこの設計だと、コミット列の末尾ノードの改ざんは検出できないことになる。
ブロックチェーンはこの辺どうしてるんだろう?
蓋ノードを末尾にコミットする
末尾ノードの改ざんを検出できないのは仕方ないとして、では末尾ノードのデータを意味がないものにしたらどうだろうか。
つまりデータのコミットがあるたびにチェーンの末尾に蓋となるコミットを追加する。
[ Data commit ] -> [ Cap commit ] -> [ Data commit ] -> [ Cap commit ] -> ...
こうすれば末尾ノード(蓋)の改ざんは検出できないが、改ざんされても問題がないデータとなるので、チェーンの堅朗性が増すと思われる。
デメリットとしてデータ容量が倍になるということがある。
だが100000コミットで20MBなので、それが40MBになるぐらいであれば、十分許容範囲と言えるだろう。
何に使うのか?
このコミットチェーンを自作のCMSに実装してみた。
CMSの悩み事にコンテンツの改ざんチェックというのがある。悪意のあるログインによってコンテンツが勝手に投稿されたり更新されたりするという事態を想定するわけである。
コミットチェーンがあればノードに記事編集者のIPアドレスを持たせればコミッターのIPアドレスを検出できるし、記事編集の履歴はコミットとして残るので、調べることができる。また、記事のデータ列のハッシュ値もノードに持たせれば、コミットされていない記事の検出を行うこともできる。
記事の更新処理で自動でコミットをするようにすれば、少なくともログインのレイヤーでの操作は追跡できるようになる、という論理。
実装してみたところ・・・
PHPで実装してみたところ、20MBぐらい(100000コミット)のコミットチェーン・ファイルでもちゃんと動作するので、たぶんコンテンツが増えても動くと思う。
おわり。