Bitcoin-Core

為什麼多重簽名交易中的最大公鑰是 20 個?

  • November 25, 2018

script.h以下限制中設置:

MAX_PUBKEYS_PER_MULTISIG = 20

我很好奇:

  • 為什麼限制設置為20?
  • 一個人將如何建構一個允許n比目前更多的腳本OP_16

例如,這行得通嗎?

OP_m <pubKey1> ... 1 20 OP_CHECKMULTISIG

數字 20 似乎來自此送出 : 8c9479c6bbbc38b897dc97de9d04e4d5a5a36730,也標記為v0.3.12,它引入了術語“SigOps”。遺憾的是,我在送出消息本身或此版本的發行說明中沒有看到任何提及此更改的內容,並且有不是任何文件。

我們看到,一個塊中的最大 sigop 數量的限制都被設置了:

static const int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50;

以及一種計算方式:

int GetSigOpCount() const
{
   int n = 0;
   const_iterator pc = begin();
   while (pc < end())
   {
       opcodetype opcode;
       if (!GetOp(pc, opcode))
           break;
       if (opcode == OP_CHECKSIG || opcode == OP_CHECKSIGVERIFY)
           n++;
       else if (opcode == OP_CHECKMULTISIG || opcode == OP_CHECKMULTISIGVERIFY)
           n += 20;
   }
   return n;
}

並且規則仍然是相同的,特別是對於裸多重簽名腳本(那些沒有嵌套在p2shor中的p2wsh)。一個裸CHECKMULTISIG操作總是被計為 20 個 sigops(現在是 80 個,帶有見證比例因子),因此允許超過 20 個 checkigsCHECKMULTISIG將使這個假設無效,並使其創建具有超過最大允許 sigops 可能的塊。

對於 p2sh\p2wsh 腳本,規則不那麼嚴格。如果之前的操作碼CHECKMULTISIG在 range[OP_1, OP_16]中,則該數字被計為多重簽名驗證的 sigops,其他任何都計為 20。實際上,由於 520,15 是您可以作為 p2sh 腳本推送的最大 pubkey字節推送限制,但對於 p2wsh,17-of-20 的範例如下所示:

0x01 0x11 <pubkey1> <pubkey2> ... <pubkey 20> 0x01 0x14 CHECKMULTISIG

引用自:https://bitcoin.stackexchange.com/questions/81223