Use Terms "Pubkey Script" And "Signature Script"

This modifies commits provided by @petertodd to use the terms "pubkey
script" and "signature script" instead of other terms.

* Rename "scriptPubKey" and "output script" to "pubkey script"
  (suggested by @luke-jr). We leave a token "scriptPubKey" at the point
  where we define pubkey script so that searchers can find it.

* Rename "scriptSig" to "signature script" (suggested by @luke-jr). We
  also leave a token "scriptSig" at this definition point.

* Rename "redeemScript" to "redeem script"

* Defined ECDSA on secp256k1 curve as the crypto used in the Transaction
  section and added references to secp256k1 private/public keys and
  signatures.

* Removed "The Parts Of A Transaction" illustration by commenting it out
  in the HTML. Shoehorning the pubkey/signature script terms into this
  image was becoming difficult, and I'm not very fond of that
  illustration anyway. I'll see if I can think of a nicer replacement
  illustration for some point in the future.

* Add a short paraphrased version @petertodd's description of scripts as
  generalized crypto.

* Updated all the illustrations which referred to either pubkey scripts
  or signature scripts to use these terms.
This commit is contained in:
David A. Harding 2014-09-20 15:07:42 -04:00
parent 89cb2fff08
commit 6afc6835bf
No known key found for this signature in database
GPG key ID: 4B29C30FF29EC4B7
29 changed files with 408 additions and 407 deletions

View file

@ -144,8 +144,12 @@ proof of work:
proof-of-work: proof of work proof-of-work: proof of work
protocol buffer: protobuf protocol buffer: protobuf
protocol buffers: protobuf protocol buffers: protobuf
pubkey: public key
pubkey hash: pubkey hash:
pubkey hashes: pubkey hash pubkey hashes: pubkey hash
pubkey script:
pubkey scripts: pubkey script
pubkeys: public key
public key: public key:
public keys: public key public keys: public key
public key infrastructure: pki public key infrastructure: pki
@ -154,7 +158,7 @@ raw format:
rawtransaction format: raw format rawtransaction format: raw format
receipt: receipt:
recurrent rebilling: recurrent rebilling:
redeemScript: redeem script:
refund: refund:
refunds: refund refunds: refund
regression test mode: regression test mode:
@ -165,12 +169,8 @@ RPCs: rpc
RPC: RPC:
satoshi: satoshi:
satoshis: satoshi satoshis: satoshi
scriptPubKey:
'`script`': pp script '`script`': pp script
script hash: script hash:
scriptPubKeys: scriptPubKey
scriptSig:
scriptSigs: scriptSig
secp256k1: secp256k1:
sequence number: sequence number:
sequence numbers: sequence number sequence numbers: sequence number
@ -183,6 +183,8 @@ SIGHASH: signature hash
'`SIGHASH_SINGLE|SIGHASH_ANYONECANPAY`': shs_shacp '`SIGHASH_SINGLE|SIGHASH_ANYONECANPAY`': shs_shacp
signature: signature:
signature hash: signature hash:
signature script:
signature scripts: signature script
signatures: signature signatures: signature
SPV: SPV:
stack: stack:

View file

@ -250,13 +250,13 @@ amount = 10000000 ## In satoshis
## P2PKH pubkey hash ## P2PKH pubkey hash
pubkey_hash = "2b14950b8d31620c6cc923c5408a701b1ec0a020" pubkey_hash = "2b14950b8d31620c6cc923c5408a701b1ec0a020"
## P2PKH output script entered as hex and converted to binary ## P2PKH pubkey script entered as hex and converted to binary
# OP_DUP OP_HASH160 <push 20 bytes> <pubKey hash> OP_EQUALVERIFY OP_CHECKSIG # OP_DUP OP_HASH160 <push 20 bytes> <pubKey hash> OP_EQUALVERIFY OP_CHECKSIG
# 76 a9 14 <pubKey hash> 88 ac # 76 a9 14 <pubKey hash> 88 ac
hex_script = "76" + "a9" + "14" + pubkey_hash + "88" + "ac" hex_script = "76" + "a9" + "14" + pubkey_hash + "88" + "ac"
serialized_script = hex_script.decode("hex") serialized_script = hex_script.decode("hex")
## Load amount and script into PaymentDetails ## Load amount and pubkey script into PaymentDetails
details.outputs.add(amount = amount, script = serialized_script) details.outputs.add(amount = amount, script = serialized_script)
## Memo to display to the spender ## Memo to display to the spender
@ -286,24 +286,24 @@ hex_script = "76" + "a9" + "14" + pubkey_hash + "88" + "ac"
serialized_script = hex_script.decode("hex") serialized_script = hex_script.decode("hex")
{% endhighlight %} {% endhighlight %}
`script`: (required) You must specify the output script you want the spender to `script`: (required) You must specify the pubkey script you want the spender to
pay---any valid script is acceptable. In this example, we'll request pay---any valid pubkey script is acceptable. In this example, we'll request
payment to a P2PKH output script. payment to a P2PKH pubkey script.
First we get a pubkey hash. The hash above is the hash form of the First we get a pubkey hash. The hash above is the hash form of the
address used in the URI examples throughout this section, address used in the URI examples throughout this section,
mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QN. mjSk1Ny9spzU2fouzYgLqGUD8U41iR35QN.
Next, we plug that hash into the standard P2PKH output script using hex, Next, we plug that hash into the standard P2PKH pubkey script using hex,
as illustrated by the code comments. as illustrated by the code comments.
Finally, we convert the output script from hex into its serialized form. Finally, we convert the pubkey script from hex into its serialized form.
{% highlight python %} {% highlight python %}
details.outputs.add(amount = amount, script = serialized_script) details.outputs.add(amount = amount, script = serialized_script)
{% endhighlight %} {% endhighlight %}
`outputs`:<!--noref--> (required) add the output script and (optional) amount to the `outputs`:<!--noref--> (required) add the pubkey script and (optional) amount to the
PaymentDetails outputs<!--noref--> array. PaymentDetails outputs<!--noref--> array.
It's possible to specify multiple [`scripts`][pp It's possible to specify multiple [`scripts`][pp

View file

@ -703,7 +703,7 @@ variable.
Decode the signed raw transaction so we can get its txid. Also, choose a Decode the signed raw transaction so we can get its txid. Also, choose a
specific one of its UTXOs to spend and save that UTXO's output index number specific one of its UTXOs to spend and save that UTXO's output index number
(vout) and hex output script (scriptPubKey) into shell variables. (vout) and hex pubkey script (scriptPubKey) into shell variables.
{% highlight bash %} {% highlight bash %}
> bitcoin-cli -regtest getnewaddress > bitcoin-cli -regtest getnewaddress
@ -763,16 +763,16 @@ transaction hex unchanged.
As illustrated above, the data that gets signed includes the txid and As illustrated above, the data that gets signed includes the txid and
vout from the previous transaction. That information is included in the vout from the previous transaction. That information is included in the
`createrawtransaction` raw transaction. But the data that gets signed `createrawtransaction` raw transaction. But the data that gets signed
also includes the output script from the previous transaction, even also includes the pubkey script from the previous transaction, even
though it doesn't appear in either the unsigned or signed transaction. though it doesn't appear in either the unsigned or signed transaction.
In the other raw transaction subsections above, the previous output was In the other raw transaction subsections above, the previous output was
part of the UTXO set known to the wallet, so the wallet was able to use part of the UTXO set known to the wallet, so the wallet was able to use
the txid and output index number to find the previous output script and the txid and output index number to find the previous pubkey script and
insert it automatically. insert it automatically.
In this case, you're spending an output which is unknown to the wallet, In this case, you're spending an output which is unknown to the wallet,
so it can't automatically insert the previous output script. so it can't automatically insert the previous pubkey script.
<div markdown="1" class="multicode"> <div markdown="1" class="multicode">
{% highlight bash %} {% highlight bash %}
@ -804,12 +804,12 @@ so it can't automatically insert the previous output script.
{% endhighlight %} {% endhighlight %}
</div> </div>
Successfully sign the transaction by providing the previous output Successfully sign the transaction by providing the previous pubkey
script and other required input data. script and other required input data.
This specific operation is typically what offline signing wallets do. This specific operation is typically what offline signing wallets do.
The online wallet creates the raw transaction and gets the previous The online wallet creates the raw transaction and gets the previous
output scripts for all the inputs. The user brings this information to pubkey scripts for all the inputs. The user brings this information to
the offline wallet. After displaying the transaction details to the the offline wallet. After displaying the transaction details to the
user, the offline wallet signs the transaction as we did above. The user, the offline wallet signs the transaction as we did above. The
user takes the signed transaction back to the online wallet, which user takes the signed transaction back to the online wallet, which
@ -895,9 +895,9 @@ called m-of-n, and in this case we'll be using 2-of-3.
{% endhighlight %} {% endhighlight %}
Generate three new P2PKH addresses. P2PKH addresses cannot be used with Generate three new P2PKH addresses. P2PKH addresses cannot be used with
the multisig redeemScript created below. (Hashing each public key is the multisig redeem script created below. (Hashing each public key is
unnecessary anyway---all the public keys are protected by a hash when unnecessary anyway---all the public keys are protected by a hash when
the redeemScript is hashed.) However, Bitcoin Core uses addresses as a the redeem script is hashed.) However, Bitcoin Core uses addresses as a
way to reference the underlying full (unhashed) public keys it knows way to reference the underlying full (unhashed) public keys it knows
about, so we get the three new addresses above in order to use their about, so we get the three new addresses above in order to use their
public keys. public keys.
@ -905,7 +905,7 @@ public keys.
[Recall from the Guide][address] that the hashed public keys used in addresses [Recall from the Guide][address] that the hashed public keys used in addresses
obfuscate the full public key, so you cannot give an address to another obfuscate the full public key, so you cannot give an address to another
person or device as part of creating a typical multisig output or P2SH multisig person or device as part of creating a typical multisig output or P2SH multisig
redeemScript. You must give them a full public key. redeem script. You must give them a full public key.
<div markdown="1" class="multicode"> <div markdown="1" class="multicode">
{% highlight bash %} {% highlight bash %}
@ -931,9 +931,9 @@ redeemScript. You must give them a full public key.
Use the `validateaddress` RPC to display the full (unhashed) public key Use the `validateaddress` RPC to display the full (unhashed) public key
for one of the addresses. This is the information which will for one of the addresses. This is the information which will
actually be included in the multisig redeemScript. This is also the actually be included in the multisig redeem script. This is also the
information you would give another person or device as part of creating information you would give another person or device as part of creating
a multisig output or P2SH multisig redeemScript. a multisig output or P2SH multisig redeem script.
We save the address returned to a shell variable. We save the address returned to a shell variable.
@ -964,26 +964,26 @@ We save the address returned to a shell variable.
Use the `createmultisig` RPC with two arguments, the number (*n*) of Use the `createmultisig` RPC with two arguments, the number (*n*) of
signatures required and a list of addresses or public keys. Because signatures required and a list of addresses or public keys. Because
P2PKH addresses can't be used in the multisig redeemScript created by this P2PKH addresses can't be used in the multisig redeem script created by this
RPC, the only addresses which can be provided are those belonging to a RPC, the only addresses which can be provided are those belonging to a
public key in the wallet. In this case, we provide two addresses and public key in the wallet. In this case, we provide two addresses and
one public key---all of which will be converted to public keys in the one public key---all of which will be converted to public keys in the
redeemScript. redeem script.
The P2SH address is returned along with the redeemScript which must be The P2SH address is returned along with the redeem script which must be
provided when we spend satoshis sent to the P2SH address. provided when we spend satoshis sent to the P2SH address.
![Warning icon](/img/icon_warning.svg) ![Warning icon](/img/icon_warning.svg)
**Warning:** You must not lose the redeemScript, especially if you **Warning:** You must not lose the redeem script, especially if you
don't have a record of which public keys you used to create the P2SH don't have a record of which public keys you used to create the P2SH
multisig address. You need the redeemScript to spend any bitcoins sent multisig address. You need the redeem script to spend any bitcoins sent
to the P2SH address. If you lose the redeemScript, you can recreate it to the P2SH address. If you lose the redeem script, you can recreate it
by running the same command above, with the public keys listed in the by running the same command above, with the public keys listed in the
same order. However, if you lose both the redeemScript and even one of same order. However, if you lose both the redeem script and even one of
the public keys, you will never be able to spend satoshis sent to that the public keys, you will never be able to spend satoshis sent to that
P2SH address. P2SH address.
Neither the address nor the redeemScript are stored in the wallet when Neither the address nor the redeem script are stored in the wallet when
you use `createmultisig`. To store them in the wallet, use the you use `createmultisig`. To store them in the wallet, use the
`addmultisigaddress` RPC instead. If you add an address to the wallet, `addmultisigaddress` RPC instead. If you add an address to the wallet,
you should also make a new backup. you should also make a new backup.
@ -1073,7 +1073,7 @@ We save that txid to a shell variable as the txid of the UTXO we plan to spend n
We use the `getrawtransaction` RPC with the optional second argument We use the `getrawtransaction` RPC with the optional second argument
(*true*) to get the decoded transaction we just created with (*true*) to get the decoded transaction we just created with
`spendtoaddress`. We choose one of the outputs to be our UTXO and get `spendtoaddress`. We choose one of the outputs to be our UTXO and get
its output index number (vout) and output script (scriptPubKey). its output index number (vout) and pubkey script (scriptPubKey).
{% highlight bash %} {% highlight bash %}
> bitcoin-cli -regtest getnewaddress > bitcoin-cli -regtest getnewaddress
@ -1121,7 +1121,7 @@ cNmbnwwGzEghMMe1vBwH34DFHShEj5bcXD1QpFRPHgG9Mj1xc5hq
We get the private keys for two of the public keys we used to create the We get the private keys for two of the public keys we used to create the
transaction, the same way we got private keys in the Complex Raw transaction, the same way we got private keys in the Complex Raw
Transaction subsection. Recall that we created a 2-of-3 multisig script, Transaction subsection. Recall that we created a 2-of-3 multisig pubkey script,
so signatures from two private keys are needed. so signatures from two private keys are needed.
![Warning icon](/img/icon_warning.svg) ![Warning icon](/img/icon_warning.svg)
@ -1168,8 +1168,8 @@ complex raw transaction].
</div> </div>
We make the first signature. The input argument (JSON object) takes the We make the first signature. The input argument (JSON object) takes the
additional redeemScript parameter so that it can append the redeemScript additional redeem script parameter so that it can append the redeem script
to the scriptSig after the two signatures. to the signature script after the two signatures.
<div markdown="1" class="multicode"> <div markdown="1" class="multicode">
{% highlight bash %} {% highlight bash %}

View file

