次世代電子契約及び分散型応用ソフトウェア基盤#02

01

歴史
 分散型の電子貨幣の概念は、不動産登記簿等の別の応用と同様に、数十年間考えられてきたものである。1980年代及び1990年代の匿名電子貨幣手続きは大部分をChaumの不視化(Chaumian blinding)として知られている基本暗号要素(cryptographic primitive)に依存しており、高度な私事権確保性能を有する電子貨幣を提供したが、集中型の仲介者に依存していたため概して大きな支持を得ることはなかった。1998年、Wei Daiのb-moneyがパズルを解く計算及び分散型の合意を通して貨幣を作ろうという発想を導入した最初の提案となった。しかしながら、この提案には実際に分散型の合意を実現する方法の詳細に関して不備があった。2005年、Hal Finneyは「再使用可能な仕事証明(proof of work)」という概念を導入した。これはb-moneyの発想とAdam Backの計算の困難なHashcashパズルを組み合わせ、暗号貨幣(cryptocurrency)という概念を形作った仕組みであったが、これも又、背部で信用のある計算に依存していたため理想にまでは届かない不十分なものであった。
 貨幣は先願制度を応用したものであり、即ち、多くの場合において取引の順序が極めて重要であるから、分散型の貨幣を実現するには分散型の合意形成を可能にする方法が必要となる。長年に亘ってByzantine耐故障(Byzantine-fault-tolerant)の多数人合意形成方式に関する十分な研究がされてきたにも拘らず、提案されていた全ての手続きは問題の半分しか解決していなかった。Bitcoin以前の全ての貨幣手続きはこの問題に直面し、これを解決することができなかった。これらの手続きは全ての参加者が既知であるということを前提としており、「もしN人が参加しており、悪意のある人間がN/4人より少ないのならば、攻撃があっても耐えることができる」という形での安全性の余地を提供する。しかしながら、問題なのは匿名環境においてはこのような安全性の余地はSybil攻撃(Sybil attack)に対して脆弱であるということであり、即ち、単一の攻撃者であってもサーバ或いはボットネット上に数千の擬似的なノードを作成することができ、ネットワークを一方的に占有するためにこれらのノードを使用することができる。
 Satoshiが齎した革新的な発想は、非常に単純な分散型の合意形成手続きを繋ぎ合わせるというものである。ノードは仕事証明という機構を通して手続きに参加する権利を獲得し、10分毎に取引を組み込んだブロックを生成し、永遠に成長するブロック鎖を作っていく。多くの計算能力を有するノードはそれに比例する影響力を有するが、ネットワーク全体の計算能力を合わせたものよりも多くの計算能力を用意するのは100万個の擬似的なノードを用意するよりも遥かに困難である。Bitcoinのブロック鎖は粗雑であり、単純であるものの、目的の達成のためにはそれで十分であるということが分かってきており、これから5年を掛けて世界中の200を超える通貨や手続きの基盤となることだろう。


状態遷移系(state transition system)としてのBitcoin
 Bitcoinの元帳は技術的な観点から見ると状態遷移系と見做すことができる。即ち、既存の全てのBitcoinに対する、所有者であるという地位から構成される「状態」と、現在の状態及び取引を引数として取り、結果たる新しい状態を返す「状態遷移関数(state transition function)」から成る。例えば、標準的な銀行系においては、状態は貸借対照表であり、取引は口座Aから口座BへのXドルの移動要求であり、状態遷移関数は口座AからXドルを控除し、口座BにXドルを付加する。当初から口座Aの残高がXドル未満であった場合には、状態遷移関数は失敗する。従って、状態遷移関数は次のように形式的に定義することができる。

APPLY(S,TX) -> S' or ERROR

 上に示した銀行系の例の場合は次のようになる。

APPLY({ Alice: $50, Bob: $50 },"send $20 from Alice to Bob") = { Alice: $30, Bob: $70 }

 Bitcoinにおける「状態」は(技術的には「未使用の取引出力(unspent transaction outputs:UTXO)」と言われる)鋳造されたけれども未使用の、全てのBitcoinの集まりである。未使用の取引出力は夫々が額面価格と所有者を有する(所有者は20バイトの口座番号(address)によって表される。これは公開鍵を素にしたものである)。取引には1つ以上の取引入力(transaction input)が含まれ、更には、1つ以上の取引出力(transaction output)が含まれる。取引入力の夫々には既存の未使用の取引出力への参照と、所有者を表す口座番号に対応する秘密鍵による署名が含まれる。取引出力の夫々は新しい状態の一部として追加されることになる新しい未使用の取引出力である。
 状態遷移関数APPLY(S,TX) -> S'は大まかには次のように定義することができる。
  1.TXの取引入力の夫々について
    ・参照している取引出力がSに含まれない場合には、ERRORを返す。
    ・署名が参照している取引出力の所有者によるものでない場合には、ERRORを返す。
  2.TXの全ての取引入力の額面価格の合計がTXの全ての取引出力の額面価格の合計より小さい場合には、ERRORを返す。
  3.SからTXの取引入力が参照している全ての取引出力を取り除き、更にTXの全ての取引出力を追加したものを返す。
 1の1つ目の処理は支払い人が使用済みの取引出力を使用することができないようにし、2つ目の処理は他人の所有する取引出力を使用することができないようにする。2の処理は取引の前後で存在する額面価格が変わらないようにする。この手続きは決済の際には次のように使用される。AliceはBobに11.7BTC送金したいものとすると、Aliceは先ず自己の所有する未使用の取引出力の中から合計すると11.7BTC以上となるようなものの集まりを探し出す。現実的には合計すると丁度11.7BTCとなるようなものはないだろうから、例えば、最も11.7BTCに近いものが6BTC+4BTC+2BTC=12BTCであったとすると、Aliceは次にこれら3つを参照する取引入力と2つの取引出力から成る取引を作成する。1つ目の取引出力の額面価格は11.7BTCであり、口座番号はBobのものとなる。2つ目の取引出力は差し引き0.3BTCの「釣り銭」となり、所有者はAlice自身となる。