3

I'm writing a small script that will dump the utxo database to a text file. As far as I'm aware, these are the most common script patterns indicated by the type field inside each value:

e.g. value:    b98276a2ec7700cbc2986ff9aed6825920aece14aa6f5382ca5580
               <----><----><><-------------------------------------->
                /      /    \                   \
 height/coinbase  value      type                script data


0x00 = P2PKH (hash160 public key)
0x01 = P2SH  (hash160 script)
0x02 = P2PK
0x03 = P2PK
0x04 = P2PK (uncompressed)
0x05 = P2PK (uncompressed)

It seems as though the script type is there so that you only need to store the minimal amount of script data inside the database (e.g. the unique public keys and script hashes inside P2PK, P2PKH, and P2SH).

Anyway, would I be correct in assuming that you could only get an address from script types 0 and 1 (by base58 encoding the script data)?

In other words, the chainstate leveldb does not include any witness data to allow you get addresses for utxos using P2WPKH and P2WSH scripts?

EDIT: Here's the finished tool: https://github.com/in3rsha/bitcoin-utxo-dump

3

Yes, Bitcoin Core does do some compression of standard output scripts in order to store the minimal amount of data needed.

Anyway, would I be correct in assuming that you could only get an address from script types 0 and 1 (by base58 encoding the script data)?

Yes

In other words, the chainstate leveldb does not include any witness data to allow you get addresses for utxos using P2WPKH and P2WSH scripts?

If by witness data you mean Segwit outputs, no. ALL output's scriptPubKeys are stored in the database, otherwise it would be unable to verify transactions that spend arbitrary scripts and segwit scripts. These scripts are stored without special compression (i.e. the type stuff going on here) and just serialized as is. Segwit outputs are already in a minimal form so there is no need for a type here.

Since all scriptPubKeys are stored in the database, you can compute the address for every UTXO if it has one, including segwit UTXOs.

Also, the term witness data refers to the signatures and input data for a transaction that spends a segwit output. It does not refer to anything that is segwit related. Using the term "witness data" in your question is confusing.

  • Ha, had the completely the wrong idea with where I was going there. Thanks for clearing that up. – inersha Mar 29 at 18:52
  • Seeing as P2WPKH and P2WSH scripts are stored without special compression, what does the script type field indicate for these entries? From a quick look it appears that P2WPKH are type 28 and P2WSH are type 40. I'm not sure what the number indicates when it's greater than 5. – inersha Mar 30 at 11:35
  • It seems as though if the type is greater than 5, then it indicates the size of the upcoming script. Although the size given is actually 6 bytes greater, so you should subtract 6 to get the actual size of the upcoming script. – inersha Mar 30 at 12:09
  • A brief description of the compression can be found here: github.com/bitcoin/bitcoin/blob/master/src/compressor.h#L25. There are only 6 types, 0x00 is P2PKH, 0x01 is P2SH, 0x02 and 0x03 are compressed pubkeys. Those bytes are actually part of the pubkey itself. 0x04 and 0x05 are uncompressed pubkeys. After that, the first byte is the script size + 6, so the real size is byte - 6. – Andrew Chow Mar 30 at 16:11
  • Thank you. Why is it that 0x05 is used for uncompressed public keys, seeing as they always start with 0x04? Why not just use 0x04 for all uncompressed public keys? – inersha Mar 30 at 16:17

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.