Thanks guys for your help!!
Unfortunately i can't post links because i'm a newbie. It doesn't matter i will post the source code.
't' + 32-byte transaction hash -> transaction index record. These are optional and only exist if 'txindex' is enabled (see above). Each record stores:
Which block file number the transaction is stored in.
Which offset into that file the block the transaction is part of is stored at.
The offset from the start of that block to the position where that transaction itself is stored.
Thanks you very much! This link helped me a lot!
The only thing i didn't understand is how this values are stored in a file.
Is the file structure like that??
'b' + 32-byte block hash -> block index record. Each record stores:
The block header.
The height.
The number of transactions.
To what extent this block is validated.
In which file, and where in that file, the block data is stored.
In which file, and where in that file, the undo data is stored.
Example:
Key: b <32 bytes block hash>
Value:
So the result will be something like that:
b ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb
1 ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb 1234 1234 1234 1 1 blk00001.dat 0 rev00001.dat 0
Struct:
b: Indicate the value type
ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb: block hash
(Block Header part)
1: version
ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb: previous block hash
ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb: merkle root hash
1234: unix epoch time
1234: nBits
1234: nonce
1: height
1: transaction count
blk00001.dat: block file
0: offset of the block inside the file
rev00001.dat: rev file
0: offset of the block rev inside the file
So if i want to find a block informations i need to scan this file until i find the block hash i'm looking for and read it from the blk files???
Why keep the index a lot big instead of a lite version for keep it always in memory?
Why store a lot of informations for a block?? If i understand well the block header is a value that contains the block hash, previous block hash, merkle tree root hash ecc... Those informations are not stored inside the blk file?
So my probably wrong idea is to have a file blkIndex that stores only basic informations like :
- block hash
- blk file name where the informations are stored
- the location inside the file
Read it at the startup and load all the blocks headers from the blk files like Satoshi says
A block header with no transactions would be about 80 bytes. If we suppose blocks are
generated every 10 minutes, 80 bytes * 6 * 24 * 365 = 4.2MB per year. With computer systems
typically selling with 2GB of RAM as of 2008, and Moore's Law predicting current growth of
1.2GB per year, storage should not be a problem even if the block headers must be kept in
memory
and when i need a more deep information like a transaction i will search it in the index file.
Why create a single index file instead of multiple index files for transactions, blocks, ecc.. (i know using offset will solve the problem of big file to read)?? In this way is confusing to read no??
Thank you all for helping me understand how BTC works. I'm learning a lot!!
I'm asking all those questions because while updating the chart i'm tring to recreate a simple cryptocurrency using C# just for learning. I've already created the wallet part and the script for sign the transactions. In another project i've already created a simple blockchain so i only need to put the pieces togheter. If someone is insterested i can post it here (i'm trying to add a lot of comments for keep it simple to understand)
UPDATE
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