Transactions

創建具有特定費率的原始交易的最有效方法是什麼?

  • August 26, 2020

在創建具有特定費率 (sat/kW) 的交易時,似乎存在先有雞還是先有蛋的問題。

為了設置特定的費率,您需要知道交易的總重量是多少。但為了計算總重量,您可能需要完成交易,包括某種臨時費用價值。

我可以想像在某些極端情況下,輸入僅足以支付少量費用,這意味著設置高費用將需要向 tx 添加另一個輸入,從而使 tx 大小估計變得複雜。

有沒有針對這種情況的有效解決方案?

是的!訣竅是用有效值而不是名義值來計算每個輸入。

事務由三部分組成:成本、輸入和輸出。

  • 輸出:

輸出腳本的大小由接收地址決定,因此它們的大小由交易指令給出。我們還不知道是否需要更改輸出,但我們知道如果我們創建一個更改輸出會是什麼大小。

  • 成本:

非隔離見證事務的事務成本為 10 字節,隔離見證事務的事務成本為 42 WU。您可能會猜到您需要哪一個,但在最壞的情況下,您會高估 0.5 vB。因此,我們可以認為成本大小也是固定的。

  • 輸入:

棘手的部分是交易輸入。您不知道需要多少,並且如果您有各種地址格式的輸入,您可能不知道它們將具有什麼輸入腳本大小。此外,簽名並不總是相同的大小。但是,我們確實知道簽名的最大大小,以及每個 UTXO 的輸入腳本的大小。連同目標費率,我們可以計算出有效值

effectiveValue = utxo.value − feePerByte × bytesPerInput¹

選擇目標以收件人金額的總和開始。我們通過將固定成本添加到選擇目標來簡化硬幣選擇問題。然後我們通過計算有效值而不是標稱值來執行選擇。由於每個輸入在被選中時已經為自己付出了代價,我們不再需要擔心選擇後輸入的費用影響;相反,每個有效值都完全朝向選擇目標。

關於變化輸出,有兩種策略。一,如果您的目標是建構一個避免創建更改的事務,例如通過使用分支和綁定選擇,您保持目標不變:target = recipient amounts + fees for fixed transaction parts. 第二,如果您使用的策略會產生變化,您可以在選擇目標中添加一個足夠大的緩衝區來支付變化輸出的費用,並留出足夠大的變化輸出:target = recipient amounts + fees for fixed tx parts + change output cost + minChange.

對於簽名,您使用最大簽名長度進行估計。由於簽名是 segwit 輸入見證的一部分,這只會導緻小幅度的高估,這將導致略微超出目標費率。² 或者,您可以使用簽名研磨來節省每個簽名的預期 0.5 字節並估計費率更準確。

¹ 有效值在An Evaluation of Coin Selection Strategies, Erhardt 2016 的第 5.3 節中提出,披露:由您真實撰寫。

² 超過目標費率優先;它只花費幾個 satoshis,並略微提高了交易的優先級。低於目標費率是有問題的,因為一些支付處理器需要最低費率來接受付款,低於預設值minRelayTxFeeRate可能會阻止交易完全轉發。

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