user88785: I want to calculate how many % of a block, and thus, transactions that are witness data. I need to calculate the size of the witness data in bytes in every transaction. And as I understand it, I cannot calculate this using existing size variables like vsize.
Will a loop through the "txinwitness" array of hex and do a byte length calculation on every one be enough? (Using NodeJS here)
Buffer.byteLength('03fbcc1c24903bc2fb1d73czef518b859232341c39e4515367653d80536d587b62d6', 'hex');


user60443: Elaborating on Andrew's answer:
You can calculate it from size and vsize.
Transaction size
See BIP141

Transaction weight is defined as Base transaction size * 3 + Total
  transaction size (ie. the same method as calculating Block weight from
  Base size and Total size).
Virtual transaction size is defined as Transaction weight / 4 (rounded
  up to the next integer).
Base transaction size is the size of the transaction serialised with
  the witness data stripped.
Total transaction size is the transaction size in bytes serialized as
  described in BIP144, including base data and witness data.

Witness size
So, for example if you have a transaction that has a total size of 1200 bytes (including witness data), and a base size of 1000 bytes, the weight and virtual size are:
weight = 1000 bytes * 3 + 1200 bytes = 4200
vsize = 4200 / 4 = 1050 bytes
So, given size and vsize, you can calculate the size of witness data:
witness size = (4/3) * (total - vsize)
witness size = 200

user48884: 
Will a loop through the "txinwitness" array of hex and do a byte length calculation on every one be enough?

That is not enough as there are extra data in witnesses that is not included in the txinwitness.
You can get the number of witness bytes and the number of non-witness bytes by solving a system of equations. The getrawtransaction RPC gives you two fields, size and weight. size is the total size in bytes as received over the wire. weight is the weight of the transaction as defined by BIP 141.
If you let x be the number of non-witness bytes, and y be the number of witness bytes, the definitions of size and weight gives you:
4x + 1y = weight
x + y = size

By plugging in the weight and size from the RPC, you can solve the system of equations for x and y to get the number of non-witness bytes and number of witness bytes respectively.

88785: <p>I want to calculate how many % of a block, and thus, transactions that are witness data. I need to calculate the size of the witness data in bytes in every transaction. And as I understand it, I cannot calculate this using existing size variables like vsize.</p>

<p>Will a loop through the "txinwitness" array of hex and do a byte length calculation on every one be enough? (Using NodeJS here)</p>

<pre><code>Buffer.byteLength('03fbcc1c24903bc2fb1d73czef518b859232341c39e4515367653d80536d587b62d6', 'hex');
</code></pre>
 60443: <p>Elaborating on Andrew's answer:</p>

<p>You can calculate it from <code>size</code> and <code>vsize</code>.</p>

<h2>Transaction size</h2>

<p><a href="https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki#transaction-size-calculations" rel="nofollow noreferrer">See BIP141</a></p>

<blockquote>
  <p>Transaction weight is defined as Base transaction size * 3 + Total
  transaction size (ie. the same method as calculating Block weight from
  Base size and Total size).</p>
  
  <p>Virtual transaction size is defined as Transaction weight / 4 (rounded
  up to the next integer).</p>
  
  <p>Base transaction size is the size of the transaction serialised with
  the witness data stripped.</p>
  
  <p>Total transaction size is the transaction size in bytes serialized as
  described in BIP144, including base data and witness data.</p>
</blockquote>

<h2>Witness size</h2>

<p>So, for example if you have a transaction that has a total size of 1200 bytes (including witness data), and a base size of 1000 bytes, the weight and virtual size are:</p>

<p><code>weight = 1000 bytes * 3 + 1200 bytes = 4200</code><br>
<code>vsize = 4200 / 4 = 1050 bytes</code></p>

<p>So, given <code>size</code> and <code>vsize</code>, you can calculate the size of witness data:</p>

<p><code>witness size = (4/3) * (total - vsize)</code><br>
<code>witness size = 200</code></p>
 48884: <blockquote>
  <p>Will a loop through the "txinwitness" array of hex and do a byte length calculation on every one be enough?</p>
</blockquote>

<p>That is not enough as there are extra data in witnesses that is not included in the <code>txinwitness</code>.</p>

<p>You can get the number of witness bytes and the number of non-witness bytes by solving a system of equations. The <code>getrawtransaction</code> RPC gives you two fields, <code>size</code> and <code>weight</code>. <code>size</code> is the total size in bytes as received over the wire. <code>weight</code> is the weight of the transaction as defined by BIP 141.</p>

<p>If you let <code>x</code> be the number of non-witness bytes, and <code>y</code> be the number of witness bytes, the definitions of <code>size</code> and <code>weight</code> gives you:</p>

<pre><code>4x + 1y = weight
x + y = size
</code></pre>

<p>By plugging in the <code>weight</code> and <code>size</code> from the RPC, you can solve the system of equations for <code>x</code> and <code>y</code> to get the number of non-witness bytes and number of witness bytes respectively.</p>
