-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTransaction.mediawiki
129 lines (103 loc) · 9.81 KB
/
Transaction.mediawiki
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
= トランザクション =
トランザクションとは、ビットコインの価値の移転のことである。トランザクションはP2Pネットワークに公開され、ブロックにまとめられる。一般にトランザクションは1つ前のトランザクションアウトプットを新しいトランザクションのインプットとして参照し、そしてそのインプット全てを、新しいアウトプットとして利用する。トランザクションは暗号化されていないため、誰もがブロックとして集められたすべてのトランザクションを閲覧することができる。
標準的なトランザクションアウトプットはアドレスを指定し、将来それをインプットとして使用するには適切な電子署名が必要である。
すべてのトランザクションはブロックチェーン上に公開されており、hex editorを用いて閲覧できる。[https://en.bitcoin.it/wiki/Category:Block_chain_browsers ブロックチェーンブラウザ]と呼ばれる類のウェブサイトでは、ブロックチェーンに含まれる全てのトランザクションを人間に理解しやすい形で見ることができる。ブロックチェーンブラウザは実行中のトランザクションのテクニカルな詳細を確認したり、支払いを証明したりするのに便利である。
== ビットコイン・トランザクションの一般的なフォーマット(1ブロック内) ==
{|
!width="18%"| Field
!align="right" width="19%"| Description
!align="center" width="20%"| Size
|-
| Version no
|align="right"| currently 1
|align="center"| 4 bytes
|-
| In - counter
|align="right"| positive integer VI = VarInt
|align="center"| 1-9 bytes
|-
| list of inputs
|align="right"| the first input of the first transaction is also called "coinbase" (its content was ignored in earlier versions)
|align="center"| <in-counter> many inputs
|-
| Out-counter
|align="right"| positive integer VI = VarInt
|align="center"| 1-9 bytes
|-
| list of outputs
|align="right"| the outputs of the first transaction spend the mined bitcoins for the block
|align="center"| <out-counter> many outputs
|-
| lock_time
|align="right"| if non-zero and sequence numbers are <0xFFFFFFFF: block heightor timestamp when transaction is final
|align="center"| 4 bytes
|}
== インプットとアウトプットが1つずつの原始的なトランザクションの例 ==
=== データ ===
<pre>Input:
Previous tx: f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd04470b9a6
Index: 0
scriptSig: 304502206e21798a42fae0e854281abd38bacd1aeed3ee3738d9e1446618c4571d10
90db022100e2ac980643b0b82c0e88ffdfec6b64e3e6ba35e7ba5fdd7d5d6cc8d25c6b241501
Output:
Value: 5000000000
scriptPubKey: OP_DUP OP_HASH160 404371705fa9bd789a2fcd52d2c580b65d35549d
OP_EQUALVERIFY OP_CHECKSIG</pre>
=== 説明 ===
このトランザクションのインプットでは、アウトプット#0のトランザクション f5d8... から50BTCをインポートしている。そしてそのアウトプットが50BTCをビットコインアドレスに送る(ここでは通常の[https://bitflyer.jp/ja/glossary/base58 base58]ではなく16進数 4043... で表されている)。このトランザクションでビットコインを受け取った人がこのビットコインを使用したい時は、彼のトランザクションのインプット内にあるこのトランザクションのアウトプット#0を参照する。
=== インプット ===
インプットとは、1つ前のトランザクションからのアウトプットへの参照である。? トランザクションには複数のインプットが存在することが多い。新しいトランザクションの全てのインプットの値(=新しいトランザクションが参照した複数アウトプットの合計の値)が足し合わされて、それが全て新しいトランザクションのアウトプットとして完全に使用される。"Previous tx"は、1つ前のトランザクションのハッシュ値を指す。"Index"は参照されたトランザクションの中の特定のアウトプットである。"ScriptSig"は、スクリプトの前半部分に当たる(詳しくは後に説明する)。
スクリプトは2つの構成要素からなる:署名と公開鍵だ。公開鍵はredeemedアウトプットのスクリプトに書かれているハッシュ値と合致しなければならない。公開鍵は所有者の署名を検証するために使われる。これが2つめの構成要素である。より正確には、2つ目の構成要素は簡略化されたバージョンのトランザクションのハッシュ値に署名されたECDSA(楕円曲線暗号)署名である。その署名が、公開鍵と組み合わされて、トランザクションがビットコインの本当の所有者によって作成されたことを証明する。様々なflags がトランザクションがどのように簡略化されたのかを定義し、色々なタイプのペイメントを作るのに使うことができる。
=== アウトプット ===
アウトプットには、ビットコインを送るための指示(手順)が書かれている。"Value"は、このアウトプットが宣言された時のビットコインの価値で、単位はSatoshi(1BTC= 100,000,000Satoshi)である。"scriptPubKey"は、スクリプトの後半部分である。トランザクションは複数のアウトプットをもつことができ、それらがインプットの合計値を共有する。1つのトランザクションのアウトプットはそれに続くトランザクショントランザクションのインプットによって1度のみ参照されるため、そのビットコインを失いたくない場合は合計の合計の入力値をアウトプットに送信する必要がある。インプットが50BTCで、しかし25BTCのみを送りたいという場合には、ビットコインは送信先と自分自身の2つのアウトプットを作成する(自分へのアウトプットは「おつり」である)。アウトプットで使用されなかった余りのビットコインは取引手数料と考えられ、ブロックを生成した生成した人が受け取ることになる。
=== 検証 ===
== トランザクションの種類 ==
現在ビットコインは2つの異なる scriptSigとscriptPubKeyのペアを生成する。これらは以下で説明する。 より複雑なタイプのトランザクションを設計し、それらを互いにリンクさせて暗号学的に実行されるような合意を設計することも可能である。これは[https://en.bitcoin.it/wiki/Contract コントラクト]として知られている。
=== Pay-to-PubkeyHash(P2PH) ===
<pre>scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
scriptSig: <sig> <pubKey></pre>
ビットコインアドレスはハッシュ値に過ぎないので、送信者はscriptPubKeyに完全な公開鍵を提供できるわけではない。ビットコインアドレスに送信されたコインを使用する時、受信者は署名と公開鍵の両方を提供する。スクリプトは、提供された公開鍵がscriptPubKey内のハッシュに対応していることを検証し、公開鍵に対する署名も確認する。
チェックのプロセス:
{|
!width="18%"| Stack
!align="right" width="19%"| Script
!align="center" width="20%"| Description
|-
| Empty.
|align="right"| <sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
|align="center"| scriptSig and scriptPubKey are combined.
|-
|
|-
| <sig> <pubKey>
|align="right"| OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
|align="center"| Constants are added to the stack.
|-
| <sig> <pubKey> <pubKey>
|align="right"| OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
|align="center"| Top stack item is duplicated.
|-
| <sig> <pubKey> <pubHashA>
|align="right"| positive integer VI = VarInt
|align="center"| 1-9 bytes
|-
| <sig> <pubKey> <pubHashA> <pubKeyHash>
|align="right"| OP_EQUALVERIFY OP_CHECKSIG
|align="center"| Constant added.
|-
| <sig> <pubKey>
|align="right"| OP_CHECKSIG
|align="center"| Equality is checked between the top two stack items.
|-
| true
|align="right"| Empty.
|align="center"| Signature is checked for top two stack items.
|}
=== Pay-to-Script-Hash(P2SH) ===
<pre>scriptPubKey: OP_HASH160 <scriptHash> OP_EQUAL
scriptSig: ..signatures... <serialized script></pre>
<pre>m-of-n multi-signature transaction:
scriptSig: 0 <sig1> ... <script>
script: OP_m <pubKey1> ... OP_n OP_CHECKMULTISIG
</pre>
P2SHアドレスは、送金元から次の権利者(受信者)に、トランザクションを実行する条件を提供する責任を移転する目的で作成される。P2SHアドレスによって送信者は、20バイトハッシュを用いて、複雑さを問わない任意のトランザクションを行うことができる。pay-to-script-hashは、scriptPubKeyとscriptSigの特定の定義を持つPay-to-pubkey-hashとは異なり、複雑なトランザクションの手段を提供する。この仕様書はスクリプトに制限を設けていないため、これらのアドレスを使用してあらゆる契約に資金提供ができる。 資金調達トランザクションのscriptPubKeyは、redeemingトランザクションで提供されたスクリプトがアドレスの作成に使用されたスクリプトにハッシュされることを保証するスクリプトである。 上記のscriptSigでは、 'signature'は、次のシリアライズされたスクリプトを満たすのに十分な任意のスクリプトを参照する。