Can I figure out the size of a transaction before its sent?

2

I want to know the size (in bytes) of a transaction before it's sent.

Is it possible? Maybe with raw transactions? or..

EDIT:

Not a duplicate. The 'duplicate' doesn't address how to find out how big it is. Just addresses how to calculate the bytes (inputs and outputs). I even commented on that thread. How do you find how many inputs and outputs there are. I understand how to calculate it. But how do I figure out if there are 10 outputs or 5 outputs?

Marc Alexander

Posted 2017-07-06T22:31:17.893

Reputation: 531

Not a duplicate. The 'duplicate' doesn't address how to find out how big it is. Just addresses how to calculate the bytes (inputs and outputs). I even commented on that thread. How do you find how many inputs and outputs there are. I understand how to calculate it. But how do I figure out if there are 10 outputs or 5 outputs?Marc Alexander 2017-07-07T16:16:17.070

1I've voted to reopen.Pieter Wuille 2017-07-07T18:11:40.043

1@MarcAlexander: Thank you for clarifying. I've also voted to reopen.Murch 2017-07-07T21:05:24.597

Answers

3

Yes, this is actually what the raw transaction API is for.

The ordinary send RPCs (sendtoaddress and sendmany) do everything at once:

  • Construct outputs based on the addresses/amounts you want to send.
  • Do coin selection to find inputs to satisfy the amounts, determine the fee, and add change if necessary.
  • Sign the inputs with the keys in your wallet.
  • Broadcast the transaction to the network.

Since the fee depends on the size of the transaction, which depends on the coin selection, you cannot "intervene" in the middle of these RPCs.

The raw transaction API lets you do all these steps independently:

  • Constructing outputs based on addresses/amount using createrawtransaction.
  • Do coin selection to find inputs, determine the fee, and add change using fundrawtransaction.
  • Sign the inputs using signrawtransaction.
  • Broadcast the transaction using sendrawtransaction.

If you need to know the actual fee before broadcasting, you can use createrawtransaction + fundrawtransaction + signrawtransaction to construct a fully valid transaction without broadcasting. You can then inspect it, and decide to broadcast it using sendrawtransaction or not.

Pieter Wuille

Posted 2017-07-06T22:31:17.893

Reputation: 54 032