user62: I realize that the CLI has commands for calculating a minimum fee based on a transaction size, but I'm wanting to do a calculation manually. The documentation states that the formula for calculating the transaction minimum fee is a * size(tx) + b where a & b are protocol parameters, and size(tx) is the transaction size in bytes.
Is there a way to calculate the transaction size if I know the number of consumed and output UTxOs? Also, are a and b in the genesis file?

user28: The a and b fees parameters are protocol parameters, so you should probably check the current epoch, even they are unlikely to change suddenly.
$ curl -s  -H "project_id: $BLOCKFROST_PROJECT_ID" https://cardano-mainnet.blockfrost.io/api/v0/epochs/latest/parameters | jq '. | .min_fee_a, .min_fee_b'
44
155381

Then, all your need to do to calculate your fees is:
a × size (in bytes) + b

Read more on docs.cardano.org.

user4427: Here is my bash script
fee=$(cardano-cli transaction calculate-min-fee \
                    --tx-body-file tx.tmp \
                    --tx-in-count 1 \
                    --tx-out-count 1 \
                    --mainnet \
                    --witness-count 1 \
                    --byron-witness-count 0 \
                    --protocol-params-file protocol.json | awk '{ print $1 }') >> $log

In your case, it depends how many TX_in and TX_outs you will have.

user6763: there are two options that do come to my mind to calculate a transaction size:
starting from the fees
since we know that the fees are calulated as a * size(tx) + b == fees
using some simple algebra we can see that size(tx) == (fees - b) / a
this should be the most reliable way, but you need the fees in order to calculate the size, so it shouldn't fit you request
use the CBOR size
when builing a transaction using either cardano-cli transaction build or cardano-cli transaction build-raw you need to specify an --out-file which turns out to be a .json file with the following chema:
{
    "type": "Tx AlonzoEra",
    "description": "",
    "cborHex": "<some hex value>"
}

ultimately the cborHex value is what goes on-chain
that value is an hexadecimal string and represents the bytes of the CBOR message
since we know that each byte can have a value from 0 to 255 the hex representation must take 2 hexadecimal digits per byte
this way you could calculate the tx size in bytes as half the length of the cborHex string
in nodejs
"<some hex value>".length / 2

however, this approach returns usually a value smaller by ~400/~500 bytes in contrast to the first approach, so I might be missing some data
P.S. cardano-serialization-library
using the cardano-serialization-library it should be enough to use the Transaction.to_bytes() method and get the length
e.g.
myTx.to_bytes().length


62: <p>I realize that the CLI has commands for calculating a minimum fee based on a transaction size, but I'm wanting to do a calculation manually. The documentation states that the formula for calculating the transaction minimum fee is <code>a * size(tx) + b</code> where <code>a</code> &amp; <code>b</code> are protocol parameters, and <code>size(tx)</code> is the transaction size in bytes.</p>
<p>Is there a way to calculate the transaction size if I know the number of consumed and output UTxOs? Also, are <code>a</code> and <code>b</code> in the genesis file?</p>
 28: <p>The <code>a</code> and <code>b</code> fees parameters are protocol parameters, so you should probably check the current epoch, even they are unlikely to change suddenly.</p>
<pre><code>$ curl -s  -H &quot;project_id: $BLOCKFROST_PROJECT_ID&quot; https://cardano-mainnet.blockfrost.io/api/v0/epochs/latest/parameters | jq '. | .min_fee_a, .min_fee_b'
44
155381
</code></pre>
<p>Then, all your need to do to calculate your fees is:</p>
<pre><code>a × size (in bytes) + b
</code></pre>
<p>Read more on <a href="https://docs.cardano.org/explore-cardano/fee-structure" rel="nofollow noreferrer">docs.cardano.org</a>.</p>
 4427: <p>Here is my bash script</p>
<pre><code>fee=$(cardano-cli transaction calculate-min-fee \
                    --tx-body-file tx.tmp \
                    --tx-in-count 1 \
                    --tx-out-count 1 \
                    --mainnet \
                    --witness-count 1 \
                    --byron-witness-count 0 \
                    --protocol-params-file protocol.json | awk '{ print $1 }') &gt;&gt; $log
</code></pre>
<p>In your case, it depends how many TX_in and TX_outs you will have.</p>
 6763: <p>there are two options that do come to my mind to calculate a transaction size:</p>
<h2>starting from the fees</h2>
<p>since we know that the fees are calulated as <code>a * size(tx) + b == fees</code>
using some simple algebra we can see that <code>size(tx) == (fees - b) / a</code></p>
<p>this should be the most reliable way, but you need the fees in order to calculate the size, so it shouldn't fit you request</p>
<h2>use the CBOR size</h2>
<p>when builing a transaction using either <code>cardano-cli transaction build</code> or <code>cardano-cli transaction build-raw</code> you need to specify an <code>--out-file</code> which turns out to be a <code>.json</code> file with the following chema:</p>
<pre><code>{
    &quot;type&quot;: &quot;Tx AlonzoEra&quot;,
    &quot;description&quot;: &quot;&quot;,
    &quot;cborHex&quot;: &quot;&lt;some hex value&gt;&quot;
}
</code></pre>
<p>ultimately the <code>cborHex</code> value is what goes on-chain
that value is an hexadecimal string and represents the bytes of the CBOR message</p>
<p>since we know that each byte can have a value from <code>0</code> to <code>255</code> the hex representation must take 2 hexadecimal digits per byte</p>
<p>this way you could calculate the tx size in bytes as half the length of the cborHex string</p>
<p>in nodejs</p>
<pre><code>&quot;&lt;some hex value&gt;&quot;.length / 2
</code></pre>
<p>however, this approach returns usually a value smaller by ~400/~500 bytes in contrast to the first approach, so I might be missing some data</p>
<h4>P.S. <code>cardano-serialization-library</code></h4>
<p>using the <code>cardano-serialization-library</code> it should be enough to use the <code>Transaction.to_bytes()</code> method and get the length</p>
<p>e.g.</p>
<pre><code>myTx.to_bytes().length
</code></pre>
