mirror of
https://github.com/bitcoinbook/bitcoinbook
synced 2024-11-26 09:58:22 +00:00
CH07: Switch from M-of-N to K-of-N
Explanation for change is in changed text, but briefly: k-of-n is clearer when pronounced.
This commit is contained in:
parent
7417842837
commit
ec534165ba
@ -324,33 +324,40 @@ image::../images/mbc2_0606.png["Tx_Script_P2PubKeyHash_2"]
|
|||||||
scripts")))((("transactions", "advanced", id="Tadv07")))((("scripting",
|
scripts")))((("transactions", "advanced", id="Tadv07")))((("scripting",
|
||||||
"multisignature scripts", id="Smulti07")))((("multisignature
|
"multisignature scripts", id="Smulti07")))((("multisignature
|
||||||
scripts")))Multisignature scripts set a condition where N public keys
|
scripts")))Multisignature scripts set a condition where N public keys
|
||||||
are recorded in the script and at least M of those must provide
|
are recorded in the script and at least K of those must provide
|
||||||
signatures to spend the funds. This is also known as an M-of-N scheme,
|
signatures to spend the funds. This is also known as a K-of-N scheme,
|
||||||
where N is the total number of keys and M is the threshold of signatures
|
where N is the total number of keys and K is the threshold of signatures
|
||||||
required for validation. For example, a 2-of-3 multisignature is one
|
required for validation. For example, a 2-of-3 multisignature is one
|
||||||
where three public keys are listed as potential signers and at least two
|
where three public keys are listed as potential signers and at least two
|
||||||
of those must be used to create signatures for a valid transaction to
|
of those must be used to create signatures for a valid transaction to
|
||||||
spend the funds.
|
spend the funds.
|
||||||
|
|
||||||
At this time, _standard_ multisignature scripts are limited to at most 3
|
[TIP]
|
||||||
|
====
|
||||||
|
Some Bitcoin documentation, including earlier editions of this book,
|
||||||
|
uses the term M-of-N for traditional multisignature. However, it's hard
|
||||||
|
to tell "M" and "N" apart when they're spoken, so we use the alternative
|
||||||
|
K-of-N. Both phrases refer to the same type of signature scheme.
|
||||||
|
====
|
||||||
|
|
||||||
|
At this time, _standard_ multisignature scriptPubKeys are limited to at most 3
|
||||||
listed public keys, meaning you can do anything from a 1-of-1 to a
|
listed public keys, meaning you can do anything from a 1-of-1 to a
|
||||||
3-of-3 multisignature or any combination within that range. The
|
3-of-3 multisignature or any combination within that range.
|
||||||
limitation to 3 listed keys might be lifted by the time this book is
|
You may want to check the +IsStandard()+ function to see what is currently
|
||||||
published, so check the +IsStandard()+ function to see what is currently
|
|
||||||
accepted by the network. Note that the limit of 3 keys applies only to
|
accepted by the network. Note that the limit of 3 keys applies only to
|
||||||
standard (also known as "bare") multisignature scripts, not to
|
standard (also known as "bare") multisignature scripts, not to
|
||||||
multisignature scripts wrapped in a Pay-to-Script-Hash (P2SH) script.
|
multisignature scripts wrapped in a Pay-to-Script-Hash (P2SH) script.
|
||||||
P2SH multisignature scripts are limited to 15 keys, allowing for up to
|
P2SH multisignature scripts are limited to 15 keys, allowing for up to
|
||||||
15-of-15 multisignature. We will learn about P2SH in <<p2sh>>.
|
15-of-15 multisignature. We will learn about P2SH in <<p2sh>>.
|
||||||
|
|
||||||
The general form of a scriptPubKey setting an M-of-N multisignature
|
The general form of a scriptPubKey setting an K-of-N multisignature
|
||||||
condition is:
|
condition is:
|
||||||
|
|
||||||
----
|
----
|
||||||
M <Public Key 1> <Public Key 2> ... <Public Key N> N OP_CHECKMULTISIG
|
K <Public Key 1> <Public Key 2> ... <Public Key N> N OP_CHECKMULTISIG
|
||||||
----
|
----
|
||||||
|
|
||||||
where N is the total number of listed public keys and M is the threshold
|
where N is the total number of listed public keys and K is the threshold
|
||||||
of required signatures to spend the output.
|
of required signatures to spend the output.
|
||||||
|
|
||||||
A scriptPubKey setting a 2-of-3 multisignature condition looks like
|
A scriptPubKey setting a 2-of-3 multisignature condition looks like
|
||||||
@ -388,7 +395,7 @@ the three public keys set as an encumbrance.
|
|||||||
((("scripting", "multisignature scripts", "OP_CHECKMULTISIG
|
((("scripting", "multisignature scripts", "OP_CHECKMULTISIG
|
||||||
bug")))((("OP_CHECKMULTISIG bug workaround")))There is a bug in
|
bug")))((("OP_CHECKMULTISIG bug workaround")))There is a bug in
|
||||||
++OP_CHECKMULTISIG++'s execution that requires a slight workaround. When
|
++OP_CHECKMULTISIG++'s execution that requires a slight workaround. When
|
||||||
+OP_CHECKMULTISIG+ executes, it should consume M+N+2 items on the stack as
|
+OP_CHECKMULTISIG+ executes, it should consume K+N+2 items on the stack as
|
||||||
parameters. However, due to the bug, +OP_CHECKMULTISIG+ will pop an extra
|
parameters. However, due to the bug, +OP_CHECKMULTISIG+ will pop an extra
|
||||||
value or one value more than expected.
|
value or one value more than expected.
|
||||||
|
|
||||||
@ -402,10 +409,10 @@ example:
|
|||||||
First, +OP_CHECKMULTISIG+ pops the top item, which is +N+ (in this example
|
First, +OP_CHECKMULTISIG+ pops the top item, which is +N+ (in this example
|
||||||
"3"). Then it pops +N+ items, which are the public keys that can sign.
|
"3"). Then it pops +N+ items, which are the public keys that can sign.
|
||||||
In this example, public keys A, B, and C. Then, it pops one item, which
|
In this example, public keys A, B, and C. Then, it pops one item, which
|
||||||
is +M+, the quorum (how many signatures are needed). Here M = 2. At this
|
is +K+, the quorum (how many signatures are needed). Here M = 2. At this
|
||||||
point, +OP_CHECKMULTISIG+ should pop the final +M+ items, which are the
|
point, +OP_CHECKMULTISIG+ should pop the final +K+ items, which are the
|
||||||
signatures, and see if they are valid. However, unfortunately, a bug in
|
signatures, and see if they are valid. However, unfortunately, a bug in
|
||||||
the implementation causes +OP_CHECKMULTISIG+ to pop one more item (M+1
|
the implementation causes +OP_CHECKMULTISIG+ to pop one more item (K+1
|
||||||
total) than it should. The extra item is disregarded when checking the
|
total) than it should. The extra item is disregarded when checking the
|
||||||
signatures so it has no direct effect on +OP_CHECKMULTISIG+ itself.
|
signatures so it has no direct effect on +OP_CHECKMULTISIG+ itself.
|
||||||
However, an extra value must be present because if it is not present,
|
However, an extra value must be present because if it is not present,
|
||||||
|
Loading…
Reference in New Issue
Block a user