ブロックチェーンはGitと何が違うの?ということでブロックチェーンのようにGitで Proof-of-Work する。
暗号通貨の送金などのトランザクションがgit add
であり、ブロックチェーンのブロックがgit commit
である、として考える。
そうするとブロックチェーンはgitの履歴であり、トランザクションの確定はgit commit
を Proof-of-X することで信頼性(?)が担保される。
簡易的な Proof-of-Work を hooks/post-commit に書くことにする。
コミットのハッシュが特定の条件を満たさない場合はコミットのやり直しという感じ。
$ git commit --allow-empty -m foo
c501d4fd3d6522ac34f0977c87d2942b1438fb1c -
f28f9c80a4431fe9f2bd2cc806e1b0880ac58619 -
99513727ca14d70b336a1aaccd11e8c17a65e3c9 -
...
ad6e20750dc378eac2a15f73623fb49a0cf45973 -
00a824e2b63a0260e1bec773780d44b323b87b43 -
---
done 0s.
---
done 7s.
[master 3eaaac4] foo
なんか最後の出力がミスってるけど、とりあえずこれで。
$ git log --oneline
0058b75 add readme
0054dde add empty readme
00842e6 update command
009b8bc add post-commit file
0008b42 initial commit
コミットハッシュの先頭を00
に揃えることができた。
ランダムな文字列をコミットコメントに追加して PoW している。
コミットコメントやAuthor、Committerを自分の公開鍵のハッシュのみの固定文字にして変更不可にすれば、1秒ごとにマイニングするPoSになる、と思う。コミット時刻が変わるとハッシュが変わるので。
ブロックチェーンはトランザクションがブロードキャストされるので、これを更にブロックチェーンに近付けるならgit add
をブロードキャストするようにしなければいけない。
あとはコミットを検証してコミットハッシュが00
で始まらない場合や間違った計算のコミットはrecieve
もpull
も拒否しなければならない。
さて、上記ブロードキャストや検証の仕組みを作っても、今のままでは特に意味は無い。
単に面白いハッシュが作れるという以外の意味を見出すには、コミットに成功したらコインが増えるというような仕組みがないとどうしようもないよね。
普通のGitでいいじゃん、となる。
逆に言うと、自分のローカルのリポジトリが見ず知らずの他人によってブロードキャストされたデータで勝手に更新されるような環境だと、PoXが必要なのかもしれない。
ただし、そのデータの価値がコミットのPoXの価値と関連していなければ、やはり普通のGitでいいよね、となる。
ブロックチェーンをコイン以外の何かに使うことを考えるというのは、この0008b42
ハッシュが何かに使えるかと探すようなことかもしれない。