ビットコインで、ブロックチェーン内の取引から「取引の正当性検証」を行う方法

http://qiita.com/yanagisawa-kentaro/items/503dfce3762e3b1237c9
ビットコインブロックチェーンには「口座残高」というものは記録されておらず、「どの口座からどの口座にビットコインが幾ら移動したか」という取引データのみが記録されている。
これは取引の正当性チェックのために、各ノードが独自に取引から正当性検証をするための情報を構築する必要があることを示す。
単純に考えると、取引を集計していって口座ごとの残高が求めれば「取引の正当性検証」が可能だが、ブロックチェーン内に記録されている取引は膨大であるため現実的にはそんな集計を行っていてはいくら時間があっても処理が終わらない。



ではどうするのかというと
・「取引」には、1口座から1口座へのビットコイン移動を示す「取引明細」が複数含まれている。
・「取引」は、1個以上の「取引明細(既存分)」を"入力"として持ち、1個以上の「取引明細(新規作成分)」を"出力"として持つ。
・"入力"の合計と、"出力"の合計とは等しくなければならない。
・一度"入力"として消費された「取引明細」は、もう二度と別の取引の"入力"としては使えない。
という方法で、取引の正当性のチェックを行っている。
ちなみに、以下の様にお釣りを自分自身に渡すこともできるので、どんな入力に対しても好きな数のbtc受け渡しができる。

入力:口座X→口座A 10btc
出力:口座A→口座B 4btc
出力:口座A→口座A 6btc

ちなみに、手数料は"出力"の取引明細として採掘者がそれを追加する。



それでも「現在、消費されていない取引明細」はDBで管理する必要はある。
「現時点においてまだ消費されていない入金取引額(Unspent Transaction Output)」はUTXOと呼ばれている。
「現在、消費されていない取引明細」はチェーンの分岐などでロールバックが発生する可能性があり、さらにロールバックした結果が実は正しくなくて元の結果をさらに更新したものが正しかった、といった状況も無いとは言えないので、複雑なデータ管理が必要になる。
しかもその「複雑なデータ管理」に「取引の正当性検証」が依存するので、そこにバグが入り込む可能性を考えるとすこし怖い実装ではある。