Transaction-Fees

計算funddrawtransaction返回的tx的費率

  • April 4, 2020

我將一個沒有資金的提議的 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 會在交易簽署嘗試預測交易的規模。

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