Interroger la blockchain Bitcoin LOCAL avec C # .NET

J’essaie de vérifier le solde d’une adresse Bitcoin donnée en utilisant UNIQUEMENT la blockchain stockée localement (téléchargée via Bitcoin Core). Quelque chose de similaire (en utilisant NBitCoin et / ou QBitNinja), mais sans avoir besoin d’accéder au réseau:

private static readonly QBitNinjaClient client = new QBitNinjaClient(Network.Main); public decimal CheckBalance(BitcoinPubKeyAddress address) { var balanceModel = client.GetBalance(address, true).Result; decimal balance = 0; if (balanceModel.Operations.Count > 0) { var unspentCoins = new List(); foreach (var operation in balanceModel.Operations) unspentCoins.AddRange(operation.ReceivedCoins.Select(coin => coin as Coin)); balance = unspentCoins.Sum(x => x.Amount.ToDecimal(MoneyUnit.BTC)); } return balance; } 

L’exemple ci-dessus nécessite un access au réseau. Je dois faire la même chose hors ligne. Je suis venu avec quelque chose comme ça, mais évidemment, ça ne marche pas:

 public decimal CheckBalanceLocal(BitcoinPubKeyAddress address) { var node = Node.ConnectToLocal(Network.Main); node.VersionHandshake(); var chain = node.GetChain(); var store = new BlockStore(@"F:\Program Files\Bitcoin\Cache\blocks", Network.Main); var index = new IndexedBlockStore(new InMemoryNoSqlRepository(), store); index.ReIndex(); var headers = chain.ToEnumerable(false).ToArray(); var balance = ( from header in headers select index.Get(header.HashBlock) into block from tx in block.Transactions from txout in tx.Outputs where txout.ScriptPubKey.GetDestinationAddress(Network.Main) == address select txout.Value.ToDecimal(MoneyUnit.BTC)).Sum(); return balance; } 
  1. Il se bloque pendant la requête
  2. Je veux que quelque chose au lieu de InMemoryNoSqlRepository soit stocké dans un fichier afin d’éviter d’utiliser ReIndex() qui ralentit tout

Mon exigence est de vérifier la balance de la même manière que dans la première méthode, mais en interrogeant les blocs stockés sur mon disque.

En fait, ce dont j’ai besoin pourrait être une réponse à cette question :