計算funddrawtransaction返回的tx的費率
我將一個沒有資金的提議的 tx 和 feeRate 參數傳遞給 fundrawtransaction,這讓我返回了 tx 的十六進制,並選擇了輸入及其費用。我沒有通過conf_target 或estimate_mode。我將生成的十六進制傳遞給 decoderawtransaction 以獲取 tx 的大小/vsize。
我試圖通過計算來檢查 tx 的實際費率,
fee * 1000 / vsize
但它似乎與我作為參數傳入的費率不匹配。我嘗試了幾個不同的值,但實際費率似乎總是比要求的費率高出大約 1.59 倍,給予或接受一點點。
那麼我是否不正確地計算觀察到的速率?是否有可能得到的費率與 feeRate 參數提供的完全匹配?
這是一個建構金額為 0.00073749 且費用為 0.00001000 的 tx 的範例。來自 createrawtransaction 的提議 tx:
{ "txid": "de380dec00d86611bab1cfa825a7069ffde31d7fb0c5b91e381ef79b94d927e0", "hash": "de380dec00d86611bab1cfa825a7069ffde31d7fb0c5b91e381ef79b94d927e0", "version": 2, "size": 41, "vsize": 41, "weight": 164, "locktime": 0, "vin": [ ], "vout": [ { "value": 0.00073749, "n": 0, "scriptPubKey": { "asm": "0 de525f12f17a495b7903c2c5b306ee07ccad309f", "hex": "0014de525f12f17a495b7903c2c5b306ee07ccad309f", "reqSigs": 1, "type": "witness_v0_keyhash", "addresses": [ "bc1qmef97yh30fy4k7grctzmxphwqlx26vyl5lve86" ] } } ] }
以及由 fundrawtransaction 返回的帶有輸入的完整 tx:
{ "txid": "f78b268f9386ab47dd5c0d36caf3aaff5fa719c7a2b5658ff08132159cb6b8cd", "hash": "f78b268f9386ab47dd5c0d36caf3aaff5fa719c7a2b5658ff08132159cb6b8cd", "version": 2, "size": 369, "vsize": 369, "weight": 1476, "locktime": 0, "vin": [ { "txid": "ca6f25d4484ab525fdb907cbce81d3dc9d1974695fcc80639fddfff4b6bca268", "vout": 1, "scriptSig": { "asm": "", "hex": "" }, "sequence": 4294967294 }, { "txid": "9b39ee5637d7b0783715be6ce566283024ee2bea33a9d3bd6f415ae5d8f24e5f", "vout": 0, "scriptSig": { "asm": "", "hex": "" }, "sequence": 4294967294 }, { "txid": "2f2b7eaccc06ea3856cd5b4666a15161d0fac9053ab2bcbb94a490593c969246", "vout": 0, "scriptSig": { "asm": "", "hex": "" }, "sequence": 4294967294 }, { "txid": "b5b2e4e1287438fd8193e1409cdf87181061ab4a3d95f50d2bf1bc2534b2d49c", "vout": 0, "scriptSig": { "asm": "", "hex": "" }, "sequence": 4294967294 }, { "txid": "3de9c3690c77f544b0d953c70d97f50bb9790a847bed9972caca960218c6c8f6", "vout": 0, "scriptSig": { "asm": "", "hex": "" }, "sequence": 4294967294 }, { "txid": "5e0021645a37473afdff1720da902f0abe183fb48719169e96b5235bb6b09e25", "vout": 0, "scriptSig": { "asm": "", "hex": "" }, "sequence": 4294967294 }, { "txid": "f92dbcf77c13d887d8aa77404dc78120c90d055a32b4d51196849affc3866ade", "vout": 0, "scriptSig": { "asm": "", "hex": "" }, "sequence": 4294967294 }, { "txid": "e425c6e84bc671bfb3a80bd95d1925007e12483fdcf3a19094bde8a36ae0d9fd", "vout": 0, "scriptSig": { "asm": "", "hex": "" }, "sequence": 4294967294 } ], "vout": [ { "value": 0.00073749, "n": 0, "scriptPubKey": { "asm": "0 de525f12f17a495b7903c2c5b306ee07ccad309f", "hex": "0014de525f12f17a495b7903c2c5b306ee07ccad309f", "reqSigs": 1, "type": "witness_v0_keyhash", "addresses": [ "bc1qmef97yh30fy4k7grctzmxphwqlx26vyl5lve86" ] } } ] }
在這種情況下,費用為 0.00000668,因此我計算的費率
0.0000668 * 1000 / 369 = 0.00001810
與請求的 0.00001000 相反
您在這裡看到兩件事:精確匹配硬幣選擇算法,以及在添加簽名之前計算您的 vsize 的事實。
完全符合
比特幣核心中的硬幣選擇算法試圖找到一個“精確匹配”的 UTXO 以進行支付,而不會向您添加找零輸出。如果輸入的金額有點大,就會變成手續費。令人驚訝的是,在某些情況下,這種行為實際上比將過度轉化為變化更可取。
觀察結果是,現在僅僅創建一個變更輸出就需要花錢(就支付它所需的費用而言),以後會花費更多的錢(就為交易輸入所使用的額外空間支付的邊際費用而言,這將花錢)。這筆費用是浪費的:如果有可能根本不進行更改,這將成為您永遠不必支付的費用。
所以結論是:如果有可能建構一個沒有變化的交易,並且多付的費用低於創建和花費變化的成本,那麼它是可取的。這正是比特幣核心所做的,使用短期費用估算來創建變化,並使用長期費用估算來花費它。
Mark Erhard在他的碩士論文中首先描述了高效執行此操作的概念和算法。
簽名前的vsize
您正在查看來自 fundrawtransaction 的未簽名原始交易的大小。出於費用決策的目的,funddrawtransaction 會在交易簽署後嘗試預測交易的規模。