-
Notifications
You must be signed in to change notification settings - Fork 2
/
tx-chains.py
62 lines (51 loc) · 1.91 KB
/
tx-chains.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/env python3
from bitcoin import rpc
from bitcoin.core import x, lx, b2x, b2lx
from bitcoin.core import CScript
## Arbitrary block height; might differ from average block.
## Note: python-bitcoin 0.8 doesn't work for me on segwit blocks, so I
## chose a block from a few weeks ago.
height = 480000
## Setup
proxy = rpc.Proxy()
seen_txids = {}
unbatched_block_total = 0
batched_block_total = 0
## Get the block
block = proxy.getblock(proxy.getblockhash(height))
## For each transaction in the block
for tx in block.vtx:
## Skip coinbase transactions sice they can't be spent in the same
## block (100 block maturation rule)
if tx.is_coinbase():
continue
## Add the transaction's txid to a dict
seen_txids[b2lx(tx.GetTxid())] = True
## Calculate the transaction's byte size.
transaction_size = len(tx.serialize())
## Add the transaction size to our base total
unbatched_block_total += transaction_size
## For each input in the transaction, see if its prevout (previous
## output) matches the txid of any other earlier transaction in this
## block.
match = False
for tx_input in tx.vin:
prevout = b2lx(tx_input.prevout.hash)
## If it does match, we add only the total size of the outputs to
## our hypothetical fully-batched block
if prevout in seen_txids:
output_size = 0
for tx_output in tx.vout:
output_size += len(tx_output.serialize())
batched_block_total += output_size
match = True
break
## If it doesn't match, we add the full transaction size to our
## hypothetical fully-batched block
if match == False:
batched_block_total += transaction_size
## Print some statistics
print("Unbatched total:", unbatched_block_total)
print("Batched total:", batched_block_total)
print("Saved bytes:", unbatched_block_total - batched_block_total)
print("Saved percentage:", (unbatched_block_total - batched_block_total) / unbatched_block_total )