web-dev-qa-db-fra.com

Interrogez LOCAL Bitcoin blockchain avec C # .NET

J'essaie de vérifier le solde d'une adresse Bitcoin donnée en utilisant [~ # ~] seulement [~ # ~] la blockchain stockée localement (téléchargée via Bitcoin Core). Quelque chose de semblable à cela (en utilisant NBitCoin et/ou QBitNinja), mais sans avoir besoin d'un accès 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. Je suis arrivé 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 l'utilisation de ReIndex() qui ralentit tout

Mon exigence est de Vérifier l'équilibre 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 bien être une réponse à cette question :

174
rvnlord

Les première et deuxième tentatives de votre question ne ressemblent pas. Le premier utilise json rpc pour demander l’équilibre au démon (et j’ose dire que c’est la bonne façon - vous ne retirez pas le capot de votre voiture et poussez vous-même les pistons pour atteindre le mouvement en avant, n'est-ce pas?) la seconde tente d'ouvrir la base de données du démon elle-même et de calculer le solde directement.

Vous n'avez pas "besoin d'un réseau" pour interroger l'hôte local, vous avez simplement besoin d'une machine sur laquelle le support TCP/IP est installé, utilisez donc simplement la première méthode, quel que soit le moyen utilisé - soit en utilisant une bibliothèque qui écrit les données json-rpc appropriées. dans une requête http, ou en formant vous-même la requête http correspondante.

BitcoinLib peut ou ne peut pas être maintenu (je ne sais pas) mais cela n'invalide pas sa capacité à interroger votre démon local; Autant que je sache, GetBalance n'a pas été supprimé ni refactorisé et j'utilise BitcoinLib avec le dernier bitcoind pour une variété d'opérations, y compris GetBalance.

1
Caius Jard