Does the chainstate leveldb only contain "addresses" for P2PKH and P2SH? 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
               &lt;----&gt;&lt;----&gt;&lt;&gt;&lt;--------------------------------------&gt;
                /      /    \                   \
 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
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.