Sure! The trick is to depend every enter with its efficient worth moderately than its nominal worth.
Transactions are composed of three elements: the overhead, the inputs and the outputs.
-
Outputs:
The dimensions of the output scripts is set by the recipient addresses, so their measurement is given by the transaction directions. We have no idea whether or not we’ll want a change output but, however we all know what measurement it could be if we created one. -
Overhead:
The transaction overhead is 10 bytes for non-segwit transactions, or 42 WU for segwit transactions¹. You’ll be able to most likely guess which one you may want, however within the worst case you overestimate by 0.5 vB. We are able to subsequently take into account the overhead measurement additionally to be fastened. -
Inputs:
The tough half is the transaction inputs. You have no idea what number of you have to, and won’t know what enter script sizes they will have when you’ve got inputs of assorted handle codecs. Moreover, signatures will not be all the time the identical measurement. Nonetheless, we do know the utmost measurement of the signature, and the scale of the enter script for every UTXO. Along with the goal price price, we are able to calculate the efficient worth:effectiveValue = utxo.worth − feePerByte × bytesPerInput
²
The choice goal begins out because the sum of the recipient quantities. We simplify the coin choice downside by including the fastened prices to the choice goal. We then carry out the choice by way of counting efficient values moderately than nominal values. Since every enter has paid for itself already when it’s chosen, we now not want to fret about an enter’s price influence after choice; as an alternative every efficient worth goes absolutely in direction of the choice goal.
In regard to the change output, there are two methods. One, if you’re aiming to construct a transaction that avoids creating change, e.g. by utilizing Department and Sure choice, you retain the goal as is: goal = recipient quantities + charges for fastened transaction elements
. Two, if you’re utilizing a method that can create change, you add a buffer to the choice goal that’s massive sufficient to cowl the price of the change output and depart sufficient for a good-sized change output: goal = recipient quantities + charges for fastened tx elements + change output price + minChange
.
For the signatures, you estimate utilizing the utmost signature size. For the reason that signatures are a part of the witness for segwit inputs, this outcomes solely in a small measurement overestimation which can result in minutely overshooting the goal price price.³ Alternatively, you should utilize signature grinding to avoid wasting an anticipated 0.5 bytes per signature and estimate the price price extra exactly.
¹ Assuming that the transaction has not more than 253 inputs and not more than 253 outputs. The enter/output counter will take 3 bytes as an alternative of 1 byte for larger enter/output counts.
² Efficient worth was proposed in part 5.3 of An Analysis of Coin Choice Methods, Erhardt 2016, disclosure: authored by yours really.
³ Overshooting the goal price price is preferable; it prices only some satoshis and barely will increase the precedence of the transaction. Undershooting the goal price price is problematic, since some cost processors require a minimal price price to just accept a cost and falling under the default minRelayTxFeeRate
can forestall a transaction from relaying altogether.