@ -42,7 +42,7 @@ who should get the satoshis if there's a dispute.
To create a multiple-signature ([multisig][]{:#term-multisig}{:.term}) To create a multiple-signature ([multisig][]{:#term-multisig}{:.term})
output, they each give the others a public key. Then Bob creates the output, they each give the others a public key. Then Bob creates the
following [P2SH multisig][]{:#term-p2sh-multisig}{:.term} redeemScript: following [P2SH multisig][]{:#term-p2sh-multisig}{:.term} redeem script:
{% endautocrossref %} {% endautocrossref %}
@ -58,19 +58,19 @@ OP_2 [A's pubkey] [B's pubkey] [C's pubkey] OP_3 OP_CHECKMULTISIG
stack. `OP_2` stack. `OP_2`
specifies that 2 signatures are required to sign; `OP_3` specifies that specifies that 2 signatures are required to sign; `OP_3` specifies that
3 public keys (unhashed) are being provided. This is a 2-of-3 multisig 3 public keys (unhashed) are being provided. This is a 2-of-3 multisig
scriptPubKey, more generically called a m-of-n scriptPubKey (where *m* is the pubkey script, more generically called a m-of-n pubkey script (where *m* is the
*minimum* matching signatures required and *n* in the *number* of public *minimum* matching signatures required and *n* in the *number* of public
keys provided). keys provided).
Bob gives the redeemScript to Charlie, who checks to make sure his Bob gives the redeem script to Charlie, who checks to make sure his
public key and Alice's public key are included. Then he hashes the public key and Alice's public key are included. Then he hashes the
redeemScript to create a P2SH scriptPubKey and pays the satoshis to it. Bob redeem script to create a P2SH redeem script and pays the satoshis to it. Bob
sees the payment get added to the block chain and ships the merchandise. sees the payment get added to the block chain and ships the merchandise.
Unfortunately, the merchandise gets slightly damaged in transit. Charlie Unfortunately, the merchandise gets slightly damaged in transit. Charlie
wants a full refund, but Bob thinks a 10% refund is sufficient. They wants a full refund, but Bob thinks a 10% refund is sufficient. They
turn to Alice to resolve the issue. Alice asks for photo evidence from turn to Alice to resolve the issue. Alice asks for photo evidence from
Charlie along with a copy of the redeemScript Bob created and Charlie along with a copy of the redeem script Bob created and
Charlie checked. Charlie checked.
After looking at the evidence, Alice thinks a 40% refund is sufficient, After looking at the evidence, Alice thinks a 40% refund is sufficient,
@ -78,36 +78,36 @@ so she creates and signs a transaction with two outputs, one that spends 60%
of the satoshis to Bob's public key and one that spends the remaining of the satoshis to Bob's public key and one that spends the remaining
40% to Charlie's public key. 40% to Charlie's public key.
In the scriptSig Alice puts her signature In the signature script Alice puts her signature
and a copy of the unhashed serialized redeemScript and a copy of the unhashed serialized redeem script
that Bob created. She gives a copy of the incomplete transaction to that Bob created. She gives a copy of the incomplete transaction to
both Bob and Charlie. Either one of them can complete it by adding both Bob and Charlie. Either one of them can complete it by adding
his signature to create the following scriptSig: his signature to create the following signature script:
{% endautocrossref %} {% endautocrossref %}
~~~ ~~~
OP_0 [A's signature] [B's or C's signature] [serialized redeemScript] OP_0 [A's signature] [B's or C's signature] [serialized redeem script]
~~~ ~~~
{% autocrossref %} {% autocrossref %}
(Op codes to push the signatures and redeemScript onto the stack are (Op codes to push the signatures and redeem script onto the stack are
not shown. `OP_0` is a workaround for an off-by-one error in the original not shown. `OP_0` is a workaround for an off-by-one error in the original
implementation which must be preserved for compatibility.) implementation which must be preserved for compatibility.)
When the transaction is broadcast to the network, each peer checks the When the transaction is broadcast to the network, each peer checks the
scriptSig against the P2SH output Charlie previously paid, signature script against the P2SH output Charlie previously paid,
ensuring that the redeemScript matches the redeemScript hash previously ensuring that the redeem script matches the redeem script hash previously
provided. Then the redeemScript is evaluated, with the two signatures provided. Then the redeem script is evaluated, with the two signatures
being used as input<!--noref--> data. Assuming the redeemScript being used as input<!--noref--> data. Assuming the redeem script
validates, the two transaction outputs show up in Bob's and Charlie's validates, the two transaction outputs show up in Bob's and Charlie's
wallets as spendable balances. wallets as spendable balances.
However, if Alice created and signed a transaction neither of them would However, if Alice created and signed a transaction neither of them would
agree to, such as spending all the satoshis to herself, Bob and Charlie agree to, such as spending all the satoshis to herself, Bob and Charlie
can find a new arbitrator and sign a transaction spending the satoshis can find a new arbitrator and sign a transaction spending the satoshis
to another 2-of-3 multisig redeemScript hash, this one including a public to another 2-of-3 multisig redeem script hash, this one including a public
key from that second arbitrator. This means that Bob and Charlie never key from that second arbitrator. This means that Bob and Charlie never
need to worry about their arbitrator stealing their money. need to worry about their arbitrator stealing their money.
@ -133,7 +133,7 @@ him thousands of satoshis in transaction fees, so Alice suggests they use a
Bob asks Alice for her public key and then creates two transactions. Bob asks Alice for her public key and then creates two transactions.
The first transaction pays 100 millibits to a P2SH output whose The first transaction pays 100 millibits to a P2SH output whose
2-of-2 multisig redeemScript requires signatures from both Alice and Bob. 2-of-2 multisig redeem script requires signatures from both Alice and Bob.
This is the bond transaction. This is the bond transaction.
Broadcasting this transaction would let Alice hold the millibits Broadcasting this transaction would let Alice hold the millibits
hostage, so Bob keeps this transaction private for now and creates a hostage, so Bob keeps this transaction private for now and creates a

View file

@ -68,7 +68,8 @@ Removal of elements can only be done by scrapping the bloom filter and re-creati
Rather than viewing the false positive rates as a liability, it is used to create a tunable parameter that represents the desired privacy level and bandwidth trade-off. A SPV client creates their Bloom filter and sends it to a full node using the message `filterload`, which sets the filter for which transactions are desired. The command `filteradd` allows addition of desired data to the filter without needing to send a totally new Bloom filter, and `filterclear` allows the connection to revert to standard block discovery mechanisms. If the filter has been loaded, then full nodes will send a modified form of blocks, called a merkleblock. The merkleblock is simply the block header with the merkle branch associated with the set Bloom filter. Rather than viewing the false positive rates as a liability, it is used to create a tunable parameter that represents the desired privacy level and bandwidth trade-off. A SPV client creates their Bloom filter and sends it to a full node using the message `filterload`, which sets the filter for which transactions are desired. The command `filteradd` allows addition of desired data to the filter without needing to send a totally new Bloom filter, and `filterclear` allows the connection to revert to standard block discovery mechanisms. If the filter has been loaded, then full nodes will send a modified form of blocks, called a merkleblock. The merkleblock is simply the block header with the merkle branch associated with the set Bloom filter.
An SPV client can not only add transactions as elements to the filter, but also public keys, data from scriptSig and scriptPubKeys, and more. This enables P2SH transaction finding. An SPV client can not only add transactions as elements to the filter, but also public keys, data from signature
scripts and pubkey scripts, and more. This enables P2SH transaction finding.
If a user is more privacy-conscious, he can set the Bloom filter to include more false positives, at the expense of extra bandwidth used for transaction discovery. If a user is on a tight bandwidth budget, he can set the false-positive rate to low, knowing that this will allow full nodes a clear view of what transactions are associated with his client. If a user is more privacy-conscious, he can set the Bloom filter to include more false positives, at the expense of extra bandwidth used for transaction discovery. If a user is on a tight bandwidth budget, he can set the false-positive rate to low, knowing that this will allow full nodes a clear view of what transactions are associated with his client.

View file

@ -307,9 +307,9 @@ invoice database:
* An expiration time when that total will no longer be acceptable. * An expiration time when that total will no longer be acceptable.
* An output script to which Charlie should send payment. Typically this * A pubkey script to which Charlie should send payment. Typically this
will be a P2PKH or P2SH output script containing a unique (never will be a P2PKH or P2SH pubkey script containing a unique (never
before used) public key. before used) secp256k1 public key.
After adding all that information to the database, Bob's server displays After adding all that information to the database, Bob's server displays
a `bitcoin:` URI for Charlie to click to pay. a `bitcoin:` URI for Charlie to click to pay.
@ -334,7 +334,7 @@ unique identifier from the URL and looks up the corresponding details in
the database. It then creates a PaymentDetails message with the the database. It then creates a PaymentDetails message with the
following information: following information:
* The amount of the order in satoshis and the output script to be paid. * The amount of the order in satoshis and the pubkey script to be paid.
* A memo containing the list of items ordered, so Charlie knows what * A memo containing the list of items ordered, so Charlie knows what
he's paying for. It may also include Charlie's mailing address so he can he's paying for. It may also include Charlie's mailing address so he can
@ -355,7 +355,7 @@ payment request to Charlie's wallet in the reply to the HTTP GET.
Charlie's wallet receives the PaymentRequest message, checks its signature, and Charlie's wallet receives the PaymentRequest message, checks its signature, and
then displays the details from the PaymentDetails message to Charlie. Charlie then displays the details from the PaymentDetails message to Charlie. Charlie
agrees to pay, so the wallet constructs a payment to the output script agrees to pay, so the wallet constructs a payment to the pubkey script
Bob's server provided. Unlike a traditional Bitcoin payment, Charlie's Bob's server provided. Unlike a traditional Bitcoin payment, Charlie's
wallet doesn't necessarily automatically broadcast this payment to the wallet doesn't necessarily automatically broadcast this payment to the
network. Instead, the wallet constructs a Payment message and sends it to network. Instead, the wallet constructs a Payment message and sends it to
@ -367,7 +367,7 @@ other things, the Payment message contains:
* An optional memo Charlie can send to Bob. (There's no guarantee that * An optional memo Charlie can send to Bob. (There's no guarantee that
Bob will read it.) Bob will read it.)
* A refund address (output script) which Bob can pay if he needs to * A refund address (pubkey script) which Bob can pay if he needs to
return some or all of Charlie's satoshis. return some or all of Charlie's satoshis.
Bob's server receives the Payment message, verifies the transaction pays Bob's server receives the Payment message, verifies the transaction pays
@ -390,14 +390,14 @@ In the case of a dispute, Charlie can generate a cryptographically-proven
otherwise-proven information. otherwise-proven information.
* The PaymentDetails message signed by Bob's webserver proves Charlie * The PaymentDetails message signed by Bob's webserver proves Charlie
received an invoice to pay a specified output script for a specified received an invoice to pay a specified pubkey script for a specified
number of satoshis for goods specified in the memo field. number of satoshis for goods specified in the memo field.
* The Bitcoin block chain can prove that the output script specified by * The Bitcoin block chain can prove that the pubkey script specified by
Bob was paid the specified number of satoshis. Bob was paid the specified number of satoshis.
If a refund needs to be issued, Bob's server can safely pay the If a refund needs to be issued, Bob's server can safely pay the
refund-to output script provided by Charlie. (Note: a proposal has been refund-to pubkey script provided by Charlie. (Note: a proposal has been
discussed to give refund-to addresses an implicit expiration date so discussed to give refund-to addresses an implicit expiration date so
users and software don't need to worry about payments being sent to users and software don't need to worry about payments being sent to
addresses which are no longer monitored.) See the Refunds section below addresses which are no longer monitored.) See the Refunds section below
@ -504,7 +504,7 @@ basis.
Occasionally receivers using your applications will need to issue Occasionally receivers using your applications will need to issue
refunds. The obvious way to do that, which is very unsafe, is simply refunds. The obvious way to do that, which is very unsafe, is simply
to return the satoshis to the output script from which they came. to return the satoshis to the pubkey script from which they came.
For example: For example:
* Alice wants to buy a widget from Bob, so Bob gives Alice a price and * Alice wants to buy a widget from Bob, so Bob gives Alice a price and

View file

@ -23,7 +23,7 @@ and they're an exception to many of the rules listed below. Instead of
pointing out the coinbase exception to each rule, we invite you to read pointing out the coinbase exception to each rule, we invite you to read
about coinbase transactions in the block chain section of this guide. about coinbase transactions in the block chain section of this guide.
![The Parts Of A Transaction](/img/dev/en-tx-overview.svg) <!-- ![The Parts Of A Transaction](/img/dev/en-tx-overview.svg) -->
The figure above shows the core parts of a Bitcoin transaction. Each The figure above shows the core parts of a Bitcoin transaction. Each
transaction has at least one input and one output. Each [input][]{:#term-input}{:.term} spends the transaction has at least one input and one output. Each [input][]{:#term-input}{:.term} spends the
@ -48,13 +48,14 @@ cryptographic key pair.
![Creating A P2PKH Public Key Hash To Receive Payment](/img/dev/en-creating-p2pkh-output.svg) ![Creating A P2PKH Public Key Hash To Receive Payment](/img/dev/en-creating-p2pkh-output.svg)
Bob must first generate a private/public [key pair][]{:#term-key-pair}{:.term} before Alice can create the Bob must first generate a private/public [key pair][]{:#term-key-pair}{:.term} before Alice can create the
first transaction. Standard Bitcoin [private keys][private first transaction. Bitcoin uses the Elliptic Curve Digital Signature Algorithm (ECDSA) with
the secp256k1 curve; secp256k1 [private keys][private
key]{:#term-private-key}{:.term} are 256 bits of random key]{:#term-private-key}{:.term} are 256 bits of random
data. A copy of that data is deterministically transformed into a [public data. A copy of that data is deterministically transformed into an secp256k1 [public
key][]{:#term-public-key}{:.term}. Because the transformation can be reliably repeated later, the key][]{:#term-public-key}{:.term}. Because the transformation can be reliably repeated later, the
public key does not need to be stored. public key does not need to be stored.
The public key is then cryptographically hashed. This pubkey hash can The public key (pubkey) is then cryptographically hashed. This pubkey hash can
also be reliably repeated later, so it also does not need to be stored. also be reliably repeated later, so it also does not need to be stored.
The hash shortens and obfuscates the public key, making manual The hash shortens and obfuscates the public key, making manual
transcription easier and providing security against transcription easier and providing security against
@ -79,7 +80,8 @@ Once Alice has the address and decodes it back into a standard hash, she
can create the first transaction. She creates a standard P2PKH can create the first transaction. She creates a standard P2PKH
transaction output containing instructions which allow anyone to spend that transaction output containing instructions which allow anyone to spend that
output if they can prove they control the private key corresponding to output if they can prove they control the private key corresponding to
Bob's hashed public key. These instructions are called the [scriptPubKey][]{:#term-scriptpubkey}{:.term}. Bob's hashed public key. These instructions are called the [pubkey script][]{:#term-pubkey-script}{:.term}
or scriptPubKey.
Alice broadcasts the transaction and it is added to the block chain. Alice broadcasts the transaction and it is added to the block chain.
The network categorizes it as an Unspent Transaction Output (UTXO), and Bob's The network categorizes it as an Unspent Transaction Output (UTXO), and Bob's
@ -88,40 +90,44 @@ wallet software displays it as a spendable balance.
When, some time later, Bob decides to spend the UTXO, he must create an When, some time later, Bob decides to spend the UTXO, he must create an
input which references the transaction Alice created by its hash, called input which references the transaction Alice created by its hash, called
a Transaction Identifier (txid), and the specific output she used by its a Transaction Identifier (txid), and the specific output she used by its
index number ([output index][]{:#term-output-index}{:.term}). He must then create a [scriptSig][]{:#term-scriptsig}{:.term}---a index number ([output index][]{:#term-output-index}{:.term}). He must then create a [signature
script][]{:#term-signature-script}{:.term}---a
collection of data parameters which satisfy the conditions Alice placed collection of data parameters which satisfy the conditions Alice placed
in the previous output's scriptPubKey. in the previous output's pubkey script. Signature scripts are also
called scriptSigs.
Pubkey scripts and signature scripts combine secp256k1 pubkeys
and signatures with conditional logic, creating a programable
authorization mechanism.
![Unlocking A P2PKH Output For Spending](/img/dev/en-unlocking-p2pkh-output.svg) ![Unlocking A P2PKH Output For Spending](/img/dev/en-unlocking-p2pkh-output.svg)
Bob does not need to communicate with Alice to do this; he must simply For a P2PKH-style output, Bob's signature script will contain the following two
prove to the Bitcoin peer-to-peer network that he can satisfy the pieces of data:
scriptPubKey's conditions. For a P2PKH-style output, Bob's scriptSig will
contain the following two pieces of data:
1. His full (unhashed) public key, so the scriptPubKey can check that it 1. His full (unhashed) public key, so the pubkey script can check that it
hashes to the same value as the pubkey hash provided by Alice. hashes to the same value as the pubkey hash provided by Alice.
2. A [signature][]{:#term-signature}{:.term} made by using the ECDSA cryptographic formula to combine 2. An secp256k1 [signature][]{:#term-signature}{:.term} made by using the ECDSA cryptographic formula to combine
certain transaction data (described below) with Bob's private key. certain transaction data (described below) with Bob's private key.
This lets the scriptPubKey verify that Bob owns the private key which This lets the pubkey script verify that Bob owns the private key which
created the public key. created the public key.
Bob's signature doesn't just prove Bob controls his private key; it also Bob's secp256k1 signature doesn't just prove Bob controls his private key; it also
makes the rest of his transaction tamper-proof so Bob can safely makes the non-signature-script parts of his transaction tamper-proof so Bob can safely
broadcast it over the peer-to-peer network. broadcast them over the peer-to-peer network.
![Some Things Signed When Spending An Output](/img/dev/en-signing-output-to-spend.svg) ![Some Things Signed When Spending An Output](/img/dev/en-signing-output-to-spend.svg)
As illustrated in the figure above, the data Bob signs includes the As illustrated in the figure above, the data Bob signs includes the
txid and output index of the previous transaction, the previous txid and output index of the previous transaction, the previous
output's scriptPubKey, the scriptPubKey Bob creates which will let the next output's pubkey script, the pubkey script Bob creates which will let the next
recipient spend this transaction's output, and the amount of satoshis to recipient spend this transaction's output, and the amount of satoshis to
spend to the next recipient. In essence, the entire transaction is spend to the next recipient. In essence, the entire transaction is
signed except for any scriptSigs, which hold the full public keys and signed except for any signature scripts, which hold the full public keys and
signatures. secp256k1 signatures.
After putting his signature and public key in the scriptSig, Bob After putting his signature and public key in the signature script, Bob
broadcasts the transaction to Bitcoin miners through the peer-to-peer broadcasts the transaction to Bitcoin miners through the peer-to-peer
network. Each peer and miner independently validates the transaction network. Each peer and miner independently validates the transaction
before broadcasting it further or attempting to include it in a new block of before broadcasting it further or attempting to include it in a new block of
@ -133,8 +139,8 @@ transactions.
{% autocrossref %} {% autocrossref %}
The validation procedure requires evaluation of the scriptSig and scriptPubKey. The validation procedure requires evaluation of the signature script and pubkey script.
In a P2PKH output, the scriptPubKey is: In a P2PKH output, the pubkey script is:
{% endautocrossref %} {% endautocrossref %}
@ -144,8 +150,8 @@ OP_DUP OP_HASH160 <PubkeyHash> OP_EQUALVERIFY OP_CHECKSIG
{% autocrossref %} {% autocrossref %}
The spender's scriptSig is evaluated and prefixed to the beginning of the The spender's signature script is evaluated and prefixed to the beginning of the
script. In a P2PKH transaction, the scriptSig contains a signature (sig) script. In a P2PKH transaction, the signature script contains an secp256k1 signature (sig)
and full public key (pubkey), creating the following concatenation: and full public key (pubkey), creating the following concatenation:
{% endautocrossref %} {% endautocrossref %}
@ -170,19 +176,19 @@ sections about stacks. These are programming terms. Also "above",
"below", "top", and "bottom" are commonly used relative directions or "below", "top", and "bottom" are commonly used relative directions or
locations in stack descriptions. -harding --> locations in stack descriptions. -harding -->
To test whether the transaction is valid, scriptSig and scriptPubKey arguments To test whether the transaction is valid, signature script and pubkey script arguments
are pushed to the stack one item at a time, starting with Bob's scriptSig are pushed to the stack one item at a time, starting with Bob's signature script
and continuing to the end of Alice's scriptPubKey. The figure below shows the and continuing to the end of Alice's pubkey script. The figure below shows the
evaluation of a standard P2PKH scriptPubKey; below the figure is a description evaluation of a standard P2PKH pubkey script; below the figure is a description
of the process. of the process.
![P2PKH Stack Evaluation](/img/dev/en-p2pkh-stack.svg) ![P2PKH Stack Evaluation](/img/dev/en-p2pkh-stack.svg)
* The signature (from Bob's scriptSig) is added (pushed) to an empty stack. * The signature (from Bob's signature script) is added (pushed) to an empty stack.
Because it's just data, nothing is done except adding it to the stack. Because it's just data, nothing is done except adding it to the stack.
The public key (also from the scriptSig) is pushed on top of the signature. The public key (also from the signature script) is pushed on top of the signature.
* From Alice's scriptPubKey, the `OP_DUP` operation is pushed. `OP_DUP` replaces * From Alice's pubkey script, the `OP_DUP` operation is pushed. `OP_DUP` replaces
itself with a copy of the data from one level below it---in this itself with a copy of the data from one level below it---in this
case creating a copy of the public key Bob provided. case creating a copy of the public key Bob provided.
@ -190,11 +196,11 @@ of the process.
of the data from one level below it---in this case, Bob's public key. of the data from one level below it---in this case, Bob's public key.
This creates a hash of Bob's public key. This creates a hash of Bob's public key.
* Alice's scriptPubKey then pushes the pubkey hash that Bob gave her for the * Alice's pubkey script then pushes the pubkey hash that Bob gave her for the
first transaction. At this point, there should be two copies of Bob's first transaction. At this point, there should be two copies of Bob's
pubkey hash at the top of the stack. pubkey hash at the top of the stack.
* Now it gets interesting: Alice's scriptPubKey adds `OP_EQUALVERIFY` to the * Now it gets interesting: Alice's pubkey script adds `OP_EQUALVERIFY` to the
stack. `OP_EQUALVERIFY` expands to `OP_EQUAL` and `OP_VERIFY` (not shown). stack. `OP_EQUALVERIFY` expands to `OP_EQUAL` and `OP_VERIFY` (not shown).
`OP_EQUAL` (not shown) checks the two values below it; in this `OP_EQUAL` (not shown) checks the two values below it; in this
@ -209,13 +215,13 @@ of the process.
the transaction validation fails. Otherwise it pops both itself and the transaction validation fails. Otherwise it pops both itself and
the *true* value off the stack. the *true* value off the stack.
* Finally, Alice's scriptPubKey pushes `OP_CHECKSIG`, which checks the * Finally, Alice's pubkey script pushes `OP_CHECKSIG`, which checks the
signature Bob provided against the now-authenticated public key he signature Bob provided against the now-authenticated public key he
also provided. If the signature matches the public key and was also provided. If the signature matches the public key and was
generated using all of the data required to be signed, `OP_CHECKSIG` generated using all of the data required to be signed, `OP_CHECKSIG`
replaces itself with *true.* replaces itself with *true.*
If *false* is not at the top of the stack after the scriptPubKey has been If *false* is not at the top of the stack after the pubkey script has been
evaluated, the transaction is valid (provided there are no other evaluated, the transaction is valid (provided there are no other
problems with it). problems with it).
@ -225,43 +231,43 @@ problems with it).
{% autocrossref %} {% autocrossref %}
Transaction scriptPubKeys are created by spenders who have little interest in the Pubkey scripts are created by spenders who have little interest in the
long-term security or usefulness of the particular satoshis they're long-term security or usefulness of the particular satoshis they're
currently spending. Receivers do care about the conditions imposed on currently spending. Receivers do care about the conditions imposed on
the satoshis by the scriptPubKey and, if they want, they can ask the satoshis by the pubkey script and, if they want, they can ask
spenders to use a particular scriptPubKey. Unfortunately, custom scriptPubKeys are spenders to use a particular pubkey script. Unfortunately, custom
less convenient than short Bitcoin addresses and more difficult to pubkey scripts are less convenient than short Bitcoin addresses and more
secure than P2PKH pubkey hashes. difficult to secure than P2PKH pubkey hashes.
To solve these problems, pay-to-script-hash To solve these problems, pay-to-script-hash
([P2SH][]{:#term-p2sh}{:.term}) transactions were created in 2012 to let ([P2SH][]{:#term-p2sh}{:.term}) transactions were created in 2012 to let
a spender create a scriptPubKey containing a [hash of a second a spender create a pubkey script containing a [hash of a second
script][script hash]{:#term-script-hash}{:.term}, the script][script hash]{:#term-script-hash}{:.term}, the
[redeemScript][]{:#term-redeemscript}{:.term}. [redeem script][]{:#term-redeem-script}{:.term}.
The basic P2SH workflow, illustrated below, looks almost identical to The basic P2SH workflow, illustrated below, looks almost identical to
the P2PKH workflow. Bob creates a redeemScript with whatever script he the P2PKH workflow. Bob creates a redeem script with whatever script he
wants, hashes the redeemScript, and provides the redeemScript wants, hashes the redeem script, and provides the redeem script
hash to Alice. Alice creates a P2SH-style output containing hash to Alice. Alice creates a P2SH-style output containing
Bob's redeemScript hash. Bob's redeem script hash.
![Creating A P2SH Redeem Script And Hash](/img/dev/en-creating-p2sh-output.svg) ![Creating A P2SH Redeem Script And Hash](/img/dev/en-creating-p2sh-output.svg)
When Bob wants to spend the output, he provides his signature along with When Bob wants to spend the output, he provides his signature along with
the full (serialized) redeemScript in the input scriptSig. The the full (serialized) redeem script in the signature script. The
peer-to-peer network ensures the full redeemScript hashes to the same peer-to-peer network ensures the full redeem script hashes to the same
value as the script hash Alice put in her output; it then processes the value as the script hash Alice put in her output; it then processes the
redeemScript exactly as it would if it were the primary scriptPubKey, letting redeem script exactly as it would if it were the primary pubkey script, letting
Bob spend the output if the redeemScript returns true. Bob spend the output if the redeem script does not return false.
![Unlocking A P2SH Output For Spending](/img/dev/en-unlocking-p2sh-output.svg) ![Unlocking A P2SH Output For Spending](/img/dev/en-unlocking-p2sh-output.svg)
The hash of the redeemScript has the same properties as a pubkey The hash of the redeem script has the same properties as a pubkey
hash---so it can be transformed into the standard Bitcoin address format hash---so it can be transformed into the standard Bitcoin address format
with only one small change to differentiate it from a standard address. with only one small change to differentiate it from a standard address.
This makes collecting a P2SH-style address as simple as collecting a This makes collecting a P2SH-style address as simple as collecting a
P2PKH-style address. The hash also obfuscates any public keys in the P2PKH-style address. The hash also obfuscates any public keys in the
redeemScript, so P2SH scripts are as secure as P2PKH pubkey hashes. redeem script, so P2SH scripts are as secure as P2PKH pubkey hashes.
{% endautocrossref %} {% endautocrossref %}
@ -271,7 +277,7 @@ redeemScript, so P2SH scripts are as secure as P2PKH pubkey hashes.
After the discovery of several dangerous bugs in early versions of After the discovery of several dangerous bugs in early versions of
Bitcoin, a test was added which only accepted transactions from the Bitcoin, a test was added which only accepted transactions from the
network if their scriptPubKeys and scriptSigs matched a small set of network if their pubkey scripts and signature scripts matched a small set of
believed-to-be-safe templates, and if the rest of the transaction didn't believed-to-be-safe templates, and if the rest of the transaction didn't
violate another small set of rules enforcing good network behavior. This violate another small set of rules enforcing good network behavior. This
is the `IsStandard()` test, and transactions which pass it are called is the `IsStandard()` test, and transactions which pass it are called
@ -292,18 +298,18 @@ number, it would become useless as a tool for introducing
backwards-incompatible features. backwards-incompatible features.
As of Bitcoin Core 0.9, the standard scriptPubKey types are: As of Bitcoin Core 0.9, the standard pubkey script types are:
**Pubkey Hash (P2PKH)** **Pay To Public Key Hash (P2PKH)**
P2PKH is the most common form of scriptPubKey used to send a transaction to one P2PKH is the most common form of pubkey script used to send a transaction to one
or multiple Bitcoin addresses. or multiple Bitcoin addresses.
{% endautocrossref %} {% endautocrossref %}
~~~ ~~~
scriptPubKey: OP_DUP OP_HASH160 <PubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Pubkey script: OP_DUP OP_HASH160 <PubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
scriptSig: <sig> <pubkey> Signature script: <sig> <pubkey>
~~~ ~~~
{% autocrossref %} {% autocrossref %}
@ -311,14 +317,14 @@ scriptSig: <sig> <pubkey>
**Pay To Script Hash (P2SH)** **Pay To Script Hash (P2SH)**
P2SH is used to send a transaction to a script hash. Each of the standard P2SH is used to send a transaction to a script hash. Each of the standard
scriptPubKeys can be used as a P2SH redeemScript, but in practice only the pubkey scripts can be used as a P2SH redeem script, but in practice only the
multisig scriptPubKey makes sense until more transaction types are made standard. multisig pubkey script makes sense until more transaction types are made standard.
{% endautocrossref %} {% endautocrossref %}
~~~ ~~~
scriptPubKey: OP_HASH160 <Hash160(redeemScript)> OP_EQUAL Pubkey script: OP_HASH160 <Hash160(redeemScript)> OP_EQUAL
scriptSig: <sig> [sig] [sig...] <redeemScript> Signature script: <sig> [sig] [sig...] <redeemScript>
~~~ ~~~
{% autocrossref %} {% autocrossref %}
@ -328,7 +334,7 @@ scriptSig: <sig> [sig] [sig...] <redeemScript>
Although P2SH multisig is now generally used for multisig transactions, this base script Although P2SH multisig is now generally used for multisig transactions, this base script
can be used to require multiple signatures before a UTXO can be spent. can be used to require multiple signatures before a UTXO can be spent.
In multisig scriptPubKeys, called m-of-n, *m* is the *minimum* number of signatures In multisig pubkey scripts, called m-of-n, *m* is the *minimum* number of signatures
which must match a public key; *n* is the *number* of public keys being which must match a public key; *n* is the *number* of public keys being
provided. Both *m* and *n* should be op codes `OP_1` through `OP_16`, provided. Both *m* and *n* should be op codes `OP_1` through `OP_16`,
corresponding to the number desired. corresponding to the number desired.
@ -336,14 +342,14 @@ corresponding to the number desired.
Because of an off-by-one error in the original Bitcoin implementation Because of an off-by-one error in the original Bitcoin implementation
which must be preserved for compatibility, `OP_CHECKMULTISIG` which must be preserved for compatibility, `OP_CHECKMULTISIG`
consumes one more value from the stack than indicated by *m*, so the consumes one more value from the stack than indicated by *m*, so the
list of signatures in the scriptSig must be prefaced with an extra value list of secp256k1 signatures in the signature script must be prefaced with an extra value
(`OP_0`) which will be consumed but not used. (`OP_0`) which will be consumed but not used.
{% endautocrossref %} {% endautocrossref %}
~~~ ~~~
scriptPubKey: <m> <pubkey> [pubkey] [pubkey...] <n> OP_CHECKMULTISIG Pubkey script: <m> <pubkey> [pubkey] [pubkey...] <n> OP_CHECKMULTISIG
scriptSig: OP_0 <sig> [sig] [sig...] Signature script: OP_0 <sig> [sig] [sig...]
~~~ ~~~
{% autocrossref %} {% autocrossref %}
@ -353,16 +359,16 @@ Although its not a separate transaction type, this is a P2SH multisig with 2-
{% endautocrossref %} {% endautocrossref %}
~~~ ~~~
scriptPubKey: OP_HASH160 <Hash160(redeemScript)> OP_EQUAL Pubkey script: OP_HASH160 <Hash160(redeemScript)> OP_EQUAL
redeemScript: <OP_2> <pubkey> <pubkey> <pubkey> <OP_3> OP_CHECKMULTISIG Redeem script: <OP_2> <pubkey> <pubkey> <pubkey> <OP_3> OP_CHECKMULTISIG
scriptSig: OP_0 <sig> <sig> <redeemScript> Signature script: OP_0 <sig> <sig> <redeemScript>
~~~ ~~~
{% autocrossref %} {% autocrossref %}
**Pubkey** **Pubkey**
[Pubkey][]{:#term-pubkey}{:.term} scripts are a simplified form of the P2PKH scriptPubKey, [Pubkey][]{:#term-pubkey}{:.term} scripts are a simplified form of the P2PKH pubkey script,
but they arent as but they arent as
secure as P2PKH, so they generally secure as P2PKH, so they generally
arent used in new transactions anymore. arent used in new transactions anymore.
@ -370,44 +376,44 @@ arent used in new transactions anymore.
{% endautocrossref %} {% endautocrossref %}
~~~ ~~~
scriptPubKey: <pubkey> OP_CHECKSIG Pubkey script: <pubkey> OP_CHECKSIG
scriptSig: <sig> Signature script: <sig>
~~~ ~~~
{% autocrossref %} {% autocrossref %}
**Null Data** **Null Data**
[Null data][]{:#term-null-data}{:.term} scriptPubKeys let you add a small amount of arbitrary data to the block [Null data][]{:#term-null-data}{:.term} pubkey scripts let you add a small amount of arbitrary data to the block
chain in exchange for paying a transaction fee, but doing so is discouraged. chain in exchange for paying a transaction fee, but doing so is discouraged.
(Null data is a standard scriptPubKey type only because some people were adding data (Null data is a standard pubkey script type only because some people were adding data
to the block chain in more harmful ways.) to the block chain in more harmful ways.)
{% endautocrossref %} {% endautocrossref %}
~~~ ~~~
scriptScriptPubKey: OP_RETURN <0 to 40 bytes of data> Pubkey Script: OP_RETURN <0 to 40 bytes of data>
(Null data scripts cannot be spent, so there's no scriptSig) (Null data scripts cannot be spent, so there's no signature script.)
~~~ ~~~
#### Non-Standard Transactions #### Non-Standard Transactions
{% autocrossref %} {% autocrossref %}
If you use anything besides a standard scriptPubKey in an output, peers If you use anything besides a standard pubkey script in an output, peers
and miners using the default Bitcoin Core settings will neither and miners using the default Bitcoin Core settings will neither
accept, broadcast, nor mine your transaction. When you try to broadcast accept, broadcast, nor mine your transaction. When you try to broadcast
your transaction to a peer running the default settings, you will your transaction to a peer running the default settings, you will
receive an error. receive an error.
If you create a redeemScript, hash it, and use the hash If you create a redeem script, hash it, and use the hash
in a P2SH output, the network sees only the hash, so it will accept the in a P2SH output, the network sees only the hash, so it will accept the
output as valid no matter what the redeemScript says. output as valid no matter what the redeem script says.
This allows This allows
payment to non-standard scriptPubKeys almost as easily as payment to payment to non-standard pubkey script almost as easily as payment to
standard scriptPubKeys. However, when you go to standard pubkey scripts. However, when you go to
spend that output, peers and miners using the default settings will spend that output, peers and miners using the default settings will
check the redeemScript to see whether or not it's a standard scriptPubKey. check the redeem script to see whether or not it's a standard pubkey script.
If it isn't, they won't process it further---so it will be If it isn't, they won't process it further---so it will be
impossible to spend that output until you find a miner who disables the impossible to spend that output until you find a miner who disables the
default settings. default settings.
@ -432,7 +438,7 @@ conditions:
Multisig transactions which require more than 3 public keys are Multisig transactions which require more than 3 public keys are
currently non-standard. currently non-standard.
* The transaction's scriptSig must only push data to the script * The transaction's signature script must only push data to the script
evaluation stack. It cannot push new OP codes, with the exception of evaluation stack. It cannot push new OP codes, with the exception of
OP codes which solely push data to the stack. OP codes which solely push data to the stack.
@ -456,7 +462,7 @@ called [signature hash][]{:#term-signature-hash}{:.term} types. There are three
currently available: currently available:
* [`SIGHASH_ALL`][sighash_all]{:#term-sighash-all}{:.term}, the default, signs all the inputs and outputs, * [`SIGHASH_ALL`][sighash_all]{:#term-sighash-all}{:.term}, the default, signs all the inputs and outputs,
protecting everything except the scriptSigs against modification. protecting everything except the signature scripts against modification.
* [`SIGHASH_NONE`][sighash_none]{:#term-sighash-none}{:.term} signs all of the inputs but none of the outputs, * [`SIGHASH_NONE`][sighash_none]{:#term-sighash-none}{:.term} signs all of the inputs but none of the outputs,
allowing anyone to change where the satoshis are going unless other allowing anyone to change where the satoshis are going unless other
@ -657,13 +663,13 @@ fixed URI to which payments should be sent, please see the
{% autocrossref %} {% autocrossref %}
None of Bitcoin's signature hash types protect the scriptSig, leaving None of Bitcoin's signature hash types protect the signature script, leaving
the door open for a limited denial of service attack called [transaction the door open for a limited denial of service attack called [transaction
malleability][]{:.term}{:#term-transaction-malleability}. The scriptSig malleability][]{:.term}{:#term-transaction-malleability}. The signature script
contains the signature, which can't sign itself, allowing attackers to contains the secp256k1 signature, which can't sign itself, allowing attackers to
make non-functional modifications to a transaction without rendering it make non-functional modifications to a transaction without rendering it
invalid. For example, an attacker can add some data to the scriptSig invalid. For example, an attacker can add some data to the signature script
which will be dropped before the previous scriptPubKey is processed. which will be dropped before the previous pubkey script is processed.
Although the modifications are non-functional---so they do not change Although the modifications are non-functional---so they do not change
what inputs the transaction uses nor what outputs it pays---they do what inputs the transaction uses nor what outputs it pays---they do

View file

@ -223,7 +223,7 @@ design these minimalist wallets:
![Distributing-Only Wallets](/img/dev/en-wallets-distributing-only.svg) ![Distributing-Only Wallets](/img/dev/en-wallets-distributing-only.svg)
* Pre-populate a database with a number of public keys or addresses, and * Pre-populate a database with a number of public keys or addresses, and
then distribute on request an output scriptPubKey or address using one of then distribute on request a pubkey script or address using one of
the database entries. To [avoid key reuse][devguide avoiding key the database entries. To [avoid key reuse][devguide avoiding key
reuse], webservers should keep track reuse], webservers should keep track
of used keys and never run out of public keys. This can be made easier of used keys and never run out of public keys. This can be made easier
@ -356,8 +356,8 @@ However, Bitcoin Core prior to 0.6 used uncompressed keys. This creates
a few complications, as the hashed form of an uncompressed key is a few complications, as the hashed form of an uncompressed key is
different than the hashed form of a compressed key, so the same key different than the hashed form of a compressed key, so the same key
works with two different P2PKH addresses. This also means that the key works with two different P2PKH addresses. This also means that the key
must be submitted in the correct format in the input scriptSig so it must be submitted in the correct format in the signature script so it
matches the hash in the previous output scriptPubKey. matches the hash in the previous output's pubkey script.
For this reason, Bitcoin Core uses several different identifier bytes to For this reason, Bitcoin Core uses several different identifier bytes to
help programs identify how keys should be used: help programs identify how keys should be used:

View file

@ -39,8 +39,8 @@ fees and block reward.
The coinbase transaction has the same basic format as any other The coinbase transaction has the same basic format as any other
transaction, but it references a single non-existent UTXO and a special transaction, but it references a single non-existent UTXO and a special
[coinbase field][]{:#term-coinbase-field}{:.term} replaces the field that would normally hold a scriptSig and [coinbase field][]{:#term-coinbase-field}{:.term} replaces the field that would normally hold a signature script and
signature. In version 2 blocks, the coinbase parameter must begin with secp256k1 signature. In version 2 blocks, the coinbase parameter must begin with
the current block's block height and may contain additional arbitrary the current block's block height and may contain additional arbitrary
data or a script up to a maximum total of 100 bytes. data or a script up to a maximum total of 100 bytes.

View file

@ -17,7 +17,7 @@ Related RPCs: `createmultisig`
{% autocrossref %} {% autocrossref %}
*Number; required:* the *minimum* (*m*) number of signatures required to *Number; required:* the *minimum* (*m*) number of signatures required to
spend satoshis sent to this m-of-n P2SH multisig script. spend satoshis sent to this m-of-n P2SH multisig pubkey script.
{% endautocrossref %} {% endautocrossref %}
@ -31,7 +31,7 @@ spend satoshis sent to this m-of-n P2SH multisig script.
*String; required:* A JSON array of hex-encoded public *keys* or *addresses* *String; required:* A JSON array of hex-encoded public *keys* or *addresses*
for public keys known to this Bitcoin Core instance. The multisig for public keys known to this Bitcoin Core instance. The multisig
script can only use full (unhashed) public keys, so you generally must pubkey script can only use full (unhashed) public keys, so you generally must
provide public keys for any address not known to this wallet. provide public keys for any address not known to this wallet.
{% endautocrossref %} {% endautocrossref %}
@ -61,7 +61,7 @@ store the address.
{% autocrossref %} {% autocrossref %}
*String:* a hash of the P2SH multisig redeemScript, which is also stored *String:* a hash of the P2SH multisig redeem script, which is also stored
in the wallet so Bitcoin Core can monitor the network and block chain in the wallet so Bitcoin Core can monitor the network and block chain
for transactions sent to that address (which will be displayed in the for transactions sent to that address (which will be displayed in the
wallet as spendable balances). wallet as spendable balances).
@ -221,7 +221,7 @@ Related RPCs: `addmultisigaddress`
{% autocrossref %} {% autocrossref %}
*Number; required:* the *minimum* (*m*) number of signatures required to *Number; required:* the *minimum* (*m*) number of signatures required to
spend satoshis sent to this m-of-n multisig script. spend satoshis sent to this m-of-n multisig pubkey script.
{% endautocrossref %} {% endautocrossref %}
@ -235,7 +235,7 @@ spend satoshis sent to this m-of-n multisig script.
*String; required:* A JSON array of hex-encoded public *keys* or *addresses* *String; required:* A JSON array of hex-encoded public *keys* or *addresses*
for public keys known to this Bitcoin Core instance. The multisig for public keys known to this Bitcoin Core instance. The multisig
script can only use full (unhashed) public keys, so you generally must pubkey script can only use full (unhashed) public keys, so you generally must
provide public keys for any address not known to this wallet. provide public keys for any address not known to this wallet.
{% endautocrossref %} {% endautocrossref %}
@ -477,9 +477,9 @@ and *hex*, and the input sequence number.
{% autocrossref %} {% autocrossref %}
A JSON array of outputs, with each output containing a *value* in decimal A JSON array of outputs, with each output containing a *value* in decimal
bitcoins, an output index number (*n*), a script (*scriptPubKey*) in bitcoins, an output index number (*n*), a pubkey script (*scriptPubKey*) in
script-language psuedocode (*asm*) and *hex*, the number of signatures script-language psuedocode (*asm*) and *hex*, the number of signatures
required (*reqSigs*), the *type* of script (if it's a standard required (*reqSigs*), the *type* of pubkey script (if it's a standard
transaction), and an array of *addresses* used in the output. (More transaction), and an array of *addresses* used in the output. (More
than one address means it's a multisig output.) than one address means it's a multisig output.)
@ -595,7 +595,7 @@ decodescript <redeemScript>
{% autocrossref %} {% autocrossref %}
Decode a hex-encoded P2SH redeemScript. Decode a hex-encoded P2SH redeem script.
{% endautocrossref %} {% endautocrossref %}
@ -603,7 +603,7 @@ Decode a hex-encoded P2SH redeemScript.
{% autocrossref %} {% autocrossref %}
*String; required:* an complete (not hashed) redeemScript in hex. *String; required:* an complete (not hashed) redeem script in hex.
{% endautocrossref %} {% endautocrossref %}
@ -611,7 +611,7 @@ Decode a hex-encoded P2SH redeemScript.
{% autocrossref %} {% autocrossref %}
A JSON object describing the redeemScript, with *asm* being the script A JSON object describing the redeem script, with *asm* being the script
in script-language psuedocode, *hex* being the a P2PKH public key (if in script-language psuedocode, *hex* being the a P2PKH public key (if
applicable), *type* being the output type (typically public key, applicable), *type* being the output type (typically public key,
multisig, or nonstandard), *reqSigs* being the required signatures, multisig, or nonstandard), *reqSigs* being the required signatures,
@ -638,7 +638,7 @@ public keys.
{% autocrossref %} {% autocrossref %}
A 2-of-3 P2SH multisig script: A 2-of-3 P2SH multisig pubkey script:
{% endautocrossref %} {% endautocrossref %}
@ -2994,9 +2994,9 @@ only to display UTXOs on the block chain with *false* (the default).
*String:* A JSON object describing the output, with *bestblock* *String:* A JSON object describing the output, with *bestblock*
providing the header hash of the block which includes the UTXO (if any), providing the header hash of the block which includes the UTXO (if any),
the number of *confirmations* the UTXO has, the *value* of the output in the number of *confirmations* the UTXO has, the *value* of the output in
decimal bitcoins, and a JSON object describing the output script, decimal bitcoins, and a JSON object describing the pubkey script,
including the script in script psuedocode (*asm*), the script in *hex*, including the script in script psuedocode (*asm*), the script in *hex*,
the number of *required signatures*, the *type* of output script, and the number of *required signatures*, the *type* of pubkey script, and
the *addresses* it references (if known). Also provided are the the *addresses* it references (if known). Also provided are the
UTXO's transaction *version* number and whether or not it's a *coinbase* UTXO's transaction *version* number and whether or not it's a *coinbase*
transaction. transaction.

View file

@ -828,7 +828,7 @@ affecting these addresses will returned.
A JSON array with a list of JSON objects, each object describing a A JSON array with a list of JSON objects, each object describing a
single transaction: its *txid*, output index number (*vout*), *address*, single transaction: its *txid*, output index number (*vout*), *address*,
the *account* that address belongs to, the unsigned scriptSig the *account* that address belongs to, the unsigned pubkey script
(*scriptPubKey*) to spend it, the *amount* in decimal bitcoins, and the (*scriptPubKey*) to spend it, the *amount* in decimal bitcoins, and the
number of *confirmations* the transactions has. number of *confirmations* the transactions has.

View file

@ -682,7 +682,7 @@ details about an unknown-to-this-node P2SH transaction that this transaction
depends upon. depends upon.
Each previous P2SH transaction must include its *txid* in hex, output Each previous P2SH transaction must include its *txid* in hex, output
index number (*vout*), public key (*scriptPubKey*) in hex, and index number (*vout*), pubkey script (*scriptPubKey*) in hex, and
*redeemScript* in hex. *redeemScript* in hex.
{% endautocrossref %} {% endautocrossref %}

View file

@ -6,7 +6,7 @@ The following subsections briefly document core transaction details.
{% autocrossref %} {% autocrossref %}
The op codes used in the scriptPubKeys of standard transactions are: The op codes used in the pubkey scripts of standard transactions are:
* Various data pushing op codes from 0x00 to 0x4e (1--78). These aren't * Various data pushing op codes from 0x00 to 0x4e (1--78). These aren't
typically shown in examples, but they must be used to push typically shown in examples, but they must be used to push
@ -44,7 +44,7 @@ The op codes used in the scriptPubKeys of standard transactions are:
The "one extra value" it consumes is the result of an off-by-one The "one extra value" it consumes is the result of an off-by-one
error in the Bitcoin Core implementation. This value is not used, so error in the Bitcoin Core implementation. This value is not used, so
scriptSigs prefix the signatures with a single OP_0 (0x00). signature scripts prefix the secp256k1 signatures with a single OP_0 (0x00).
* [`OP_RETURN`][op_return]{:#term-op-return}{:.term} terminates the script in failure when executed. * [`OP_RETURN`][op_return]{:#term-op-return}{:.term} terminates the script in failure when executed.
@ -53,8 +53,8 @@ Page][wiki script], with an authoritative list in the `opcodetype` enum
of the Bitcoin Core [script header file][core script.h] of the Bitcoin Core [script header file][core script.h]
Note: non-standard transactions can add non-data-pushing op codes to Note: non-standard transactions can add non-data-pushing op codes to
their scriptSig, but scriptSig is run separately from the script (with a their signature script, but signature scripts are run separately from the pubkey scripts (with a
shared stack), so scriptSig can't use arguments such as `OP_RETURN` to shared stack), so signature scripts can't use arguments such as `OP_RETURN` to
prevent the script from working as expected. prevent the script from working as expected.
{% endautocrossref %} {% endautocrossref %}
@ -69,7 +69,7 @@ addresses.
First, get your hash. For P2PKH, you RIPEMD-160(SHA256()) hash a ECDSA First, get your hash. For P2PKH, you RIPEMD-160(SHA256()) hash a ECDSA
public key derived from your 256-bit ECDSA private key (random data). public key derived from your 256-bit ECDSA private key (random data).
For P2SH, you RIPEMD-160(SHA256()) hash a redeemScript serialized in the For P2SH, you RIPEMD-160(SHA256()) hash a redeem script serialized in the
format used in raw transactions (described in a [following format used in raw transactions (described in a [following
sub-section][raw transaction format]). Taking the resulting hash: sub-section][raw transaction format]). Taking the resulting hash:
@ -173,8 +173,9 @@ fa 20 9c 6a 85 2d d9 06
ed ce 25 85 7f cd 37 04 ed ce 25 85 7f cd 37 04
00 00 00 00 previous output index 00 00 00 00 previous output index
48 size of scriptSig (var_uint) 48 size of signature script (var_uint)
scriptSig for input 0:
Signature script for input 0:
47 push 71 bytes to stack 47 push 71 bytes to stack
30 44 02 20 4e 45 e1 69 30 44 02 20 4e 45 e1 69
32 b8 af 51 49 61 a1 d3 32 b8 af 51 49 61 a1 d3
@ -191,8 +192,9 @@ ff ff ff ff sequence number
output 0: output 0:
00 ca 9a 3b 00 00 00 00 amount = 10.00000000 BTC 00 ca 9a 3b 00 00 00 00 amount = 10.00000000 BTC
43 size of scriptPubKey (var_uint) 43 size of pubkey script (var_uint)
scriptPubKey for output 0:
Pubkey script for output 0:
41 push 65 bytes to stack 41 push 65 bytes to stack
04 ae 1a 62 fe 09 c5 f5 04 ae 1a 62 fe 09 c5 f5
1b 13 90 5f 07 f0 6b 99 1b 13 90 5f 07 f0 6b 99
@ -207,8 +209,9 @@ ac OP_CHECKSIG
output 1: output 1:
00 28 6b ee 00 00 00 00 amount = 40.00000000 BTC 00 28 6b ee 00 00 00 00 amount = 40.00000000 BTC
43 size of scriptPubKey (var_uint) 43 size of pubkey script (var_uint)
scriptPubKey for output 1:
Pubkey script for output 1:
41 push 65 bytes to stack 41 push 65 bytes to stack
04 11 db 93 e1 dc db 8a 04 11 db 93 e1 dc db 8a
01 6b 49 84 0f 8c 53 bc 01 6b 49 84 0f 8c 53 bc

View file

@ -66,12 +66,12 @@
[miner]: /en/developer-guide#term-miner "Creators of Bitcoin blocks who solve proof-of-work puzzles in exchange for block rewards and transaction fees" [miner]: /en/developer-guide#term-miner "Creators of Bitcoin blocks who solve proof-of-work puzzles in exchange for block rewards and transaction fees"
[miners]: /en/developer-guide#term-miner "Creators of Bitcoin blocks who solve proof-of-work puzzles in exchange for block rewards and transaction fees" [miners]: /en/developer-guide#term-miner "Creators of Bitcoin blocks who solve proof-of-work puzzles in exchange for block rewards and transaction fees"
[minimum fee]: /en/developer-guide#term-minimum-fee "The minimum fee a transaction must pay in must circumstances to be mined or broadcast by peers across the network" [minimum fee]: /en/developer-guide#term-minimum-fee "The minimum fee a transaction must pay in must circumstances to be mined or broadcast by peers across the network"
[multisig]: /en/developer-guide#term-multisig "An output scriptPubKey using OP_CHECKMULTISIG to check for multiple signatures" [multisig]: /en/developer-guide#term-multisig "An pubkey script using OP_CHECKMULTISIG to check for multiple signatures"
[network]: /en/developer-guide#term-network "The Bitcoin P2P network which broadcasts transactions and blocks" [network]: /en/developer-guide#term-network "The Bitcoin P2P network which broadcasts transactions and blocks"
[Null data]: /en/developer-guide#term-null-data "A standard transaction type which allows adding 40 bytes of arbitrary data to the block chain up to once per transaction" [Null data]: /en/developer-guide#term-null-data "A standard transaction type which allows adding 40 bytes of arbitrary data to the block chain up to once per transaction"
[op_checkmultisig]: /en/developer-reference#term-op-checkmultisig "Op code which returns true if one or more provided signatures (m) sign the correct parts of a transaction and match one or more provided public keys (n)" [op_checkmultisig]: /en/developer-reference#term-op-checkmultisig "Op code which returns true if one or more provided signatures (m) sign the correct parts of a transaction and match one or more provided public keys (n)"
[op_checksig]: /en/developer-reference#term-op-checksig "Op code which returns true if a signature signs the correct parts of a transaction and matches a provided public key" [op_checksig]: /en/developer-reference#term-op-checksig "Op code which returns true if a signature signs the correct parts of a transaction and matches a provided public key"
[op code]: /en/developer-reference#op-codes "Operation codes which run functions within a script" [op code]: /en/developer-reference#op-codes "Operation codes which push data or run functions within a pubkey script or signature script"
[op_dup]: /en/developer-reference#term-op-dup "Operation which duplicates the entry below it on the stack" [op_dup]: /en/developer-reference#term-op-dup "Operation which duplicates the entry below it on the stack"
[op_equal]: /en/developer-reference#term-op-equal "Operation which returns true if the two entries below it on the stack are equivalent" [op_equal]: /en/developer-reference#term-op-equal "Operation which returns true if the two entries below it on the stack are equivalent"
[op_equalverify]: /en/developer-reference#term-op-equalverify "Operation which terminates the script in failure unless the two entries below it on the stack are equivalent" [op_equalverify]: /en/developer-reference#term-op-equalverify "Operation which terminates the script in failure unless the two entries below it on the stack are equivalent"
@ -79,12 +79,11 @@
[op_return]: /en/developer-reference#term-op-return "Operation which terminates the script in failure" [op_return]: /en/developer-reference#term-op-return "Operation which terminates the script in failure"
[op_verify]: /en/developer-reference#term-op-verify "Operation which terminates the script if the entry below it on the stack is non-true (zero)" [op_verify]: /en/developer-reference#term-op-verify "Operation which terminates the script if the entry below it on the stack is non-true (zero)"
[orphan]: /en/developer-guide#term-orphan "Blocks which were successfully mined but which aren't included on the current valid block chain" [orphan]: /en/developer-guide#term-orphan "Blocks which were successfully mined but which aren't included on the current valid block chain"
[output]: /en/developer-guide#term-output "The output of a transaction which transfers value to a scriptPubKey" [output]: /en/developer-guide#term-output "The output of a transaction which transfers value to a pubkey script"
[output index]: /en/developer-guide#term-output-index "The sequentially-numbered index of outputs in a single transaction starting from 0" [output index]: /en/developer-guide#term-output-index "The sequentially-numbered index of outputs in a single transaction starting from 0"
[outputs]: /en/developer-guide#term-output "The outputs of a transaction which transfer value to scriptPubKeys" [P2PKH]: /en/developer-guide#term-p2pkh "A pubkey script which Pays To PubKey Hashes (P2PKH), allowing spending of satoshis to anyone with a Bitcoin address"
[P2PKH]: /en/developer-guide#term-p2pkh "A scriptPubKey which Pays To Pubkey Hashes (P2PKH), allowing spending of satoshis to anyone with a Bitcoin address" [P2SH]: /en/developer-guide#term-p2sh "A pubkey script which Pays To Script Hashes (P2SH), allowing convenient spending of satoshis to an address referencing a redeem script"
[P2SH]: /en/developer-guide#term-p2sh "A scriptPubKey which Pays To Script Hashes (P2SH), allowing convenient spending of satoshis to an address referencing a script" [P2SH multisig]: /en/developer-guide#term-p2sh-multisig "A multisig script embedded in the redeem script of a pay-to-script-hash (P2SH) transaction"
[P2SH multisig]: /en/developer-guide#term-p2sh-multisig "A multisig script embedded in the redeemScript of a pay-to-script-hash (P2SH) transaction"
[parent chain code]: /en/developer-guide#term-parent-chain-code "A chain code which has helped create child public or private keys" [parent chain code]: /en/developer-guide#term-parent-chain-code "A chain code which has helped create child public or private keys"
[parent key]: /en/developer-guide#term-parent-key "In HD wallets, a key capable of deriving child keys" [parent key]: /en/developer-guide#term-parent-key "In HD wallets, a key capable of deriving child keys"
[parent private key]: /en/developer-guide#term-parent-private-key "A private key which has created child private keys" [parent private key]: /en/developer-guide#term-parent-private-key "A private key which has created child private keys"
@ -101,20 +100,21 @@
[private keys]: /en/developer-guide#term-private-key "The private portion of a keypair which can create signatures which other people can verify using the public key" [private keys]: /en/developer-guide#term-private-key "The private portion of a keypair which can create signatures which other people can verify using the public key"
[pubkey hash]: /en/developer-guide#term-pubkey-hash "The hash of a public key which can be included in a P2PKH output" [pubkey hash]: /en/developer-guide#term-pubkey-hash "The hash of a public key which can be included in a P2PKH output"
[public key]: /en/developer-guide#term-public-key "The public portion of a keypair which can be safely distributed to other people so they can verify a signature created with the corresponding private key" [public key]: /en/developer-guide#term-public-key "The public portion of a keypair which can be safely distributed to other people so they can verify a signature created with the corresponding private key"
[pp amount]: /en/developer-examples#term-pp-amount "Part of the Output part of the PaymentDetails part of a payment protocol where receivers can specify the amount of satoshis they want paid to a particular output scriptPubKey" [pp amount]: /en/developer-examples#term-pp-amount "Part of the Output part of the PaymentDetails part of a payment protocol where receivers can specify the amount of satoshis they want paid to a particular pubkey script"
[pp expires]: /en/developer-examples#term-pp-expires "The expires field of a PaymentDetails where the receiver tells the spender when the PaymentDetails expires" [pp expires]: /en/developer-examples#term-pp-expires "The expires field of a PaymentDetails where the receiver tells the spender when the PaymentDetails expires"
[pp memo]: /en/developer-examples#term-pp-memo "The memo fields of PaymentDetails, Payment, and PaymentACK which allow spenders and receivers to send each other memos" [pp memo]: /en/developer-examples#term-pp-memo "The memo fields of PaymentDetails, Payment, and PaymentACK which allow spenders and receivers to send each other memos"
[pp merchant data]: /en/developer-examples#term-pp-merchant-data "The merchant_data part of PaymentDetails and Payment which allows the receiver to send arbitrary data to the spender in PaymentDetails and receive it back in Payments" [pp merchant data]: /en/developer-examples#term-pp-merchant-data "The merchant_data part of PaymentDetails and Payment which allows the receiver to send arbitrary data to the spender in PaymentDetails and receive it back in Payments"
[pp PKI data]: /en/developer-examples#term-pp-pki-data "The pki_data field of a PaymentRequest which provides details such as certificates necessary to validate the request" [pp PKI data]: /en/developer-examples#term-pp-pki-data "The pki_data field of a PaymentRequest which provides details such as certificates necessary to validate the request"
[pp pki type]: /en/developer-examples#term-pp-pki-type "The PKI field of a PaymentRequest which tells spenders how to validate this request as being from a specific recipient" [pp pki type]: /en/developer-examples#term-pp-pki-type "The PKI field of a PaymentRequest which tells spenders how to validate this request as being from a specific recipient"
[pp script]: /en/developer-examples#term-pp-script "The script field of a PaymentDetails where the receiver tells the spender what output scripts to pay" [pp script]: /en/developer-examples#term-pp-script "The script field of a PaymentDetails where the receiver tells the spender what pubkey scripts to pay"
[proof of work]: /en/developer-guide#term-proof-of-work "Proof that computationally-difficult work was performed which helps secure blocks against modification, protecting transaction history" [proof of work]: /en/developer-guide#term-proof-of-work "Proof that computationally-difficult work was performed which helps secure blocks against modification, protecting transaction history"
[Pubkey]: /en/developer-guide#term-pubkey "A standard output scriptPubKey which specifies the full public key to match a signature; used in coinbase transactions" [Pubkey]: /en/developer-guide#term-pubkey "A cryptographic public key derived from a private key and which can match a signature made by that same private key"
[pubkey script]: /en/developer-guide#term-pubkey-script "The part of an output which sets the conditions for spending of the satoshis in that output"
[r]: /en/developer-guide#term-r-parameter "The payment request parameter in a bitcoin: URI" [r]: /en/developer-guide#term-r-parameter "The payment request parameter in a bitcoin: URI"
[raw format]: /en/developer-reference#term-raw-format "Complete transactions in their binary format; often represented using hexidecimal" [raw format]: /en/developer-reference#term-raw-format "Complete transactions in their binary format; often represented using hexidecimal"
[receipt]: /en/developer-guide#term-receipt "A cryptographically-verifiable receipt created using parts of a payment request and a confirmed transaction" [receipt]: /en/developer-guide#term-receipt "A cryptographically-verifiable receipt created using parts of a payment request and a confirmed transaction"
[recurrent rebilling]: /en/developer-guide#rebilling-recurring-payments "Billing a spender on a regular schedule" [recurrent rebilling]: /en/developer-guide#rebilling-recurring-payments "Billing a spender on a regular schedule"
[redeemScript]: /en/developer-guide#term-redeemscript "A script created by the recipient, hashed, and given to the spender for use in a P2SH output" [redeem script]: /en/developer-guide#term-redeem-script "A pubkey script created by the recipient, hashed, and given to the spender for use in a P2SH output"
[refund]: /en/developer-guide#issuing-refunds "A transaction which refunds some or all satoshis received in a previous transaction" [refund]: /en/developer-guide#issuing-refunds "A transaction which refunds some or all satoshis received in a previous transaction"
[regression test mode]: /en/developer-examples#regtest-mode "A local testing environment in which developers can control blocks" [regression test mode]: /en/developer-examples#regtest-mode "A local testing environment in which developers can control blocks"
[root certificate]: /en/developer-examples#term-root-certificate "A certificate belonging to a certificate authority (CA)" [root certificate]: /en/developer-examples#term-root-certificate "A certificate belonging to a certificate authority (CA)"
@ -122,23 +122,21 @@
[satoshi]: /en/developer-guide#term-satoshi "The smallest unit of Bitcoin value; 0.00000001 bitcoins. Also used generically for any value of bitcoins" [satoshi]: /en/developer-guide#term-satoshi "The smallest unit of Bitcoin value; 0.00000001 bitcoins. Also used generically for any value of bitcoins"
[satoshis]: /en/developer-guide#term-satoshi "The smallest unit of Bitcoin value; 0.00000001 bitcoins. Also used generically for any value of bitcoins" [satoshis]: /en/developer-guide#term-satoshi "The smallest unit of Bitcoin value; 0.00000001 bitcoins. Also used generically for any value of bitcoins"
[sequence number]: /en/developer-guide#term-sequence-number "A number intended to allow time locked transactions to be updated before being finalized; not currently used except to disable locktime in a transaction" [sequence number]: /en/developer-guide#term-sequence-number "A number intended to allow time locked transactions to be updated before being finalized; not currently used except to disable locktime in a transaction"
[scriptPubKey]: /en/developer-guide#term-scriptpubkey "The part of an output which sets the conditions for spending of the satoshis in that output" [script hash]: /en/developer-guide#term-script-hash "The hash of a redeem script used to create a P2SH output"
[scriptPubKeys]: /en/developer-guide#term-scriptpubkey "The part of an output which sets the conditions for spending of the satoshis in that output"
[scriptSig]: /en/developer-guide#term-scriptsig "Data generated by a spender which is almost always used as variables to satisfy an output script"
[script hash]: /en/developer-guide#term-script-hash "The hash of a redeemScript used to create a P2SH output"
[sha_shacp]: /en/developer-guide#term-sighash-all-sighash-anyonecanpay "Signature hash type which allows other people to contribute satoshis without changing the number of satoshis sent nor where they go" [sha_shacp]: /en/developer-guide#term-sighash-all-sighash-anyonecanpay "Signature hash type which allows other people to contribute satoshis without changing the number of satoshis sent nor where they go"
[shacp]: /en/developer-guide#term-sighash-anyonecanpay "A signature hash type which modifies the behavior of other signature hash types" [shacp]: /en/developer-guide#term-sighash-anyonecanpay "A signature hash type which modifies the behavior of other signature hash types"
[shn_shacp]: /en/developer-guide#term-sighash-none-sighash-anyonecanpay "Signature hash type which allows unfettered modification of a transaction" [shn_shacp]: /en/developer-guide#term-sighash-none-sighash-anyonecanpay "Signature hash type which allows unfettered modification of a transaction"
[shs_shacp]: /en/developer-guide#term-sighash-single-sighash-anyonecanpay "Signature hash type which allows modification of the entire transaction except the signed input and the output with the same index number" [shs_shacp]: /en/developer-guide#term-sighash-single-sighash-anyonecanpay "Signature hash type which allows modification of the entire transaction except the signed input and the output with the same index number"
[sighash_all]: /en/developer-guide#term-sighash-all "Default signature hash type which signs the entire transaction except any scriptSigs, preventing modification of the signed parts" [sighash_all]: /en/developer-guide#term-sighash-all "Default signature hash type which signs the entire transaction except any signature scripts, preventing modification of the signed parts"
[sighash_none]: /en/developer-guide#term-sighash-none "Signature hash type which only signs the inputs, allowing anyone to change the outputs however they'd like" [sighash_none]: /en/developer-guide#term-sighash-none "Signature hash type which only signs the inputs, allowing anyone to change the outputs however they'd like"
[sighash_single]: /en/developer-guide#term-sighash-single "Signature hash type which only signs its input and the output with the same index value, allowing modification of other inputs and outputs" [sighash_single]: /en/developer-guide#term-sighash-single "Signature hash type which only signs its input and the output with the same index value, allowing modification of other inputs and outputs"
[signature]: /en/developer-guide#term-signature "The result of combining a private key and some data in an ECDSA signature operation which allows anyone with the corresponding public key to verify the signature" [signature]: /en/developer-guide#term-signature "The result of combining a private key and some data in an ECDSA signature operation which allows anyone with the corresponding public key to verify the signature"
[signature hash]: /en/developer-guide#term-signature-hash "A byte appended onto signatures generated in Bitcoin which allows the signer to specify what data was signed, allowing modification of the unsigned data" [signature hash]: /en/developer-guide#term-signature-hash "A byte appended onto signatures generated in Bitcoin which allows the signer to specify what data was signed, allowing modification of the unsigned data"
[signature script]: /en/developer-guide#term-signature-script "Data generated by a spender which is almost always used as variables to satisfy a pubkey script"
[spv]: /en/developer-guide#simplified-payment-verification-spv "A method for verifying particular transactions were included in blocks without downloading the entire contents of the block chain" [spv]: /en/developer-guide#simplified-payment-verification-spv "A method for verifying particular transactions were included in blocks without downloading the entire contents of the block chain"
[ssl signature]: /en/developer-examples#term-ssl-signature "Signatures created and recognized by major SSL implementations such as OpenSSL" [ssl signature]: /en/developer-examples#term-ssl-signature "Signatures created and recognized by major SSL implementations such as OpenSSL"
[stack]: /en/developer-guide#term-stack "An evaluation stack used in Bitcoin's script language" [stack]: /en/developer-guide#term-stack "An evaluation stack used in Bitcoin's script language"
[standard script]: /en/developer-guide#standard-transactions "An output scriptPubKey which matches the isStandard() patterns specified in Bitcoin Core---or a transaction containing only standard outputs. Only standard transactions are mined or broadcast by peers running the default Bitcoin Core software" [standard script]: /en/developer-guide#standard-transactions "A pubkey script which matches the IsStandard() patterns specified in Bitcoin Core---or a transaction containing only standard outputs. Only standard transactions are mined or broadcast by peers running the default Bitcoin Core software"
[target]: /en/developer-guide#term-target "The threshold below which a block header hash must be in order for the block to be added to the block chain" [target]: /en/developer-guide#term-target "The threshold below which a block header hash must be in order for the block to be added to the block chain"
[testnet]: /en/developer-examples#testnet "A Bitcoin-like network where the satoshis have no real-world value to allow risk-free testing" [testnet]: /en/developer-examples#testnet "A Bitcoin-like network where the satoshis have no real-world value to allow risk-free testing"
[transaction fee]: /en/developer-guide#term-transaction-fee "The amount remaining when all outputs are subtracted from all inputs in a transaction; the fee is paid to the miner who includes that transaction in a block" [transaction fee]: /en/developer-guide#term-transaction-fee "The amount remaining when all outputs are subtracted from all inputs in a transaction; the fee is paid to the miner who includes that transaction in a block"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Before After
Before After

View file

@ -4,35 +4,35 @@
<!-- Generated by graphviz version 2.26.3 (20100126.1600) <!-- Generated by graphviz version 2.26.3 (20100126.1600)
--> -->
<!-- Title: blockchain Pages: 1 --> <!-- Title: blockchain Pages: 1 -->
<svg width="450pt" height="105pt" <svg width="450pt" height="104pt"
viewBox="0.00 0.00 450.00 104.55" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> viewBox="0.00 0.00 450.00 103.90" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph1" class="graph" transform="scale(0.706436 0.706436) rotate(0) translate(4 144)"> <g id="graph1" class="graph" transform="scale(0.702028 0.702028) rotate(0) translate(4 144)">
<title>blockchain</title> <title>blockchain</title>
<polygon fill="white" stroke="white" points="-4,5 -4,-144 634,-144 634,5 -4,5"/> <polygon fill="white" stroke="white" points="-4,5 -4,-144 638,-144 638,5 -4,5"/>
<text text-anchor="middle" x="314.5" y="-8.4" font-family="Sans" font-size="14.00">Creating A P2SH RedeemScript Hash To Receive Payment</text> <text text-anchor="middle" x="316.5" y="-8.4" font-family="Times Roman,serif" font-size="14.00">Creating A P2SH Redeem Script Hash To Receive Payment</text>
<g id="graph2" class="cluster"><title>cluster_bob</title> <g id="graph2" class="cluster"><title>cluster_bob</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="8,-41 8,-124 386,-124 386,-41 8,-41"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="8,-41 8,-124 390,-124 390,-41 8,-41"/>
<text text-anchor="middle" x="197" y="-107.4" font-family="Sans" font-size="14.00">Bob&#39;s Computer</text> <text text-anchor="middle" x="199" y="-107.4" font-family="Times Roman,serif" font-size="14.00">Bob&#39;s Computer</text>
</g> </g>
<g id="graph3" class="cluster"><title>cluster_alice</title> <g id="graph3" class="cluster"><title>cluster_alice</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="394,-33 394,-132 525,-132 525,-33 394,-33"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="398,-33 398,-132 529,-132 529,-33 398,-33"/>
<text text-anchor="middle" x="459.5" y="-115.4" font-family="Sans" font-size="14.00">Alice&#39;s Computer</text> <text text-anchor="middle" x="463.5" y="-115.4" font-family="Times Roman,serif" font-size="14.00">Alice&#39;s Computer</text>
</g> </g>
<g id="graph4" class="cluster"><title>cluster_tx1</title> <g id="graph4" class="cluster"><title>cluster_tx1</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="533,-33 533,-132 621,-132 621,-33 533,-33"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="537,-33 537,-132 625,-132 625,-33 537,-33"/>
<text text-anchor="middle" x="577" y="-115.4" font-family="Sans" font-size="14.00">TX 1</text> <text text-anchor="middle" x="581" y="-115.4" font-family="Times Roman,serif" font-size="14.00">TX 1</text>
</g> </g>
<!-- private_key --> <!-- private_key -->
<g id="node2" class="node"><title>private_key</title> <g id="node2" class="node"><title>private_key</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="82,-91 16,-91 16,-49 82,-49 82,-91"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="82,-91 16,-91 16,-49 82,-49 82,-91"/>
<text text-anchor="middle" x="49" y="-74.4" font-family="Sans" font-size="14.00">Private</text> <text text-anchor="middle" x="49" y="-74.4" font-family="Times Roman,serif" font-size="14.00">Private</text>
<text text-anchor="middle" x="49" y="-57.4" font-family="Sans" font-size="14.00">Key</text> <text text-anchor="middle" x="49" y="-57.4" font-family="Times Roman,serif" font-size="14.00">Key</text>
</g> </g>
<!-- full_public_key --> <!-- full_public_key -->
<g id="node3" class="node"><title>full_public_key</title> <g id="node3" class="node"><title>full_public_key</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="182,-91 96,-91 96,-49 182,-49 182,-91"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="182,-91 96,-91 96,-49 182,-49 182,-91"/>
<text text-anchor="middle" x="139" y="-74.4" font-family="Sans" font-size="14.00">Full</text> <text text-anchor="middle" x="139" y="-74.4" font-family="Times Roman,serif" font-size="14.00">Full</text>
<text text-anchor="middle" x="139" y="-57.4" font-family="Sans" font-size="14.00">Public Key</text> <text text-anchor="middle" x="139" y="-57.4" font-family="Times Roman,serif" font-size="14.00">Public Key</text>
</g> </g>
<!-- private_key&#45;&gt;full_public_key --> <!-- private_key&#45;&gt;full_public_key -->
<g id="edge5" class="edge"><title>private_key&#45;&gt;full_public_key</title> <g id="edge5" class="edge"><title>private_key&#45;&gt;full_public_key</title>
@ -41,48 +41,48 @@
</g> </g>
<!-- redeemScript --> <!-- redeemScript -->
<g id="node4" class="node"><title>redeemScript</title> <g id="node4" class="node"><title>redeemScript</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="307,-88 197,-88 197,-52 307,-52 307,-88"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="312,-88 196,-88 196,-52 312,-52 312,-88"/>
<text text-anchor="middle" x="252" y="-65.9" font-family="Sans" font-size="14.00">RedeemScript</text> <text text-anchor="middle" x="254" y="-65.9" font-family="Times Roman,serif" font-size="14.00">Redeem Script</text>
</g> </g>
<!-- full_public_key&#45;&gt;redeemScript --> <!-- full_public_key&#45;&gt;redeemScript -->
<g id="edge6" class="edge"><title>full_public_key&#45;&gt;redeemScript</title> <g id="edge6" class="edge"><title>full_public_key&#45;&gt;redeemScript</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M182.043,-70C183.341,-70 184.649,-70 185.964,-70"/> <path fill="none" stroke="black" stroke-width="1.75" d="M182.149,-70C183.264,-70 184.387,-70 185.516,-70"/>
<polygon fill="black" stroke="black" points="186.138,-73.5001 196.138,-70 186.137,-66.5001 186.138,-73.5001"/> <polygon fill="black" stroke="black" points="185.785,-73.5001 195.785,-70 185.785,-66.5001 185.785,-73.5001"/>
</g> </g>
<!-- script_hash --> <!-- script_hash -->
<g id="node5" class="node"><title>script_hash</title> <g id="node5" class="node"><title>script_hash</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="378,-91 322,-91 322,-49 378,-49 378,-91"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="382,-91 326,-91 326,-49 382,-49 382,-91"/>
<text text-anchor="middle" x="350" y="-74.4" font-family="Sans" font-size="14.00">Script</text> <text text-anchor="middle" x="354" y="-74.4" font-family="Times Roman,serif" font-size="14.00">Script</text>
<text text-anchor="middle" x="350" y="-57.4" font-family="Sans" font-size="14.00">Hash</text> <text text-anchor="middle" x="354" y="-57.4" font-family="Times Roman,serif" font-size="14.00">Hash</text>
</g> </g>
<!-- redeemScript&#45;&gt;script_hash --> <!-- redeemScript&#45;&gt;script_hash -->
<g id="edge7" class="edge"><title>redeemScript&#45;&gt;script_hash</title> <g id="edge7" class="edge"><title>redeemScript&#45;&gt;script_hash</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M307.586,-70C308.947,-70 310.3,-70 311.643,-70"/> <path fill="none" stroke="black" stroke-width="1.75" d="M312.17,-70C313.331,-70 314.485,-70 315.63,-70"/>
<polygon fill="black" stroke="black" points="311.646,-73.5001 321.646,-70 311.646,-66.5001 311.646,-73.5001"/> <polygon fill="black" stroke="black" points="315.637,-73.5001 325.637,-70 315.637,-66.5001 315.637,-73.5001"/>
</g> </g>
<!-- spender_script_hash --> <!-- spender_script_hash -->
<g id="node7" class="node"><title>spender_script_hash</title> <g id="node7" class="node"><title>spender_script_hash</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="494,-99.5 424,-99.5 424,-40.5 494,-40.5 494,-99.5"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="498,-99.5 428,-99.5 428,-40.5 498,-40.5 498,-99.5"/>
<text text-anchor="middle" x="459" y="-82.9" font-family="Sans" font-size="14.00">Copy Of</text> <text text-anchor="middle" x="463" y="-82.9" font-family="Times Roman,serif" font-size="14.00">Copy Of</text>
<text text-anchor="middle" x="459" y="-65.9" font-family="Sans" font-size="14.00">Script</text> <text text-anchor="middle" x="463" y="-65.9" font-family="Times Roman,serif" font-size="14.00">Script</text>
<text text-anchor="middle" x="459" y="-48.9" font-family="Sans" font-size="14.00">Hash</text> <text text-anchor="middle" x="463" y="-48.9" font-family="Times Roman,serif" font-size="14.00">Hash</text>
</g> </g>
<!-- script_hash&#45;&gt;spender_script_hash --> <!-- script_hash&#45;&gt;spender_script_hash -->
<g id="edge8" class="edge"><title>script_hash&#45;&gt;spender_script_hash</title> <g id="edge8" class="edge"><title>script_hash&#45;&gt;spender_script_hash</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M378.07,-70C388.706,-70 401.113,-70 412.972,-70"/> <path fill="none" stroke="black" stroke-width="1.75" d="M382.07,-70C392.706,-70 405.113,-70 416.972,-70"/>
<polygon fill="black" stroke="black" points="413.194,-73.5001 423.194,-70 413.194,-66.5001 413.194,-73.5001"/> <polygon fill="black" stroke="black" points="417.194,-73.5001 427.194,-70 417.194,-66.5001 417.194,-73.5001"/>
</g> </g>
<!-- tx1_script_hash --> <!-- tx1_script_hash -->
<g id="node9" class="node"><title>tx1_script_hash</title> <g id="node9" class="node"><title>tx1_script_hash</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="612,-99.5 542,-99.5 542,-40.5 612,-40.5 612,-99.5"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="616,-99.5 546,-99.5 546,-40.5 616,-40.5 616,-99.5"/>
<text text-anchor="middle" x="577" y="-82.9" font-family="Sans" font-size="14.00">Copy Of</text> <text text-anchor="middle" x="581" y="-82.9" font-family="Times Roman,serif" font-size="14.00">Copy Of</text>
<text text-anchor="middle" x="577" y="-65.9" font-family="Sans" font-size="14.00">Script</text> <text text-anchor="middle" x="581" y="-65.9" font-family="Times Roman,serif" font-size="14.00">Script</text>
<text text-anchor="middle" x="577" y="-48.9" font-family="Sans" font-size="14.00">Hash</text> <text text-anchor="middle" x="581" y="-48.9" font-family="Times Roman,serif" font-size="14.00">Hash</text>
</g> </g>
<!-- spender_script_hash&#45;&gt;tx1_script_hash --> <!-- spender_script_hash&#45;&gt;tx1_script_hash -->
<g id="edge9" class="edge"><title>spender_script_hash&#45;&gt;tx1_script_hash</title> <g id="edge9" class="edge"><title>spender_script_hash&#45;&gt;tx1_script_hash</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M494.724,-70C506.161,-70 518.988,-70 531.05,-70"/> <path fill="none" stroke="black" stroke-width="1.75" d="M498.724,-70C510.161,-70 522.988,-70 535.05,-70"/>
<polygon fill="black" stroke="black" points="531.397,-73.5001 541.397,-70 531.397,-66.5001 531.397,-73.5001"/> <polygon fill="black" stroke="black" points="535.397,-73.5001 545.397,-70 535.397,-66.5001 535.397,-73.5001"/>
</g> </g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Before After
Before After

View file

@ -23,7 +23,7 @@ subgraph cluster_alice {
alice_pubkey [style = invis, label="PubKey", shape = "" ]; alice_pubkey [style = invis, label="PubKey", shape = "" ];
alice_sig [style = invis, label="Sig", shape = "" ]; alice_sig [style = invis, label="Sig", shape = "" ];
label = "Instructions And Data Provided By Alice In Transaction #1's Output Script" label = "Instructions And Data Provided By Alice In Transaction #1's Pubkey Script"
/* label = "Data Provided By Spender 1 To Spend Output" */ /* label = "Data Provided By Spender 1 To Spend Output" */
} }
@ -37,7 +37,7 @@ subgraph cluster_bob {
bob_pubkey [style = unfilled, label="PubKey", shape = "" ]; bob_pubkey [style = unfilled, label="PubKey", shape = "" ];
bob_sig [style = unfilled, label="Sig", shape = "" ]; bob_sig [style = unfilled, label="Sig", shape = "" ];
label = "Data Provided By Bob In Transaction #2's Input ScriptSig" label = "Data Provided By Bob In Transaction #2's Input Signature Script"
} }
alice_sig -> bob_sig; alice_sig -> bob_sig;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Before After
Before After

View file

@ -12,11 +12,11 @@
<text text-anchor="middle" x="376" y="-8.4" font-family="Sans" font-size="14.00">Evaluation Stack Over Time During Succesful P2PKH Script Validation</text> <text text-anchor="middle" x="376" y="-8.4" font-family="Sans" font-size="14.00">Evaluation Stack Over Time During Succesful P2PKH Script Validation</text>
<g id="graph2" class="cluster"><title>cluster_alice</title> <g id="graph2" class="cluster"><title>cluster_alice</title>
<polygon fill="grey" stroke="black" points="8,-462 8,-539 710,-539 710,-462 8,-462"/> <polygon fill="grey" stroke="black" points="8,-462 8,-539 710,-539 710,-462 8,-462"/>
<text text-anchor="middle" x="359" y="-522.4" font-family="Sans" font-size="14.00">Instructions And Data Provided By Alice In Transaction #1&#39;s Output Script</text> <text text-anchor="middle" x="359" y="-522.4" font-family="Sans" font-size="14.00">Instructions And Data Provided By Alice In Transaction #1&#39;s Pubkey Script</text>
</g> </g>
<g id="graph3" class="cluster"><title>cluster_bob</title> <g id="graph3" class="cluster"><title>cluster_bob</title>
<polygon fill="grey" stroke="black" points="8,-377 8,-454 710,-454 710,-377 8,-377"/> <polygon fill="grey" stroke="black" points="8,-377 8,-454 710,-454 710,-377 8,-377"/>
<text text-anchor="middle" x="359" y="-437.4" font-family="Sans" font-size="14.00">Data Provided By Bob In Transaction #2&#39;s Input ScriptSig</text> <text text-anchor="middle" x="359" y="-437.4" font-family="Sans" font-size="14.00">Data Provided By Bob In Transaction #2&#39;s Input Signature Script</text>
</g> </g>
<!-- alice_opchecksig --> <!-- alice_opchecksig -->
<g id="node2" class="node"><title>alice_opchecksig</title> <g id="node2" class="node"><title>alice_opchecksig</title>

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Before After
Before After

View file

@ -2,7 +2,7 @@ digraph blockchain {
size="6.25"; size="6.25";
//splines = "false"; splines = "false";
rankdir=TB; rankdir=TB;
ranksep=-0.1; ranksep=-0.1;
//splines=ortho; //splines=ortho;
@ -16,7 +16,7 @@ penwidth = 1.75;
subgraph cluster_tx1 { subgraph cluster_tx1 {
tx1_txid [ label = "TXID" ]; tx1_txid [ label = "TXID" ];
tx1_vout [ label = "Output Index Number" ]; tx1_vout [ label = "Output Index Number" ];
tx1_script [ label = "Script" ]; tx1_script [ label = "Pubkey Script" ];
label = "Transaction 1 (TX 1)" label = "Transaction 1 (TX 1)"
} }
@ -30,7 +30,7 @@ subgraph cluster_sig {
sig_tx1_vout [ width = 2.3 ]; sig_tx1_vout [ width = 2.3 ];
sig_tx1_script [ width = 1.6 ]; sig_tx1_script [ width = 1.6 ];
//nil_pubkey [ width = 1.3 ]; //nil_pubkey [ width = 1.3 ];
sig_tx2t_script [ width = 0.75 ]; sig_tx2t_script [ width = 1.65 ];
sig_tx2t_amount [ width = 0.95 ]; sig_tx2t_amount [ width = 0.95 ];
signature [ width = 1.25 ]; signature [ width = 1.25 ];
@ -41,7 +41,7 @@ subgraph cluster_sig {
subgraph cluster_tx2 { subgraph cluster_tx2 {
tx2_tx1_txid [ label = "TXID" ]; tx2_tx1_txid [ label = "TXID" ];
tx2_tx1_vout [ label = "Output Index Number" ]; tx2_tx1_vout [ label = "Output Index Number" ];
tx2_script [ label = "Script" ]; tx2_script [ label = "Pubkey Script" ];
public_key [ label = "Full Public Key" ]; public_key [ label = "Full Public Key" ];
tx2_amount [ label = "Amount" ]; tx2_amount [ label = "Amount" ];
tx2_signature [ label = "Signature" ]; tx2_signature [ label = "Signature" ];
@ -54,7 +54,7 @@ subgraph cluster_bob {
label = "Bob's Computer" label = "Bob's Computer"
subgraph cluster_tx2t { subgraph cluster_tx2t {
tx2t_script [ label = "Script" ]; tx2t_script [ label = "Pubkey Script" ];
tx2t_amount [ label = "Amount" ]; tx2t_amount [ label = "Amount" ];
label = "TX2 Template" label = "TX2 Template"
@ -65,22 +65,25 @@ subgraph cluster_tx2t {
{ {
edge [ arrowhead = "dot" ]; edge [ arrowhead = "dot" ];
tx1_script -> sig_tx1_script; tx1_script -> sig_tx1_script;
tx1_txid -> sig_tx1_txid; tx1_txid -> sig_tx1_txid [ style = "invis" ];
tx1_vout -> sig_tx1_vout; tx1_vout -> sig_tx1_vout [ style = "invis" ];
tx2t_script -> sig_tx2t_script; tx2t_script -> sig_tx2t_script [ style = "invis" ];
tx2t_amount -> sig_tx2t_amount; tx2t_amount -> sig_tx2t_amount [ style = "invis" ];
private_key -> signature [ style = "dotted" ]; private_key -> signature [ style = "dotted" ];
} }
sig_tx1_txid -> tx2_tx1_txid; sig_tx1_txid -> tx2_tx1_txid [ style = "invis" ];
sig_tx1_vout -> tx2_tx1_vout; sig_tx1_vout -> tx2_tx1_vout [ style = "invis" ];
sig_tx2t_script -> tx2_script; sig_tx2t_script -> tx2_script [ style = "invis" ];
sig_tx2t_amount -> tx2_amount; sig_tx2t_amount -> tx2_amount [ style = "invis" ];
signature -> tx2_signature; signature -> tx2_signature;
tx1_txid -> tx2_tx1_txid [ constraint = false ];
tx1_vout -> tx2_tx1_vout [ constraint = false ];
tx2t_script -> tx2_script [ constraint = false ];
tx2t_amount -> tx2_amount [ constraint = false ];
label = "Some Of The Data Signed By Default" label = "Some Of The Data Signed By Default"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Before After
Before After

View file

@ -4,152 +4,140 @@
<!-- Generated by graphviz version 2.26.3 (20100126.1600) <!-- Generated by graphviz version 2.26.3 (20100126.1600)
--> -->
<!-- Title: blockchain Pages: 1 --> <!-- Title: blockchain Pages: 1 -->
<svg width="450pt" height="230pt" <svg width="450pt" height="203pt"
viewBox="0.00 0.00 450.00 230.35" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> viewBox="0.00 0.00 450.00 203.29" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph1" class="graph" transform="scale(0.713154 0.713154) rotate(0) translate(4 319)"> <g id="graph1" class="graph" transform="scale(0.629371 0.629371) rotate(0) translate(4 319)">
<title>blockchain</title> <title>blockchain</title>
<polygon fill="white" stroke="white" points="-4,5 -4,-319 628,-319 628,5 -4,5"/> <polygon fill="white" stroke="white" points="-4,5 -4,-319 712,-319 712,5 -4,5"/>
<text text-anchor="middle" x="311.5" y="-8.4" font-family="Sans" font-size="14.00">Some Of The Data Signed By Default</text> <text text-anchor="middle" x="353.5" y="-8.4" font-family="Times Roman,serif" font-size="14.00">Some Of The Data Signed By Default</text>
<g id="graph2" class="cluster"><title>cluster_tx1</title> <g id="graph2" class="cluster"><title>cluster_tx1</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="9,-197 9,-274 317,-274 317,-197 9,-197"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="8,-197 8,-274 370,-274 370,-197 8,-197"/>
<text text-anchor="middle" x="163" y="-257.4" font-family="Sans" font-size="14.00">Transaction 1 (TX 1)</text> <text text-anchor="middle" x="189" y="-257.4" font-family="Times Roman,serif" font-size="14.00">Transaction 1 (TX 1)</text>
</g> </g>
<g id="graph3" class="cluster"><title>cluster_sig</title> <g id="graph3" class="cluster"><title>cluster_sig</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="11,-128 11,-171 604,-171 604,-128 11,-128"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="14,-128 14,-171 671,-171 671,-128 14,-128"/>
<text text-anchor="middle" x="307.5" y="-154.4" font-family="Sans" font-size="14.00">Signed Data</text> <text text-anchor="middle" x="342.5" y="-154.4" font-family="Times Roman,serif" font-size="14.00"> &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Signed Data</text>
</g> </g>
<g id="graph4" class="cluster"><title>cluster_tx2</title> <g id="graph4" class="cluster"><title>cluster_tx2</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="8,-33 8,-110 605,-110 605,-33 8,-33"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="12,-33 12,-110 663,-110 663,-33 12,-33"/>
<text text-anchor="middle" x="306.5" y="-93.4" font-family="Sans" font-size="14.00">Transaction 2</text> <text text-anchor="middle" x="337.5" y="-93.4" font-family="Times Roman,serif" font-size="14.00">Transaction 2</text>
</g> </g>
<g id="graph5" class="cluster"><title>cluster_bob</title> <g id="graph5" class="cluster"><title>cluster_bob</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="348,-189 348,-307 615,-307 615,-189 348,-189"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="378,-189 378,-307 699,-307 699,-189 378,-189"/>
<text text-anchor="middle" x="481.5" y="-290.4" font-family="Sans" font-size="14.00">Bob&#39;s Computer</text> <text text-anchor="middle" x="538.5" y="-290.4" font-family="Times Roman,serif" font-size="14.00">Bob&#39;s Computer</text>
</g> </g>
<g id="graph6" class="cluster"><title>cluster_tx2t</title> <g id="graph6" class="cluster"><title>cluster_tx2t</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="458,-197 458,-274 607,-274 607,-197 458,-197"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="488,-197 488,-274 691,-274 691,-197 488,-197"/>
<text text-anchor="middle" x="532.5" y="-257.4" font-family="Sans" font-size="14.00">TX2 Template</text> <text text-anchor="middle" x="589.5" y="-257.4" font-family="Times Roman,serif" font-size="14.00">TX2 Template</text>
</g> </g>
<!-- tx1_txid --> <!-- tx1_txid -->
<g id="node2" class="node"><title>tx1_txid</title> <g id="node2" class="node"><title>tx1_txid</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="71,-241 17,-241 17,-205 71,-205 71,-241"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="70,-241 16,-241 16,-205 70,-205 70,-241"/>
<text text-anchor="middle" x="44" y="-218.9" font-family="Sans" font-size="14.00">TXID</text> <text text-anchor="middle" x="43" y="-218.9" font-family="Times Roman,serif" font-size="14.00">TXID</text>
</g> </g>
<!-- sig_tx1_txid --> <!-- sig_tx1_txid -->
<!-- tx1_txid&#45;&gt;sig_tx1_txid --> <!-- tx1_txid&#45;&gt;sig_tx1_txid -->
<g id="edge10" class="edge"><title>tx1_txid&#45;&gt;sig_tx1_txid</title> <!-- tx2_tx1_txid -->
<path fill="none" stroke="black" stroke-width="1.75" d="M44,-204.762C44,-186.762 44,-159.981 44,-146.092"/> <g id="node13" class="node"><title>tx2_tx1_txid</title>
<ellipse fill="black" stroke="black" cx="44" cy="-141.75" rx="4" ry="4"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="74,-77 20,-77 20,-41 74,-41 74,-77"/>
<text text-anchor="middle" x="47" y="-54.9" font-family="Times Roman,serif" font-size="14.00">TXID</text>
</g>
<!-- tx1_txid&#45;&gt;tx2_tx1_txid -->
<g id="edge30" class="edge"><title>tx1_txid&#45;&gt;tx2_tx1_txid</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M43.4434,-204.823C44.1371,-176.377 45.485,-121.115 46.3076,-87.3904"/>
<polygon fill="black" stroke="black" points="49.8097,-87.3413 46.5547,-77.2589 42.8118,-87.1705 49.8097,-87.3413"/>
</g> </g>
<!-- tx1_vout --> <!-- tx1_vout -->
<g id="node3" class="node"><title>tx1_vout</title> <g id="node3" class="node"><title>tx1_vout</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="246,-241 78,-241 78,-205 246,-205 246,-241"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="245,-241 77,-241 77,-205 245,-205 245,-241"/>
<text text-anchor="middle" x="162" y="-218.9" font-family="Sans" font-size="14.00">Output Index Number</text> <text text-anchor="middle" x="161" y="-218.9" font-family="Times Roman,serif" font-size="14.00">Output Index Number</text>
</g> </g>
<!-- sig_tx1_vout --> <!-- sig_tx1_vout -->
<!-- tx1_vout&#45;&gt;sig_tx1_vout --> <!-- tx1_vout&#45;&gt;sig_tx1_vout -->
<g id="edge12" class="edge"><title>tx1_vout&#45;&gt;sig_tx1_vout</title> <!-- tx2_tx1_vout -->
<path fill="none" stroke="black" stroke-width="1.75" d="M161.364,-204.762C160.736,-186.762 159.802,-159.981 159.317,-146.092"/> <g id="node14" class="node"><title>tx2_tx1_vout</title>
<ellipse fill="black" stroke="black" cx="159.166" cy="-141.748" rx="4" ry="4"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="249,-77 81,-77 81,-41 249,-41 249,-77"/>
<text text-anchor="middle" x="165" y="-54.9" font-family="Times Roman,serif" font-size="14.00">Output Index Number</text>
</g>
<!-- tx1_vout&#45;&gt;tx2_tx1_vout -->
<g id="edge32" class="edge"><title>tx1_vout&#45;&gt;tx2_tx1_vout</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M161.443,-204.823C162.137,-176.377 163.485,-121.115 164.308,-87.3904"/>
<polygon fill="black" stroke="black" points="167.81,-87.3413 164.555,-77.2589 160.812,-87.1705 167.81,-87.3413"/>
</g> </g>
<!-- tx1_script --> <!-- tx1_script -->
<g id="node4" class="node"><title>tx1_script</title> <g id="node4" class="node"><title>tx1_script</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="309,-241 253,-241 253,-205 309,-205 309,-241"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="362,-241 252,-241 252,-205 362,-205 362,-241"/>
<text text-anchor="middle" x="281" y="-218.9" font-family="Sans" font-size="14.00">Script</text> <text text-anchor="middle" x="307" y="-218.9" font-family="Times Roman,serif" font-size="14.00">Pubkey Script</text>
</g> </g>
<!-- sig_tx1_script --> <!-- sig_tx1_script -->
<!-- tx1_script&#45;&gt;sig_tx1_script --> <!-- tx1_script&#45;&gt;sig_tx1_script -->
<g id="edge8" class="edge"><title>tx1_script&#45;&gt;sig_tx1_script</title> <g id="edge8" class="edge"><title>tx1_script&#45;&gt;sig_tx1_script</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M286.302,-204.762C291.587,-186.58 299.477,-159.439 303.478,-145.675"/> <path fill="none" stroke="black" stroke-width="1.75" d="M307.424,-204.762C307.843,-186.762 308.466,-159.981 308.789,-146.092"/>
<ellipse fill="black" stroke="black" cx="304.665" cy="-141.591" rx="4.00001" ry="4.00001"/> <ellipse fill="black" stroke="black" cx="308.89" cy="-141.749" rx="4" ry="4"/>
</g>
<!-- tx2_tx1_txid -->
<g id="node13" class="node"><title>tx2_tx1_txid</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="70,-77 16,-77 16,-41 70,-41 70,-77"/>
<text text-anchor="middle" x="43" y="-54.9" font-family="Sans" font-size="14.00">TXID</text>
</g> </g>
<!-- sig_tx1_txid&#45;&gt;tx2_tx1_txid --> <!-- sig_tx1_txid&#45;&gt;tx2_tx1_txid -->
<g id="edge20" class="edge"><title>sig_tx1_txid&#45;&gt;tx2_tx1_txid</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M43.9888,-136.124C43.9269,-131.3 43.6214,-107.47 43.3661,-87.5593"/>
<polygon fill="black" stroke="black" points="46.8631,-87.2911 43.2351,-77.3368 39.8637,-87.3809 46.8631,-87.2911"/>
</g>
<!-- tx2_tx1_vout -->
<g id="node14" class="node"><title>tx2_tx1_vout</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="245,-77 77,-77 77,-41 245,-41 245,-77"/>
<text text-anchor="middle" x="161" y="-54.9" font-family="Sans" font-size="14.00">Output Index Number</text>
</g>
<!-- sig_tx1_vout&#45;&gt;tx2_tx1_vout --> <!-- sig_tx1_vout&#45;&gt;tx2_tx1_vout -->
<g id="edge22" class="edge"><title>sig_tx1_vout&#45;&gt;tx2_tx1_vout</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M159.022,-136.124C159.146,-131.3 159.757,-107.47 160.268,-87.5593"/>
<polygon fill="black" stroke="black" points="163.772,-87.4233 160.53,-77.3368 156.775,-87.2438 163.772,-87.4233"/>
</g>
<!-- sig_tx2t_script --> <!-- sig_tx2t_script -->
<!-- tx2_script --> <!-- tx2_script -->
<g id="node15" class="node"><title>tx2_script</title> <g id="node15" class="node"><title>tx2_script</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="520,-77 464,-77 464,-41 520,-41 520,-77"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="578,-77 468,-77 468,-41 578,-41 578,-77"/>
<text text-anchor="middle" x="492" y="-54.9" font-family="Sans" font-size="14.00">Script</text> <text text-anchor="middle" x="523" y="-54.9" font-family="Times Roman,serif" font-size="14.00">Pubkey Script</text>
</g> </g>
<!-- sig_tx2t_script&#45;&gt;tx2_script --> <!-- sig_tx2t_script&#45;&gt;tx2_script -->
<g id="edge24" class="edge"><title>sig_tx2t_script&#45;&gt;tx2_script</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M493.978,-136.124C493.854,-131.3 493.243,-107.47 492.732,-87.5593"/>
<polygon fill="black" stroke="black" points="496.225,-87.2438 492.47,-77.3368 489.228,-87.4233 496.225,-87.2438"/>
</g>
<!-- sig_tx2t_amount --> <!-- sig_tx2t_amount -->
<!-- tx2_amount --> <!-- tx2_amount -->
<g id="node17" class="node"><title>tx2_amount</title> <g id="node17" class="node"><title>tx2_amount</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="597,-77 527,-77 527,-41 597,-41 597,-77"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="655,-77 585,-77 585,-41 655,-41 655,-77"/>
<text text-anchor="middle" x="562" y="-54.9" font-family="Sans" font-size="14.00">Amount</text> <text text-anchor="middle" x="620" y="-54.9" font-family="Times Roman,serif" font-size="14.00">Amount</text>
</g> </g>
<!-- sig_tx2t_amount&#45;&gt;tx2_amount --> <!-- sig_tx2t_amount&#45;&gt;tx2_amount -->
<g id="edge26" class="edge"><title>sig_tx2t_amount&#45;&gt;tx2_amount</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M562,-136.124C562,-131.3 562,-107.47 562,-87.5593"/>
<polygon fill="black" stroke="black" points="565.5,-87.3368 562,-77.3368 558.5,-87.3369 565.5,-87.3368"/>
</g>
<!-- signature --> <!-- signature -->
<!-- tx2_signature --> <!-- tx2_signature -->
<g id="node18" class="node"><title>tx2_signature</title> <g id="node18" class="node"><title>tx2_signature</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="457,-77 373,-77 373,-41 457,-41 457,-77"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="461,-77 377,-77 377,-41 461,-41 461,-77"/>
<text text-anchor="middle" x="415" y="-54.9" font-family="Sans" font-size="14.00">Signature</text> <text text-anchor="middle" x="419" y="-54.9" font-family="Times Roman,serif" font-size="14.00">Signature</text>
</g> </g>
<!-- signature&#45;&gt;tx2_signature --> <!-- signature&#45;&gt;tx2_signature -->
<g id="edge28" class="edge"><title>signature&#45;&gt;tx2_signature</title> <g id="edge28" class="edge"><title>signature&#45;&gt;tx2_signature</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M415,-136.124C415,-131.3 415,-107.47 415,-87.5593"/> <path fill="none" stroke="black" stroke-width="1.75" d="M418.011,-136.124C418.073,-131.3 418.379,-107.47 418.634,-87.5593"/>
<polygon fill="black" stroke="black" points="418.5,-87.3368 415,-77.3368 411.5,-87.3369 418.5,-87.3368"/> <polygon fill="black" stroke="black" points="422.136,-87.3809 418.765,-77.3368 415.137,-87.2911 422.136,-87.3809"/>
</g> </g>
<!-- public_key --> <!-- public_key -->
<g id="node16" class="node"><title>public_key</title> <g id="node16" class="node"><title>public_key</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="366,-77 252,-77 252,-41 366,-41 366,-77"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="370,-77 256,-77 256,-41 370,-41 370,-77"/>
<text text-anchor="middle" x="309" y="-54.9" font-family="Sans" font-size="14.00">Full Public Key</text> <text text-anchor="middle" x="313" y="-54.9" font-family="Times Roman,serif" font-size="14.00">Full Public Key</text>
</g> </g>
<!-- private_key --> <!-- private_key -->
<g id="node20" class="node"><title>private_key</title> <g id="node20" class="node"><title>private_key</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="450,-241 356,-241 356,-205 450,-205 450,-241"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="480,-241 386,-241 386,-205 480,-205 480,-241"/>
<text text-anchor="middle" x="403" y="-218.9" font-family="Sans" font-size="14.00">Private Key</text> <text text-anchor="middle" x="433" y="-218.9" font-family="Times Roman,serif" font-size="14.00">Private Key</text>
</g> </g>
<!-- private_key&#45;&gt;signature --> <!-- private_key&#45;&gt;signature -->
<g id="edge18" class="edge"><title>private_key&#45;&gt;signature</title> <g id="edge18" class="edge"><title>private_key&#45;&gt;signature</title>
<path fill="none" stroke="black" stroke-width="1.75" stroke-dasharray="1,5" d="M405.545,-204.762C408.082,-186.58 411.869,-159.439 413.79,-145.675"/> <path fill="none" stroke="black" stroke-width="1.75" stroke-dasharray="1,5" d="M429.819,-204.762C426.648,-186.58 421.914,-159.439 419.513,-145.675"/>
<ellipse fill="black" stroke="black" cx="414.343" cy="-141.712" rx="4.00001" ry="4.00001"/> <ellipse fill="black" stroke="black" cx="418.818" cy="-141.691" rx="4.00001" ry="4.00001"/>
</g> </g>
<!-- tx2t_script --> <!-- tx2t_script -->
<g id="node22" class="node"><title>tx2t_script</title> <g id="node22" class="node"><title>tx2t_script</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="522,-241 466,-241 466,-205 522,-205 522,-241"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="606,-241 496,-241 496,-205 606,-205 606,-241"/>
<text text-anchor="middle" x="494" y="-218.9" font-family="Sans" font-size="14.00">Script</text> <text text-anchor="middle" x="551" y="-218.9" font-family="Times Roman,serif" font-size="14.00">Pubkey Script</text>
</g> </g>
<!-- tx2t_script&#45;&gt;sig_tx2t_script --> <!-- tx2t_script&#45;&gt;sig_tx2t_script -->
<g id="edge14" class="edge"><title>tx2t_script&#45;&gt;sig_tx2t_script</title> <!-- tx2t_script&#45;&gt;tx2_script -->
<path fill="none" stroke="black" stroke-width="1.75" d="M494,-204.762C494,-186.762 494,-159.981 494,-146.092"/> <g id="edge34" class="edge"><title>tx2t_script&#45;&gt;tx2_script</title>
<ellipse fill="black" stroke="black" cx="494" cy="-141.75" rx="4" ry="4"/> <path fill="none" stroke="black" stroke-width="1.75" d="M547.897,-204.823C543.04,-176.377 533.605,-121.115 527.847,-87.3904"/>
<polygon fill="black" stroke="black" points="531.25,-86.5272 526.117,-77.2589 524.35,-87.7053 531.25,-86.5272"/>
</g> </g>
<!-- tx2t_amount --> <!-- tx2t_amount -->
<g id="node23" class="node"><title>tx2t_amount</title> <g id="node23" class="node"><title>tx2t_amount</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="599,-241 529,-241 529,-205 599,-205 599,-241"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="683,-241 613,-241 613,-205 683,-205 683,-241"/>
<text text-anchor="middle" x="564" y="-218.9" font-family="Sans" font-size="14.00">Amount</text> <text text-anchor="middle" x="648" y="-218.9" font-family="Times Roman,serif" font-size="14.00">Amount</text>
</g> </g>
<!-- tx2t_amount&#45;&gt;sig_tx2t_amount --> <!-- tx2t_amount&#45;&gt;sig_tx2t_amount -->
<g id="edge16" class="edge"><title>tx2t_amount&#45;&gt;sig_tx2t_amount</title> <!-- tx2t_amount&#45;&gt;tx2_amount -->
<path fill="none" stroke="black" stroke-width="1.75" d="M563.576,-204.762C563.157,-186.762 562.534,-159.981 562.211,-146.092"/> <g id="edge36" class="edge"><title>tx2t_amount&#45;&gt;tx2_amount</title>
<ellipse fill="black" stroke="black" cx="562.11" cy="-141.749" rx="4" ry="4"/> <path fill="none" stroke="black" stroke-width="1.75" d="M644.897,-204.823C640.04,-176.377 630.605,-121.115 624.847,-87.3904"/>
<polygon fill="black" stroke="black" points="628.25,-86.5272 623.117,-77.2589 621.35,-87.7053 628.25,-86.5272"/>
</g> </g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

Before After
Before After

View file

@ -15,10 +15,10 @@ graph [ fontname="Sans" ];
penwidth = 1.75; penwidth = 1.75;
subgraph cluster_tx2 { subgraph cluster_tx2 {
scriptSig [ label = "ScriptSig", shape = "none" ]; scriptSig [ label = "Signature Script", shape = "none" ];
tx2_signature [ label = "Signature" ]; tx2_signature [ label = "Signature" ];
tx2_full_public_key [ label = "Full Public Key" ]; tx2_full_public_key [ label = "Full Public Key" ];
script [ label = " \nScript", shape = "none" ]; script [ label = " \nPubkey Script", shape = "none" ];
tx2_pubkey_hash [ label = "Public Key Hash" ]; tx2_pubkey_hash [ label = "Public Key Hash" ];
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Before After
Before After

View file

@ -4,67 +4,67 @@
<!-- Generated by graphviz version 2.26.3 (20100126.1600) <!-- Generated by graphviz version 2.26.3 (20100126.1600)
--> -->
<!-- Title: blockchain Pages: 1 --> <!-- Title: blockchain Pages: 1 -->
<svg width="450pt" height="240pt" <svg width="450pt" height="239pt"
viewBox="0.00 0.00 450.00 239.57" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> viewBox="0.00 0.00 450.00 238.71" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph1" class="graph" transform="scale(0.809353 0.809353) rotate(0) translate(4 292)"> <g id="graph1" class="graph" transform="scale(0.806452 0.806452) rotate(0) translate(4 292)">
<title>blockchain</title> <title>blockchain</title>
<polygon fill="white" stroke="white" points="-4,5 -4,-292 553,-292 553,5 -4,5"/> <polygon fill="white" stroke="white" points="-4,5 -4,-292 555,-292 555,5 -4,5"/>
<text text-anchor="middle" x="274" y="-25.4" font-family="Sans" font-size="14.00"> </text> <text text-anchor="middle" x="275" y="-25.4" font-family="Sans" font-size="14.00"> </text>
<text text-anchor="middle" x="274" y="-8.4" font-family="Sans" font-size="14.00">Spending A P2PKH Output</text> <text text-anchor="middle" x="275" y="-8.4" font-family="Sans" font-size="14.00">Spending A P2PKH Output</text>
<g id="graph2" class="cluster"><title>cluster_tx2</title> <g id="graph2" class="cluster"><title>cluster_tx2</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="208,-50 208,-280 350,-280 350,-50 208,-50"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="208,-50 208,-280 352,-280 352,-50 208,-50"/>
</g> </g>
<g id="graph3" class="cluster"><title>cluster_tx1</title> <g id="graph3" class="cluster"><title>cluster_tx1</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="8,-50 8,-127 150,-127 150,-50 8,-50"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="8,-50 8,-127 150,-127 150,-50 8,-50"/>
<text text-anchor="middle" x="79" y="-110.4" font-family="Sans" font-size="14.00">TX 1 Output</text> <text text-anchor="middle" x="79" y="-110.4" font-family="Sans" font-size="14.00">TX 1 Output</text>
</g> </g>
<g id="graph4" class="cluster"><title>cluster_bob</title> <g id="graph4" class="cluster"><title>cluster_bob</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="408,-142 408,-262 540,-262 540,-142 408,-142"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="410,-142 410,-262 542,-262 542,-142 410,-142"/>
<text text-anchor="middle" x="474" y="-245.4" font-family="Sans" font-size="14.00">Bob&#39;s Computer</text> <text text-anchor="middle" x="476" y="-245.4" font-family="Sans" font-size="14.00">Bob&#39;s Computer</text>
</g> </g>
<!-- scriptSig --> <!-- scriptSig -->
<g id="node2" class="node"><title>scriptSig</title> <g id="node2" class="node"><title>scriptSig</title>
<text text-anchor="middle" x="279" y="-249.9" font-family="Sans" font-size="14.00">ScriptSig</text> <text text-anchor="middle" x="280" y="-249.9" font-family="Sans" font-size="14.00">Signature Script</text>
</g> </g>
<!-- tx2_signature --> <!-- tx2_signature -->
<g id="node3" class="node"><title>tx2_signature</title> <g id="node3" class="node"><title>tx2_signature</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="321,-229 237,-229 237,-193 321,-193 321,-229"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="322,-229 238,-229 238,-193 322,-193 322,-229"/>
<text text-anchor="middle" x="279" y="-206.9" font-family="Sans" font-size="14.00">Signature</text> <text text-anchor="middle" x="280" y="-206.9" font-family="Sans" font-size="14.00">Signature</text>
</g> </g>
<!-- private_key --> <!-- private_key -->
<g id="node10" class="node"><title>private_key</title> <g id="node10" class="node"><title>private_key</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="521,-229 427,-229 427,-193 521,-193 521,-229"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="523,-229 429,-229 429,-193 523,-193 523,-229"/>
<text text-anchor="middle" x="474" y="-206.9" font-family="Sans" font-size="14.00">Private Key</text> <text text-anchor="middle" x="476" y="-206.9" font-family="Sans" font-size="14.00">Private Key</text>
</g> </g>
<!-- tx2_signature&#45;&gt;private_key --> <!-- tx2_signature&#45;&gt;private_key -->
<g id="edge10" class="edge"><title>tx2_signature&#45;&gt;private_key</title> <g id="edge10" class="edge"><title>tx2_signature&#45;&gt;private_key</title>
<path fill="none" stroke="black" stroke-width="1.75" stroke-dasharray="5,2" d="M331.438,-211C360.968,-211 397.568,-211 426.29,-211"/> <path fill="none" stroke="black" stroke-width="1.75" stroke-dasharray="5,2" d="M332.259,-211C362.059,-211 399.134,-211 428.166,-211"/>
<polygon fill="black" stroke="black" points="331.312,-207.5 321.312,-211 331.312,-214.5 331.312,-207.5"/> <polygon fill="black" stroke="black" points="332.047,-207.5 322.047,-211 332.047,-214.5 332.047,-207.5"/>
</g> </g>
<!-- tx2_full_public_key --> <!-- tx2_full_public_key -->
<g id="node4" class="node"><title>tx2_full_public_key</title> <g id="node4" class="node"><title>tx2_full_public_key</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="336,-186 222,-186 222,-150 336,-150 336,-186"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="337,-186 223,-186 223,-150 337,-150 337,-186"/>
<text text-anchor="middle" x="279" y="-163.9" font-family="Sans" font-size="14.00">Full Public Key</text> <text text-anchor="middle" x="280" y="-163.9" font-family="Sans" font-size="14.00">Full Public Key</text>
</g> </g>
<!-- full_public_key --> <!-- full_public_key -->
<g id="node11" class="node"><title>full_public_key</title> <g id="node11" class="node"><title>full_public_key</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="531,-186 417,-186 417,-150 531,-150 531,-186"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="533,-186 419,-186 419,-150 533,-150 533,-186"/>
<text text-anchor="middle" x="474" y="-163.9" font-family="Sans" font-size="14.00">Full Public Key</text> <text text-anchor="middle" x="476" y="-163.9" font-family="Sans" font-size="14.00">Full Public Key</text>
</g> </g>
<!-- tx2_full_public_key&#45;&gt;full_public_key --> <!-- tx2_full_public_key&#45;&gt;full_public_key -->
<g id="edge8" class="edge"><title>tx2_full_public_key&#45;&gt;full_public_key</title> <g id="edge8" class="edge"><title>tx2_full_public_key&#45;&gt;full_public_key</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M346.944,-168C369.611,-168 394.632,-168 416.433,-168"/> <path fill="none" stroke="black" stroke-width="1.75" d="M347.771,-168C370.757,-168 396.203,-168 418.328,-168"/>
<polygon fill="black" stroke="black" points="346.715,-164.5 336.715,-168 346.715,-171.5 346.715,-164.5"/> <polygon fill="black" stroke="black" points="347.746,-164.5 337.746,-168 347.746,-171.5 347.746,-164.5"/>
</g> </g>
<!-- script --> <!-- script -->
<g id="node5" class="node"><title>script</title> <g id="node5" class="node"><title>script</title>
<text text-anchor="middle" x="279" y="-126.4" font-family="Sans" font-size="14.00"> </text> <text text-anchor="middle" x="280" y="-126.4" font-family="Sans" font-size="14.00"> </text>
<text text-anchor="middle" x="279" y="-109.4" font-family="Sans" font-size="14.00">Script</text> <text text-anchor="middle" x="280" y="-109.4" font-family="Sans" font-size="14.00">Pubkey Script</text>
</g> </g>
<!-- tx2_pubkey_hash --> <!-- tx2_pubkey_hash -->
<g id="node6" class="node"><title>tx2_pubkey_hash</title> <g id="node6" class="node"><title>tx2_pubkey_hash</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="341,-94 217,-94 217,-58 341,-58 341,-94"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="342,-94 218,-94 218,-58 342,-58 342,-94"/>
<text text-anchor="middle" x="279" y="-71.9" font-family="Sans" font-size="14.00">Public Key Hash</text> <text text-anchor="middle" x="280" y="-71.9" font-family="Sans" font-size="14.00">Public Key Hash</text>
</g> </g>
<!-- tx1_pubkey_hash --> <!-- tx1_pubkey_hash -->
<g id="node8" class="node"><title>tx1_pubkey_hash</title> <g id="node8" class="node"><title>tx1_pubkey_hash</title>
@ -73,8 +73,8 @@
</g> </g>
<!-- tx1_pubkey_hash&#45;&gt;tx2_pubkey_hash --> <!-- tx1_pubkey_hash&#45;&gt;tx2_pubkey_hash -->
<g id="edge5" class="edge"><title>tx1_pubkey_hash&#45;&gt;tx2_pubkey_hash</title> <g id="edge5" class="edge"><title>tx1_pubkey_hash&#45;&gt;tx2_pubkey_hash</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M141.733,-76C162.21,-76 185.12,-76 206.268,-76"/> <path fill="none" stroke="black" stroke-width="1.75" d="M141.771,-76C162.554,-76 185.854,-76 207.318,-76"/>
<polygon fill="black" stroke="black" points="206.49,-79.5001 216.49,-76 206.49,-72.5001 206.49,-79.5001"/> <polygon fill="black" stroke="black" points="207.36,-79.5001 217.36,-76 207.36,-72.5001 207.36,-79.5001"/>
</g> </g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Before After
Before After

View file

@ -14,10 +14,10 @@ edge [ penwidth = 1.75, minlen = 2 ];
penwidth = 1.75; penwidth = 1.75;
subgraph cluster_tx2 { subgraph cluster_tx2 {
scriptSig [ label = "ScriptSig", shape = "none" ]; scriptSig [ label = "Signature Script", shape = "none" ];
tx2_signature [ label = "Signature" ]; tx2_signature [ label = "Signature" ];
tx2_redeemScript [ label = "Full Redeem Script" ]; tx2_redeemScript [ label = "Full Redeem Script" ];
script [ label = " \nScript", shape = "none" ]; script [ label = " \nPubkey Script", shape = "none" ];
tx2_redeemScript_hash [ label = "Redeem Script Hash" ]; tx2_redeemScript_hash [ label = "Redeem Script Hash" ];
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Before After
Before After

View file

@ -4,77 +4,77 @@
<!-- Generated by graphviz version 2.26.3 (20100126.1600) <!-- Generated by graphviz version 2.26.3 (20100126.1600)
--> -->
<!-- Title: blockchain Pages: 1 --> <!-- Title: blockchain Pages: 1 -->
<svg width="450pt" height="212pt" <svg width="450pt" height="207pt"
viewBox="0.00 0.00 450.00 212.10" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> viewBox="0.00 0.00 450.00 206.83" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph1" class="graph" transform="scale(0.716561 0.716561) rotate(0) translate(4 292)"> <g id="graph1" class="graph" transform="scale(0.698758 0.698758) rotate(0) translate(4 292)">
<title>blockchain</title> <title>blockchain</title>
<polygon fill="white" stroke="white" points="-4,5 -4,-292 625,-292 625,5 -4,5"/> <polygon fill="white" stroke="white" points="-4,5 -4,-292 641,-292 641,5 -4,5"/>
<text text-anchor="middle" x="310" y="-25.4" font-family="Sans" font-size="14.00"> </text> <text text-anchor="middle" x="318" y="-25.4" font-family="Times Roman,serif" font-size="14.00"> </text>
<text text-anchor="middle" x="310" y="-8.4" font-family="Sans" font-size="14.00">Spending A P2SH Output</text> <text text-anchor="middle" x="318" y="-8.4" font-family="Times Roman,serif" font-size="14.00">Spending A P2SH Output</text>
<g id="graph2" class="cluster"><title>cluster_tx2</title> <g id="graph2" class="cluster"><title>cluster_tx2</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="232,-50 232,-280 398,-280 398,-50 232,-50"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="238,-50 238,-280 410,-280 410,-50 238,-50"/>
</g> </g>
<g id="graph3" class="cluster"><title>cluster_tx1</title> <g id="graph3" class="cluster"><title>cluster_tx1</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="8,-50 8,-127 174,-127 174,-50 8,-50"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="8,-50 8,-127 180,-127 180,-50 8,-50"/>
<text text-anchor="middle" x="91" y="-110.4" font-family="Sans" font-size="14.00">TX 1 Output</text> <text text-anchor="middle" x="94" y="-110.4" font-family="Times Roman,serif" font-size="14.00">TX 1 Output</text>
</g> </g>
<g id="graph4" class="cluster"><title>cluster_bob</title> <g id="graph4" class="cluster"><title>cluster_bob</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="456,-142 456,-262 612,-262 612,-142 456,-142"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="468,-142 468,-262 628,-262 628,-142 468,-142"/>
<text text-anchor="middle" x="534" y="-245.4" font-family="Sans" font-size="14.00">Bob&#39;s Computer</text> <text text-anchor="middle" x="548" y="-245.4" font-family="Times Roman,serif" font-size="14.00">Bob&#39;s Computer</text>
</g> </g>
<!-- scriptSig --> <!-- scriptSig -->
<g id="node2" class="node"><title>scriptSig</title> <g id="node2" class="node"><title>scriptSig</title>
<text text-anchor="middle" x="315" y="-249.9" font-family="Sans" font-size="14.00">ScriptSig</text> <text text-anchor="middle" x="324" y="-249.9" font-family="Times Roman,serif" font-size="14.00">Signature Script</text>
</g> </g>
<!-- tx2_signature --> <!-- tx2_signature -->
<g id="node3" class="node"><title>tx2_signature</title> <g id="node3" class="node"><title>tx2_signature</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="357,-229 273,-229 273,-193 357,-193 357,-229"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="366,-229 282,-229 282,-193 366,-193 366,-229"/>
<text text-anchor="middle" x="315" y="-206.9" font-family="Sans" font-size="14.00">Signature</text> <text text-anchor="middle" x="324" y="-206.9" font-family="Times Roman,serif" font-size="14.00">Signature</text>
</g> </g>
<!-- private_key --> <!-- private_key -->
<g id="node10" class="node"><title>private_key</title> <g id="node10" class="node"><title>private_key</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="581,-229 487,-229 487,-193 581,-193 581,-229"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="595,-229 501,-229 501,-193 595,-193 595,-229"/>
<text text-anchor="middle" x="534" y="-206.9" font-family="Sans" font-size="14.00">Private Key</text> <text text-anchor="middle" x="548" y="-206.9" font-family="Times Roman,serif" font-size="14.00">Private Key</text>
</g> </g>
<!-- tx2_signature&#45;&gt;private_key --> <!-- tx2_signature&#45;&gt;private_key -->
<g id="edge10" class="edge"><title>tx2_signature&#45;&gt;private_key</title> <g id="edge10" class="edge"><title>tx2_signature&#45;&gt;private_key</title>
<path fill="none" stroke="black" stroke-width="1.75" stroke-dasharray="5,2" d="M367.556,-211C403.645,-211 451.169,-211 486.193,-211"/> <path fill="none" stroke="black" stroke-width="1.75" stroke-dasharray="5,2" d="M376.344,-211C413.809,-211 463.85,-211 500.232,-211"/>
<polygon fill="black" stroke="black" points="367.225,-207.5 357.225,-211 367.225,-214.5 367.225,-207.5"/> <polygon fill="black" stroke="black" points="376.133,-207.5 366.133,-211 376.133,-214.5 376.133,-207.5"/>
</g> </g>
<!-- tx2_redeemScript --> <!-- tx2_redeemScript -->
<g id="node4" class="node"><title>tx2_redeemScript</title> <g id="node4" class="node"><title>tx2_redeemScript</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="385,-186 245,-186 245,-150 385,-150 385,-186"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="396,-186 252,-186 252,-150 396,-150 396,-186"/>
<text text-anchor="middle" x="315" y="-163.9" font-family="Sans" font-size="14.00">Full RedeemScript</text> <text text-anchor="middle" x="324" y="-163.9" font-family="Times Roman,serif" font-size="14.00">Full Redeem Script</text>
</g> </g>
<!-- redeemScript --> <!-- redeemScript -->
<g id="node11" class="node"><title>redeemScript</title> <g id="node11" class="node"><title>redeemScript</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="604,-186 464,-186 464,-150 604,-150 604,-186"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="620,-186 476,-186 476,-150 620,-150 620,-186"/>
<text text-anchor="middle" x="534" y="-163.9" font-family="Sans" font-size="14.00">Full RedeemScript</text> <text text-anchor="middle" x="548" y="-163.9" font-family="Times Roman,serif" font-size="14.00">Full Redeem Script</text>
</g> </g>
<!-- tx2_redeemScript&#45;&gt;redeemScript --> <!-- tx2_redeemScript&#45;&gt;redeemScript -->
<g id="edge8" class="edge"><title>tx2_redeemScript&#45;&gt;redeemScript</title> <g id="edge8" class="edge"><title>tx2_redeemScript&#45;&gt;redeemScript</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M395.37,-168C417.814,-168 442.019,-168 463.825,-168"/> <path fill="none" stroke="black" stroke-width="1.75" d="M406.401,-168C429.104,-168 453.555,-168 475.643,-168"/>
<polygon fill="black" stroke="black" points="395.197,-164.5 385.197,-168 395.197,-171.5 395.197,-164.5"/> <polygon fill="black" stroke="black" points="406.108,-164.5 396.108,-168 406.108,-171.5 406.108,-164.5"/>
</g> </g>
<!-- script --> <!-- script -->
<g id="node5" class="node"><title>script</title> <g id="node5" class="node"><title>script</title>
<text text-anchor="middle" x="315" y="-126.4" font-family="Sans" font-size="14.00"> </text> <text text-anchor="middle" x="324" y="-126.4" font-family="Times Roman,serif" font-size="14.00"> </text>
<text text-anchor="middle" x="315" y="-109.4" font-family="Sans" font-size="14.00">Script</text> <text text-anchor="middle" x="324" y="-109.4" font-family="Times Roman,serif" font-size="14.00">Pubkey Script</text>
</g> </g>
<!-- tx2_redeemScript_hash --> <!-- tx2_redeemScript_hash -->
<g id="node6" class="node"><title>tx2_redeemScript_hash</title> <g id="node6" class="node"><title>tx2_redeemScript_hash</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="390,-94 240,-94 240,-58 390,-58 390,-94"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="401,-94 247,-94 247,-58 401,-58 401,-94"/>
<text text-anchor="middle" x="315" y="-71.9" font-family="Sans" font-size="14.00">RedeemScript Hash</text> <text text-anchor="middle" x="324" y="-71.9" font-family="Times Roman,serif" font-size="14.00">Redeem Script Hash</text>
</g> </g>
<!-- tx1_redeemScript_hash --> <!-- tx1_redeemScript_hash -->
<g id="node8" class="node"><title>tx1_redeemScript_hash</title> <g id="node8" class="node"><title>tx1_redeemScript_hash</title>
<polygon fill="none" stroke="black" stroke-width="1.75" points="166,-94 16,-94 16,-58 166,-58 166,-94"/> <polygon fill="none" stroke="black" stroke-width="1.75" points="171,-94 17,-94 17,-58 171,-58 171,-94"/>
<text text-anchor="middle" x="91" y="-71.9" font-family="Sans" font-size="14.00">RedeemScript Hash</text> <text text-anchor="middle" x="94" y="-71.9" font-family="Times Roman,serif" font-size="14.00">Redeem Script Hash</text>
</g> </g>
<!-- tx1_redeemScript_hash&#45;&gt;tx2_redeemScript_hash --> <!-- tx1_redeemScript_hash&#45;&gt;tx2_redeemScript_hash -->
<g id="edge5" class="edge"><title>tx1_redeemScript_hash&#45;&gt;tx2_redeemScript_hash</title> <g id="edge5" class="edge"><title>tx1_redeemScript_hash&#45;&gt;tx2_redeemScript_hash</title>
<path fill="none" stroke="black" stroke-width="1.75" d="M166.212,-76C186.637,-76 208.898,-76 229.831,-76"/> <path fill="none" stroke="black" stroke-width="1.75" d="M171.547,-76C192.375,-76 215.043,-76 236.376,-76"/>
<polygon fill="black" stroke="black" points="229.987,-79.5001 239.987,-76 229.987,-72.5001 229.987,-79.5001"/> <polygon fill="black" stroke="black" points="236.399,-79.5001 246.399,-76 236.399,-72.5001 236.399,-79.5001"/>
</g> </g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 5 KiB

Before After
Before After