著作一覧 |
昨日はブロックチェーン勉強会で、まずはbitcoinの仕組みの解説から。
教科書は山崎先生のBitcoinの技術
ノードは3つに分かれる。フルノード、その子分、マイナー。
フルノードはこれまでの全取引分のブロックを持つ。現在35GBくらい。起動時はそれを全部読みだして整合性をチェックする。子分はたかだか現在のブロックを持つ。マイナーは現在計算中のブロックを持てば良い(はず)。
取引の実行はあるノードが行う。このノードをAとすると、
取引は通常、AがBに金を払う。BがAに釣りを払う。Aがマイナーに0.001(1桁違うかも)払う。の3つ組。このとき、AはBに全持ち分を払い、実際の払い以外の釣りを受け取るものとする。すなわち、現在のAの有り高(なんで在で出てこない?)は、Aの最後の取引記録に残ることになる。Aはこれを自分が繋がっているすべてのピアへ送信する。
ピアはそれを他のピアへ送信する。(循環しないようにするのはGnutellaでもやっていることだから普通にプロトコルに入っているのだろう)
そのうちマイナーに到達する。
マイナーはそれを自身が持つブロックへ組み込む。ブロックには15個の取引用スロットと直前のブロックのハッシュが格納されている。今到達した取引が14番目であれば、そこに、15番目の取引として自分で自分に15(25かも)を払う取引を埋め込む(無から有が生じるところだ、おもしろい)。
そして、前のブロックのハッシュ込みでブロックのノンスを求める。ノンスは先頭何ビットかが0のもので、何ビットかはdifficultyで決まる。
他のマイナーにも到達している。14番目の取引であれば、同じように15番目を埋めてノンスを採掘しはじめる。
見つけたマイナーはこのブロックをブロードキャストする。
受け取ったノードはノンスが正しいかブロックをハッシュして求める。
求まれば、受け入れる。
後から来た、異なるノンスのブロックはリジェクトする。
リジェクトが返されたマイナーは自分の負けを知る(のか? リジェクトとは単に無視することかな?)。
受け入れられたマイナーは14個分の手数料と自身への取引を獲得する。
無意味な取引によるDoSを避けるために、取引の最小単位が決まっている。最小単位より小さい取引は受け付けない。ある保持者の持ち金は、フルノードが持つ全ブロックによって知ることができる。
嘘つきマイナーのブロックはハッシュすることで容易に弾ける。
P2Pである以上、あるマイナーに取引が1-16の順に到達し、1-14でマイニングが開始されているときに、2-16,1の順に到達して2-25でマイニングが開始されて両者がほぼ同時に確定することがある(1度か2度はあったらしい)。そのとき、それぞれが(到達順が異なるくらいにホップ数が離れていれば)近隣に受け入れられる可能性がある。この分岐はどこかの時点で差がつき、どちらかが数ブロック分破棄されることになる。(チェーンが長いほうが勝つ)
おもしろかった。
ジェズイットを見習え |