Bitcoin Core : Je ne peux pas analyser l'UTXO à partir de l'état de la chaîne
- Problème de lecture des émissions à partir du stockage d'état de la chaîne Bitcoin Core LevelDB
- Réussite dans la lecture du préfixe, de la clé d'obscurcissement et du txID avec le output_n
- Résultats attendus : blockHeight doit être 93, coinbase false
- Description de la fonction de désobscurcissement utilisée pour lire les informations
- Tests réalisés sur le réseau privé regtest et le réseau principal avec une blockchain de 105 blocs seulement
J'ai un problème avec la lecture des émissions à partir du stockage d'état de chaîne Bitcoin Core LevelDB. Je sais que la structure de la version actuelle du chainstate est clé => valeur où la clé est un préfixe (0x43) | tx_id | coin_n (https://github.com/bitcoin/bitcoin/blob/0d509bab45d292caeaf34600e57b5928757c6005/src/txdb.cpp#L39) et la valeur est obscurcie par la clé d'obscurcissement via la valeur obfuscation_key Coin XOR de la pièce.
Réf : https://github.com/bitcoin/bitcoin/blob/0d509bab45d292caeaf34600e57b5928757c6005/src/txdb.cpp#L68
J'ai donc réussi à lire le préfixe, la clé d'obscurcissement et le txId avec le output_n
clé : préfixe : [1]octet (COutPoint) txID : [32]octet de sortieN : VARINT
Réf : https://github.com/bitcoin/bitcoin/blob/0d509bab45d292caeaf34600e57b5928757c6005/src/primitives/transaction.h#L28
La structure des pièces (https://github.com/bitcoin/bitcoin/blob/0d509bab45d292caeaf34600e57b5928757c6005/src/coins.h#L24)
code : VARINT((coinbase ? 1 : 0) | (hauteur > 1 log.Println(« blockHeight », blockHeight) isCoinbase := code|1 == 1 log.Println( » estCoinbase », estCoinbase) }
Résultat
03/04/2024 15:24:06 code 7552 03/04/2024 15:24:06 blockHeight 3776 03/04/2024 15:24:06 isCoinbase false
Résultat attendu : blockHeight doit être 93, coinbase false.
Les autres informations. Mon code de fonction de désobscurcissement :
func deobfuscateValue (obfuscationKey, valeur []octet) []octet { deobfuscatedValue := make([]octet, len (valeur)) copie (deobfuscatedValue, valeur) pour i, c := valeur de plage { deobfuscatedValue[i] = c ^ clé d'obscurcissement[i%len(obfuscationKey)]
} renvoie la valeur désobfusquée }
J'utilise le réseau de regtest privé sur Bitcoin Core v0.21 (j'ai essayé la version 24 et j'ai les mêmes résultats). J'utilise l'image docker Bitcoin-testnet-box pour tester mon programme. De plus, j'ai testé sur le réseau principal, mais j'ai également le même problème. Ma blockchain ne compte désormais que 105 blocs.
Merci pour l'aide. Je pense que j'ai raté quelque chose de simple et je ne sais tout simplement pas quelque chose sur la réalisation chainstate ou C++ ou Golang 🙂