177 votes

Interroger la blockchain Bitcoin LOCAL avec C# .NET

J'essaie de vérifier le équilibre 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 à cela (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. J'ai besoin de faire la même chose hors ligne. J'ai trouvé quelque chose comme ça, mais évidemment, ça ne fonctionne 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 quelque chose au lieu de InMemoryNoSqlRepository à stocker dans un fichier afin d'empêcher l'utilisation de ReIndex() ce qui ralentit tout

Mon exigence est la suivante Vérifier le solde de la même manière que dans la première méthode mais en interrogeant des blocs stockés sur mon disque.

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

0 votes

L'utilisation de QBitNinja est-elle obligatoire ? Parce que je me souviens que j'ai fait la même chose avec BitcoinLib il y a quelques années (mes souvenirs sont un peu rouillés mais je suis sûr que j'avais un nœud bitcoin local et que je l'utilisais pour interroger différents types de choses, y compris le solde).

1 votes

Idéalement, je voudrais utiliser uniquement NBitcoin comme dans ma deuxième méthode qui ne fonctionne pas et je ne sais pas pourquoi. QBitNinja Server sur IIS est ma deuxième option, mais comme vous avez mentionné BitcoinLib, je pourrais l'essayer en dernier recours. La balance n'est qu'un exemple, j'aimerais interroger la blockchain locale pour de nombreuses choses intéressantes. Je pensais pourtant que BitcoinLib n'était plus mis à jour. J'apprécie toute aide et il semble que vous soyez le seul à avoir essayé jusqu'à présent :). Donc oui, je vous donnerai les 50 points si personne ne donne de meilleure réponse.

0 votes

Le dernier commit date de 7 mois, pas si longtemps que ça (et il y a une demande de pull en attente par contibutor en mars de cette année), donc je ne dirais pas qu'il n'est plus mis à jour. En ce qui concerne les requêtes pour de nombreuses choses intéressantes, BitcoinLib n'est qu'un proxy de l'api RPC officielle, donc je suppose que vous pouvez tout interroger avec elle. Bien sûr, si vous avez déjà travaillé sur QBitNinja, je comprends que vous souhaitiez vous y tenir.

3voto

Caius Jard Points 212

La première et la deuxième tentative dans votre question ne se ressemblent pas. La première utilise json rpc pour demander l'équilibre au démon (et j'ose dire que c'est la bonne méthode - vous n'enlevez pas le couvercle du moteur de votre voiture et poussez vous-même les pistons de haut en bas pour obtenir un mouvement vers l'avant, n'est-ce pas ? ), la seconde tente d'ouvrir elle-même la base de données du démon et de calculer directement l'équilibre.

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

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

1 votes

J'ai complètement oublié cette question. @Hey24sheep a résolu le problème, bien que je n'aie pas de nœud local complet disponible maintenant. J'avais besoin d'essayer d'interroger les données LOCALES et OFFLINE à l'époque. J'avais besoin de les interroger beaucoup plus rapidement que je ne peux le faire en utilisant des API vers des sources tierces.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X