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<Coin>();
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 accès au réseau. Je dois faire la même chose hors ligne. J'ai trouvé 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;
}
- Il se bloque pendant la requête
- Je veux que quelque chose au lieu d'
InMemoryNoSqlRepository
être stocké dans un fichier afin d'éviter d'utiliserReIndex()
ce qui ralentit tout
Mon exigence est de vérifier le solde 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 juste une réponse à cette question :