FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

「Mastering Bitcoin」を読む (第5章 トランザクション)

「Mastering Bitcoin」を読んでいる。今回はトランザクションについて。 Bitcoinのトランザクションはどのような仕組みになっているのかを解説している。

個人的には、スタックベースのスクリプト言語を使っているというのが非常に面白い。

ビットコインとブロックチェーン:暗号通貨を支える技術

ビットコインとブロックチェーン:暗号通貨を支える技術

関連記事

これは著者が読んだ内容をまとめているだけなので、誤訳、理解不足により誤っている可能性があります!鵜呑みにしないようにお願いします。 文章の途中に挿入している画像は、 https://www.bitcoinbook.info/translations/ja/book.pdf に含まれている画像を使用させていただいています。

第05章 トランザクション

イントロダクション

f:id:msyksphinz:20180210122752p:plain

トランザクションのライフサイクル

  1. 組成 (orgazition)
  2. トランザクションが生成されると、資金の所有者により署名される。
  3. ブロードキャスト
  4. 個々のノードで検証される
    • 無効ならば棄却
  5. このトランザクションは署名されているため、どのような通信手段を使っても構わない。
  6. 検証
  7. マイニングノード

トランザクションの構造

  • 所有者だけが持っている秘密鍵でロックする
  • Locktime : 先日付小切手のようなもの

トランザクションインプットとアウトプット

トランザクションアウトプットの構成

  • satoshi単位であらわされたビットコイン金額
  • locking script (解除条件が含まれている)
  • UTXOへのポインタ
  • locking script : UTXOのロックを解除するためのスクリプト
    • 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言語

  1. unlocking scriptを実行する
  2. unlocking scriptの実行結果をスタックに残したまま、locking scriptを実行する。 → TRUEならば、成功である。

Script言語

  • スタックベースの非常にシンプルな言語
  • スタックに入っている値と、次のlocking scriptをつなげて、検証を行う。
  • チューリング不完全であるという性質を持っており、処理時間が予測できる。
  • すてーつれすであり、実行前の状態を使わず、実行後の状態も使わない。

2 7 OP_ADD 3 OP_SUB 1 OP_ADD 7 OP_EQUAL
f:id:msyksphinz:20180204220546p:plain

標準的なトランザクション

5つの標準的なトランザクションが存在する。 - Pay-to-Publishing Hash (P2PKH) - Pay-to-Public-Key - マルチシグネチャ - データアウトプット - Pay-to-Script-Hash (P2SH)

P2PKH

  • Locking scriptが含まれる。
f:id:msyksphinz:20180204220600p:plain

Pay-to-Public-Key

  • 公開鍵そのものを、locknig scriptに配置する。
  • アドレスをより短くして使いやすくする。

マルチシグネチャ

  • N個の公開鍵 + M個の署名 ( $M \le N$ )
  • セキュリティを高めることが目的。
  • (コインチェックの問題で話題になった)
  • 2-of-3マルチシグネチャの場合
  • 例1. : ボブとボブの奥さんのトランザクション
  • 例2. : ゴペッシュのビジネス
    • ビジネス用に2-of-3マルチシグネチャアドレスを持っている。
    • 少なくともビジネスパートナーの2人がトランザクションに署名をしなければ、このアドレスに紐づく資金を使うことができない。
  • N個の公開鍵とM個の署名で構成される場合
    • トランザクションアウトプットに含まれるlocking scriptには、N個の公開鍵を含むlocking scriptが含まれている。
    • トランザクションインプットに含まれるunlocking scriptには、N個の公開鍵に対応したM個の秘密鍵から作られた署名が含まれている。
    • M個の有効な署名を持っていることが、有効なunlocking scriptの条件となる。
f:id:msyksphinz:20180210122809p:plain

データアウトプット

  • トランザクションの日付を利用して、ファイルの存在証明を行う。
  • これらの無関係なトランザクションのために、データが肥大化してしまう。
  • 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アウトプットを使用しようとするまで、ビットコインネットワークには使用されない。