「Mastering Bitcoin」を読んでいる。今回はトランザクションについて。 Bitcoinのトランザクションはどのような仕組みになっているのかを解説している。
個人的には、スタックベースのスクリプト言語を使っているというのが非常に面白い。
- 作者: アンドレアス・M・アントノプロス,今井崇也,鳩貝淳一郎
- 出版社/メーカー: エヌティティ出版
- 発売日: 2016/07/14
- メディア: 大型本
- この商品を含むブログ (7件) を見る
関連記事
- 「Mastering Bitcoin」を読む (第1章 イントロダクション・第2章 ビットコインの仕組み)
- 「Mastering Bitcoin」を読む (第4章 鍵、アドレス、ウォレット)
- 「Mastering Bitcoin」を読む (第5章 トランザクション)
- 「Mastering Bitcoin」を読む (第8章 マイニングとコンセンサス)
これは著者が読んだ内容をまとめているだけなので、誤訳、理解不足により誤っている可能性があります!鵜呑みにしないようにお願いします。 文章の途中に挿入している画像は、 https://www.bitcoinbook.info/translations/ja/book.pdf に含まれている画像を使用させていただいています。
第05章 トランザクション
イントロダクション
トランザクションのライフサイクル
- 組成 (orgazition)
- トランザクションが生成されると、資金の所有者により署名される。
- ブロードキャスト
- 個々のノードで検証される
- 無効ならば棄却
- このトランザクションは署名されているため、どのような通信手段を使っても構わない。
- 検証
- マイニングノード
トランザクションの構造
- 所有者だけが持っている秘密鍵でロックする
- Locktime : 先日付小切手のようなもの
トランザクションインプットとアウトプット
- 未使用トランザクションアウトプット (UTXO)
- 分割不可能
- 分割するときは、おつりのトランザクションを生成する。
- ウォレットの残高は、ウォレットがユーザのすべてのUTXOを集め、残高を計算しているだけ。
- 分割不可能
- UTXO → トランザクションインプット → トランザクションアウトプット
- 例外 : coinbaseトランザクション。マイナーによりブロックの先頭に取り付けられる。
トランザクションアウトプットの構成
- satoshi単位であらわされたビットコイン金額
- locking script (解除条件が含まれている)
- UTXOへのポインタ
- locking script : UTXOのロックを解除するためのスクリプト
- UTXOの中から、支払い可能なものを選択し、署名を含むunlocking scriptを生成する。
トランザクション手数料
- UTXOの中から、支払い可能なものを選択し、署名を含むunlocking scriptを生成する。
- マイニングするために必要
- 値段 : データサイズ・市場原理に基づいて生成される。
- Input - Output で自動的に手数料が決まってしまう。
- 例: Inputが20BTCで、1BTCの買い物をした場合、おつりで19BTCを生成しないと、それがそのままマイナーに渡ってしまう!
# get unspent outputs from blockchain API import json import requests # example address address = '1Dorian4RoXcnBv9hnQ4Y2C1an6NJ4UrjX' # The API URL is https://blockchain.info/unspent?active=<address> # It returns a JSON object with a list "unspent_outputs", containing UTXO, like this: #{ "unspent_outputs":[ # { # "tx_hash":"ebadfaa92f1fd29e2fe296eda702c48bd11ffd52313e986e99ddad9084062167", # "tx_index":51919767, # "tx_output_n": 1, # "script":"76a9148c7e252f8d64b0b6e313985915110fcfefcf4a2d88ac", # "value": 8000000, # "value_hex": "7a1200", # "confirmations":28691 # }, # ... #]} resp = requests.get('https://blockchain.info/unspent?active=%s' % address) utxo_set = json.loads(resp.text)["unspent_outputs"] for utxo in utxo_set: print("%s:%d - %ld Satoshis" % (utxo['tx_hash'], utxo['tx_output_n'], utxo['value']))
dbb3853afdb127cb7555bf44a033fa69b57335720132b8c016239ca80e4e570b:0 - 101010 Satoshis
トランザクションの連鎖とオーファントランザクション
トランザクションscriptとScript言語
- unlocking scriptを実行する
- unlocking scriptの実行結果をスタックに残したまま、locking scriptを実行する。 → TRUEならば、成功である。
Script言語
- スタックベースの非常にシンプルな言語
- スタックに入っている値と、次のlocking scriptをつなげて、検証を行う。
- チューリング不完全であるという性質を持っており、処理時間が予測できる。
- すてーつれすであり、実行前の状態を使わず、実行後の状態も使わない。
例
2 7 OP_ADD 3 OP_SUB 1 OP_ADD 7 OP_EQUAL
標準的なトランザクション
5つの標準的なトランザクションが存在する。 - Pay-to-Publishing Hash (P2PKH) - Pay-to-Public-Key - マルチシグネチャ - データアウトプット - Pay-to-Script-Hash (P2SH)
P2PKH
- Locking scriptが含まれる。
Pay-to-Public-Key
- 公開鍵そのものを、locknig scriptに配置する。
- アドレスをより短くして使いやすくする。
マルチシグネチャ
- N個の公開鍵 + M個の署名 ( $M \le N$ )
- セキュリティを高めることが目的。
- (コインチェックの問題で話題になった)
- 2-of-3マルチシグネチャの場合
- 署名者の3つの公開鍵
- このうちの2つを使って有効なトランザクションを作る。
- 例1. : ボブとボブの奥さんのトランザクション
- 例2. : ゴペッシュのビジネス
- N個の公開鍵とM個の署名で構成される場合
データアウトプット
- トランザクションの日付を利用して、ファイルの存在証明を行う。
- これらの無関係なトランザクションのために、データが肥大化してしまう。
- OP_RETURNは、UTXOセットに保持される必要のない "明示的使用不可アウトプット" を作り出す。
- 使用するための、 unlocking script は存在しない。
Pay-to-Script-Hash (P2SH)
2 <Mohammed's Public Key> <Partner1 Public Key> <Partner2 Public Key> <Partner3 Public Key> <Attorney Public Key> 5 OP_CHECKMULTISIG 2 04C16B8698A9ABF84250A7C3EA7EEDEF9897D1C8C6ADF47F06CF73370D74DCCA01CDCA79DCC5C395D7EEC6984D83F1F50C900A24DD47F569FD4193AF5DE762C58704A2192968D8655D6A935BEAF2CA23E3FB87A3495E7AF308EDF08DAC3C1FCBFC2C75B4B0F4D0B1B70CD2423657738C0C2B1D5CE65C97D78D0E34224858008E8B49047E63248B75DB7379BE9CDA8CE5751D16485F431E46117B9D0C1837C9D5737812F393DA7D4420D7E1A9162F0279CFC10F1E8E8F3020DECDBC3C0DD389D99779650421D65CBD7149B255382ED7F78E946580657EE6FDA162A187543A9D85BAAA93A4AB3A8F044DADA618D087227440645ABE8A35DA8C5B73997AD343BE5C2AFD94A5043752580AFA1ECED3C68D446BCAB69AC0BA7DF50D56231BE0AABF1FDEEC78A6A45E394BA29A1EDF518C022DD618DA774D207D137AAB59E0B000EB7ED238F4D800 5 OP_CHECKMULTISIG
→ これを20バイトの暗号化ハッシュで表現する。
Pay-to-Script-hash の利点
- トランザクションの削減
- 実装の簡素化
- scriptを校正する負担を、送りてから受け手に移す。
- データストレージの負担を最小化する。
- 負担が生じる時刻を移す。
- 手数料の負担削減
redeem script と isStandard 検証
- redeem script は P2SHアウトプットを使用しようとするまで、ビットコインネットワークには使用されない。