ビットコインに参加するには

ビットコインのネットワークに加わり、ビットコインを使うためには、Wallet(財布)というソフトを、例えば、Bitcoin Foundationからダウンロードしてインストールする必要がある。このWalletソフトにビットコインの世界を作っているメカニズムが組み込まれている。

Walletは通信機能をもっており、データベースから接続するノードを見つけて接続を確立する。この接続には中心になるサーバは存在せず、それぞれのノードが幾つかのノードと繋がっているというフラットなネットワークである。そして、接続相手は対等な仲間(Peer)であるのでPeer-to-Peerネットワークと言われる。すべてのノードはどこかでは繋がっているのであるが、どのように繋がっているのかは分からないし、ノードの電源が切られていたりすると、切り離されたノードが出来たりする。 しかし、接続が回復すると、接続されているPeerノードから最新の状態を教えてもらってネットワークに復帰するので問題は生じない。

ビットコインを手に入れる方法は幾つもあるが、普通の人がビットコインを手に入れる場合は、物やサービスを販売して、その対価をビットコインで受け取るか、あるいは交換所で円やドルをビットコインに交換するという方法が一般的であろう。そして、ビットコインを入手するとWalletに記憶され、それを使って支払いをすることができるようになる。

ビットコインを支払うトランザクション

ビットコインという名前がついているので、電子的に作られたコインがあるように思うかも知れないが、実はコインに相当するものはなく、ビットコインを幾ら、誰に支払うという証文の集まりがビットコインというシステムを形成している。自分が受け取った証文に書いてある金額の合計が自分のWalletに入っている金額ということになる。

ビットコインで支払いを行う場合は、誰に幾ら払うという証文を書き、それが正式なものであることを示すためにサイン(署名)する。この証文をトランザクション(Transaction)と呼ぶ。しかし、トランザクションは電子的な情報なので、或る意味、簡単に書き換えができてしまう。これでは都合が悪いので、図4のように暗号と連鎖で保護されるようになっている。

図4 トランザクションの形式と連鎖

図4は、BからCへの支払いを説明する図で、Bは、左に書かれたAからBへの支払いで受け取ったビットコインをCに支払っている。Aからの支払いのトランザクションのハッシュを支払いの原資となるトランザクションとして指定し、それにBからCへの支払いのトランザクション本体のデータを加えてBの秘密鍵を使ってサインを行う。これで、原資となるトランザクションの指定、Cのアドレスや支払額などが暗号で保護される。

Cがこのトランザクションを受け取り、BのサインをBの公開鍵で確認し、一致すれば保護されたデータは改変されていないことが分かる。また、原資となる(図の左側の)トランザクションをそのハッシュから探し、支払先アドレスがBの公開鍵のハッシュとなっていれば、それがBへの支払いであることが確認できる。

つまり、暗号技術を使って、BからCへのトランザクションが、Bが作った正真のトランザクションであり、支払額は、以前のAからBへの支払いで受け取ったビットコインが原資になっており、Bには支払能力があることが確認できるようになっている。

なお、Walletは、秘密鍵と公開鍵のペアを生成し、秘密鍵を保持するツールでもある。Bitcoinシステムとしては暗号で保護されていても、もし、Walletが動作しているPCやスマホにマルウェアが侵入して秘密鍵を盗まれてしまうと、そのWalletの所有者に成りすまして、財布の中身が抜き取られてしまうことが起こり得るので注意が必要である。

前記の例は、1つの入力と1つの出力を持つ単純なものであるが、トランザクションの一般形は図5のようになっており、複数の入力と複数の出力を持つことができるようになっている。

また、入力と出力をどのように扱うかを指定するスクリプトが書けるようになっている。スクリプトは一種の言語であり、例えば、買い手が品物を受け取ってから支払を承認するなど、色々な取扱いを指定することができるが、ここではスクリプトの詳細は省略する。

図5 トランザクションの一般形

トランザクションは入力カウンタで指定した個数の入力を持つことができ、それに続いて、それぞれの入力に対して右側に示した入力の記述を並べたリストを持つ。

入力の記述は、支払いの原資となる受取トランザクションのインデックスとHash値、そして、そのトランザクションの中の出力番号、支払を承認する秘密鍵を使ったBの署名と公開鍵をスクリプトの形で記述する。原資となる出力のビットコインの全額が入力として使われ、一部だけを使うことはできないので、入力の記述には金額の記述はない。

しかし、支出と一致する受取トランザクションがあるとは限らないので、後述のように、お釣りを自分に支払う出力を設けることで対処する。

続いて、出力側も同様に、出力カウンタで指定した個数の出力を持つことができ、右側に書いた出力の記述が個数分並ぶ。出力の記述は支払額と支払先のBitcoin Address、この支払のサインを確認する公開鍵などをスクリプトの形で含む。

ロック時間は、このトランザクションが使用可能になるまでの時間を指定するもので、その時間が経過するまで、このトランザクションはブロックには含めることができず、正式の取引として確認されない。なお、値が5億未満の場合は、ロック時間の単位は追加ブロック数、それ以上の場合はUnixのタイムスタンプの値である。また、出力のシーケンス番号が0xffffffffの場合は、ロック時間は無視される。

この複数入力と複数出力の機能を使って、A1からB、A2からBへの支払いの受取額をまとめて、Bはその中からCに支払をすることができるし、入力の合計額がCへの支払額より大きすぎる場合は、Cへの支払いとDへの支払いとか、自分へのお釣り(Change)の出力を設けることもできる。

しかし、トランザクションの中にビットコインを残すことはできず、入力の合計額と出力の合計額の差額は、取扱い手数料として採掘者の取り分になることになっている。

小切手ならば、それを受取人に送り、受取人が銀行などで換金すれば取引が成立するのであるが、ビットコインのトランザクションはすべて電子的に作られ、電子的に処理される。そのため、処理の仕方はユニークである。

受取人は、支払の請求に先立って、Walletで生成したビットコインアドレスを支払人に送って置く。また、Webマーケットなどでは、QRコードでアドレスをWebページに貼り付けて置き、お客はそのアドレスに支払を行う。

支払いのトランザクションは、受取人だけでなく、全員に送られる。ネットワークがPeer-to-Peerであるので、多くの場合、直接、受取人に送ることはできないし、どの経路で送ったら良いかも分からない。このため、バケツリレー的に全員に送る。