Multi-Signature

如何計算多重簽名交易的大小?

  • June 8, 2019

您能否幫助或建議計算簡單多重簽名交易的公式?

我有一個計算多簽名 2-2 交易大小的問題。

我試圖遵循這個: 預測多簽名交易大小的答案,但是它含糊不清。這是我的計算:

pubKeySize = 33;
sigSize = 72;
n = (m = 2);
sizeOfRedeemScript = 1 + n * pubKeySize + 2;
sizeOfScriptSig = 1 + m * (1 + sigSize) + 2 + sizeOfRedeemScript;
sizeOfInput = 32 + 4 + 2 + sizeOfScriptSig + 4;
sizeOfScriptPubKey = 2 + /** what is the length of script??  */ len(script);
sizeOfOutput = 8 + sizeOfScriptPubKey;
sizeOfTx = 4 + 2 + sizeOfInput + sizeOfOutput + 4;

如果更準確地說我沒有得到什麼是SizeOfVarIntFor(lengthOfScript)什麼是什麼 len(script)(如何計算?)

讓我們重新編寫並從頭開始計算,因為您發布的計算本身可能不是不言自明的,其中一些並不完全準確。從這個問題來看,我假設您正在嘗試從多重簽名地址中找出花費比特幣的交易規模。

兌換腳本大小

我認為您發布的兌換腳本的大小有誤。您還需要包括在OP_DATA每個公鑰之前的大小。它告訴程序需要將多少字節壓入堆棧。假設我們使用大小為 33 字節的壓縮公鑰。所以redeem_script的總大小是1 + N + 33N + 1 + 1 = 3+34N

OP_M: 1 byte
OP_DATA: 1 byte (pub_key length) * N
pub_key: 33 bytes * N
OP_N: 1 byte
OP_CHECKMULTISIG: 1 byte

腳本簽名大小

我認為您為本節發布的數據也存在不准確之處。ECDSA 簽名(包括SIGHASH標誌)可以是 71、72 或 73 字節(73 字節是非標準的,因為標準性需要低 S 值,但仍需達成共識)。因此,從保守的角度來看,您需要為每個所需的簽名假設 73 個字節。下面是計算。所以你需要 1+M+73M+1+3+34N = 5 + 74M + 34N

nil_length: 1 byte
OP_DATA: 1 byte (len of signature to follow) * M
signature: 73*M
redeem_script_length: 1 byte
redeem_script_size: 3 + 34*N

輸入大小計算

本節假設只有一個輸入消耗來自多重簽名地址的比特幣。總輸入大小為 46 + 74M + 34N

previous_out_point: 36 bytes
   txid: 32 bytes
   vout_index: 4 bytes
var_int: 1 byte (script_sig length)
script_sig: 5+74*M+34*N bytes
sequence: 4 bytes

鎖定腳本大小計算

P2PKH: 25 bytes
   OP_DUP: 1byte
   OP_HASH160: 1 byte
   OP_DATA (size of scriptPubKey to push): 1 byte
   scriptPubKey: 20 bytes
   OP_EQUALVERIFY: 1 byte
   OP_CHECKSIG: 1 byte

P2SH: 23 bytes
   OP_HASH160: 1 byte
   OP_DATA: 1 byte
   scriptPubKey: 20 byte
   OP_EQUAL: 1 byte

P2WSH: 34 bytes
   - OP_0: 1 byte
   - OP_DATA: 1 byte (witness_script_SHA256 length)
   - witness_script_SHA256: 32 bytes

P2WPKH: 22 bytes
   - OP_0: 1 byte
   - OP_DATA: 1 byte (public_key_HASH160 length)
   - public_key_HASH160: 20 bytes

TX_out_size

value: 8 bytes
len of script: 1 byte
script length: variable as defined in previous section

總交易規模

讓我們首先假設沒有 SegWit 的情況下計算大小。然後我們將看看 SegWit 如何幫助減少交易規模。

version: 4 bytes
count_tx_in: 1 byte (variable but since we have one input can be represented in 1 byte)
inputsize: 46 +74*M + 34*N
count_tx_out: 1 byte (variable again)
tx_out (assuming one input to P2PKH): 34 bytes
locktime: 4 bytes

所以你的總尺寸是 90 + 74M + 34N。假設 M=N(如您的問題所示)大小為 90+108*N。

使用 SegWit 的大小

隨著隔離見證的實施,我們現在以權重單位而不是字節來計算交易大小。正常交易大小乘以 4,見證數據乘以 1。在前面的範例中,我們的 WU 將是 360+432*N。

在 segwit 中,我們將 scriptSig 減 4 並添加一個權重單位來表示見證元素的數量。所以我們的交易規模是

traditonal tx: 360 + 432*N WU
- scriptSig: (5 + 108*N)*4 = 20 + 432*N WU
= witness_stripped: = 340 WU
+ number of witness elements: 1WU
+ scriptSig: 5 + 108*N WU
= total: 346 + 108*N WU

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