(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【暗号通貨/ブロックチェーン】送金手数料はトランザクションの中でどう仕組み化されているのか

スポンサーリンク

はじめに

一般的に暗号通貨の世界では送金を早くするためには送金手数料を高めに設定する必要があると言われています。

この一文、ブロックチェーン技術が理解できている人から見ると当たり前ではありつつも、そこの理由は明示的ではないので今回は技術的側面から開設しました。

本記事を読めば「なぜビットコインの送金手数料をわざわざ高めに設定する人がいるのか」が分かります。というのも送金手数料は少なければ少ないほど嬉しいはずなので。

事前知識

上記の質問に対する回答はトランザクションプールにトランザクジョンを入れるか入れないかはマイナーが選択できるからです。

そもそもブロックチェーンとは、分散型台帳技術の一つでブロックがまさしく鎖のように連なって構成されています。
とあるブロックの中には複数のトランザクションが格納されており、”AさんからBさんにX円送金する”というのもトランザクションの一例です。

ブロックの中にはトランザクション以外にも

  • 一つ前のブロックのハッシュ値
  • ルートハッシュ
  • ナンス

という値がブロックに格納されています。

f:id:mtiit:20181208223104j:plain
(ブロックの構成)


ここでの疑問として

「なぜ一つ前のブロックのハッシュ値」が格納されているのか?

というものがありますが、答えとしては「過去のトランザクションを書き換えるのを防止する」ためです。過去のブロックのトランザクションを一文字でも変えるとこのハッシュ値が大きく変わるため、改ざんを防ぐ役割があります。

次にルートハッシュ値(トップハッシュ値)と呼ばれる値ですが、これは新しいトランザクション(上の図でいうTx)群で構成される値で、図にもあるように全てのトランザクションから計算されるので新たなトランザクションが一つ追加されるとこの値も変わります。

TxやHashは具体的に何?

という質問への回答として、Txはトランザクション&それを扱いやすいような一定の長さの値に変換するのがHash。

要はTxを書き換えるとルートハッシュ値も変わってしまうのがポイントで、一つ前のブロックのハッシュ値とルートハッシュ値にぴったりあう値( ナンス )を見つけることができれば、ブロックを前のブロックの続きに繋げることができます。

現段階で、このぴったりあう値(ナンス)を簡単に見つける方法は見つかっていないので、総当たりで試しながらナンスを探します。
f:id:mtiit:20181208231239j:plain

上の図ではBlock1208ではナンスが既に確定しているので、各コンピュータはBlock1209のナンスを見つけようとしているという状態。

なぜナンスを求める作業を各コンピュータは行うのですか?

ブロックを繋げることに成功すると、そのブロックに含まれる全てのトランザクションの送金手数料とプラスアルファ*1を報酬として受け取れるからです。

ナンスを見つけて報酬を受け取ることをマイニングというため、ナンスの計算をしているコンピュータをマイナーと呼びます。

本題 :


さて、やっと送金手数料という用語が出てきました。ここらが本題です。
送金手数料とは、トランザクションTxの中に含まれていて、例えばCが以下のようなトランザクションTxCを発生させたとします。
f:id:mtiit:20181209095709j:plain
するとブロックチェーンは分散台帳なので他のコンピュータにも取引が伝搬していきますが、それをブロックに取り込むか取り込まないかはそれぞれのマイナーが決定することができます。そしてもし取り込む場合は同トランザクションをトランザクションプールというところに保管します。

分散台帳なのだからトランザクションプールの中身は全員同じでは?

という問いが頭に浮かびますが、トランザクションプールにはまだ検証されていないトランザクションが入っているのでこの部分は各参加者で違う可能性があります。

要は現在検証中のブロックはそれぞれが違う中身であり、ナンスを最初に発見した人のブロックが確定済みのブロックとして各参加者に通知されて共有されます。

ここが肝ですが一つのブロックに含むことができるトランザクションには上限が設定されているので、参加者は手数料が大きい取引をできるだけトランザクションプールに取り込もうとします。
よって、トランザクションが発生して他の参加者にも伝搬したにも関わらず、それが各自のトランザクションプールに取り込まれない可能性があります。

トランザクションがブロックプールに取り込まれないとなぜ困るんですか?

という問いの答えは、もしそのトランザクションを取り込んでいない参加者がナンスを発見すれば、その取引は少なくとも次のブロックで取り込まれるまでは成約されないことになるから。決済リクエストはだしているけど決済されません。

いくら手数料が高くてもトランザクションが伝搬されるのには時間がかかるので、トランザクションが届く前にナンスを発見すればそのトランザクションは取り込まれず次のブロックに回されてしまいます。
どのコンピュータがナンスを発見するか分からない以上は、届いたら90%取り込んでもらえるトランザクションと届いても10%しか取り込んでもらえないトランザクションでは後者の方が成約が遅れる可能性が高いということです。
そして、取り込まれるか否かは手数料で判断されます。

取り込まれたトランザクションと取り込まれなかったトランザクションはどうなるのですか?

取り込まれたトランザクションは次のブロックではトランザクションプールから消されます。
f:id:mtiit:20181209102720j:plain
上のようにBがナンスを発見し、ブロックを繋げることに成功したとします。
それぞれのコンピュータは、Bからその報告を受け取り、確かにナンスが正しいことを確認して次のブロックのナンス探しに移ります。
その際に、Bの報告に含まれているトランザクションの中で自分のトランザクションプールに入っているものがあれば除外します。AとCは、TxAとTxBが検証済みであることを知って自分のプールから除外してナンスを探すわけです。

この場合では、
TxCはBlockXでは取り込まれていませんのでBloxkX+1での成約が次のチャンスです。
f:id:mtiit:20181209103952j:plain

終わりに

なぜビットコインの送金を早くするためにはお送金手数料を高めに設定すればよいのかという問いへの答えは、トランザクションプールにトランザクジョンを入れるか入れないかはマイナーが選択できる から、です。

このあたりの知識はブロックチェーン技術の肝で、成約に至るまでの時間が保証されないというのは暗号通貨決済のネガティブな側面なので、覚えておくとどこかで役立つと思います。

*1:プラスアルファとはマイニング報酬のことを指します。例えばビットコインでは、一定期間毎に半減していき、最終的にはなくなります。