現在、翻訳とまとめ中です。
以下のMastering Bitcoinを参考にして、個人的に重要なところをまとめたものです。
Mastering Bitcoin Chapter 5. Transactions
序文
トランザクション・ライフサイクル
- origination
トランザクションの生成
小切手のようだ
トランザクションをビットコイン・ネットワークにブロードキャスト
- トランザクション: 300 – 400 bytes のデータ
- 送信者を信用する必要がない
- 安全でないネットワーク上でも送信可能(WiFi, Bluetooth, NFC, Chirp, バーコード, Webフォームへのコピペ)
ビットコイン・ネットワーク上のトランザクションの伝播
- トランザクションが、invalidの場合、ノードはリジェクトして、リジェクトメッセージを送信者に送り返す
トランザクションの構造
- データ構造: input, output
- inputs, outputsは、アカウントやIDとは関係がない
- inputs, outputs は、ビットコインの量として考えるべき
トランザクションの構造
サイズ | フィールド | 説明 |
---|---|---|
4 bytes | バージョン | どのルールに従うかを指定 |
1–9 bytes (VarInt) | 入力カウンタ | いくつの入力が含まれるか |
Variable | 入力 | 1つ以上のトランザクション入力 |
1–9 bytes (VarInt) | 出力カウンタ | いくつの出力が含まれるか |
Variable | 出力 | 1つ以上トランザクション出力 |
4 bytes | ロックタイム | Unixタイムスタンプか、ブロック番号 |
- トランザクション・ロックタイム
- トランザクションが、ブロックチェーンに追加されうる最も早い時間を定義する
- ほとんどのトランザクションでは、即時に実行させるため0をセットする
- ロックタイムが、0でなく5億以下の場合、ブロックの高さという意味に訳される
- それが意味することは、指定したブロックの高さより前にブロックチェーンに含まれない、ということ
- ロックタイムが、5億以上の場合、Unix Epochタイムスタンプに訳される
- 指定した時間より前にトランザクションがブロックチェーンに含まれないということ
トランザクションの出力、入力
- 未使用出力: UTXO (unspent transaction output)
- ユーザがビットコイン受け取った時は、その量がUTXOとしてブロックチェーンに記録される
- ユーザのビットコインは、トランザクションやブロックのあちこちに散らばっているかもしれない
- 事実上、ビットコイン・アドレスや口座の残高のようなものはない。あるのは、特定所有者にロックされているあちこちに散らばったUXTOだけ
- ユーザのビットコイン残高は、ウォレット・アプリケーションから作れれている
- ウォレットは、ブロックチェーンをスキャンし、ユーザ所有の全UXTOををまとめることで、ユーザの残高を計算している
- 20ビットコインのUXTOを持っていて、1ビットコインを支払いたい場合は、20ビットコインを消費して、2つの出力を作らないといけない。一つは、1ビットコインを送信者へ、もう一つは、19ビットコインをお釣りとして自分のウォレットへ。
-
結果、ほとんどのビットコイン・トランザクションは、お釣りを生成する
-
トランザクションにより消費されたUTXOを、トランザクション入力と呼ぶ
- トランザクションにより作られたUTXOを、トランザクション出力と飛ぶ
- 現在の所有者の署名でアンロックすることで、トランザクションはUTXOを消費する
-
新しい所有者のビットコイン・アドレスに対してロックすることで、UTXOを作り出す
-
出力、入力への例外は、コインベース・トランザクションと呼ばれる特殊な種類のトランザクション。各ブロックの最初のトランザクション
-
Tip: どちらが先か?入力か、出力か? コインベース・トランザクションがあるので、出力が先
トランザクション出力
- UTXO set か、UTXO pool
- トランザクション出力は、2つのパートからなる
- ビットコインの量。最小単位のsatoshi
- ロッキング・スクリプト。出力を使うための条件を指定することで上記量をロックするencumbrance(邪魔者?)としても知られる。
トランザクション出力の構造
サイズ | フィールド | 説明 |
---|---|---|
8 bytes | 量 | ビットコインの値(satoshis) (10^-8^ bitcoin) |
1-9 bytes (VarInt) | ロッキングスクリプトのサイズ | ロッキング・スクリプトの長さ(bytes) |
Variable | ロッキング・スクリプト | 出力を使うのに必要な条件を指定するスクリプト |
blockchain.info APIを呼んで、あるアドレスに関係するUTXOを見つけるスクリプト
# get unspent outputs from blockchain API
import json
import requests
# example address
address = '1Dorian4RoXcnBv9hnQ4Y2C1an6NJ4UrjX'
# The API URL is https://blockchain.info/unspent?active=
# 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'])
支払い条件 (encumbrances)
トランザクション入力
- 簡単に言えば、トランザクション入力は、UTXOへのポインタ
- UTXOがブロックチェーンに記録された場所のトランザクション・ハッシュとシーケンス番号へのリファレンスによって、特定のUTXOを指す
- UTXOを使うために、トランザクション入力はアンロッキング・スクリプトを含む
- アンロッキング・スクリプトは、通常ロッキング・スクリプトの中に入っているビットコイン・アドレスの所有権を証明する署名
サイズ | フィールド | 説明 |
---|---|---|
32 bytes | トランザクション・ハッシュ | 支払い用のUTXOを含むトランザクションへのポインタ |
4 bytes | 出力インデックス | 支払い用UTXOのインデックス番号。最初は0 |
1-9 bytes (VarInt) | アンロッキング・スクリプトのサイズ | アンロッキング・スクリプトの長さ(bytes) |
Variable | アンロッキング・スクリプト | UTXOのロッキングスクリプトの条件を満たすスクリプト |
4 bytes | シーケンス番号 | 現在、無効なTx-replacement機能, 0xFFFFFFFFに設定 |
- Note:
(まとめ途中。1/3位?)