如何計算多重簽名交易的大小?
您能否幫助或建議計算簡單多重簽名交易的公式?
我有一個計算多簽名 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+34NOP_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 + 34Nnil_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