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;
}
- Il se bloque pendant la requête
- Je veux quelque chose au lieu de
InMemoryNoSqlRepository
à stocker dans un fichier afin d'empêcher l'utilisation deReIndex()
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.
1 votes
Je n'ai pas de nœud local mais j'ai travaillé avec le code de la blockchain il y a environ 4 ans. Je peux donner une très bonne estimation éclairée que la raison pour laquelle cela peut prendre si longtemps est la façon dont les données sérialisées de la blockchain sont structurées et la façon dont le moteur linq interroge ces données. Je soupçonne que votre routine est "suspendue" parce que le code sous-jacent de parsing/query n'est pas optimisé. Il est très probable que votre code fonctionne, mais il peut avoir besoin de quelques optimisations sous-jacentes pour une exécution réactive.
12 votes
Bonjour, c'est une vieille question mais j'ai vu cela hier. J'ai essayé votre code avec NBitcoin. Votre code fonctionne sur mon ancien nœud local partiel seulement si je commente cette ligne index.ReIndex() ; et cette ligne var chain = node.GetChain() ;. J'ai également modifié mon code un peu qu'au lieu de GetChain j'ai fait GetBlocks. et des changements simillar pour le faire fonctionner. Je ne veux pas me faire rétrograder alors je poste ce commentaire :) . J'espère que cela vous aidera.
19 votes
@Hey24sheep Votre code fonctionne ? Alors postez-le comme réponse. Je ne pense pas que quelqu'un puisse vous décoter pour une solution qui fonctionne.
1 votes
@modiX et Kobik, je n'ai pas pu trouver mon projet et je n'ai pas le noeud maintenant donc je ne peux pas le reproduire, idk Pourquoi (Peut-être que mon noeud a besoin d'être synchronisé avant que je puisse faire quelque chose). J'ai découvert que cette méthode est obsolète de toute façon. Nous devrions utiliser un explorateur ou autre maintenant. github.com/MetacoSA/NBitcoin/issues/332
0 votes
@kobik et modix, programmingblockchain.gitbooks.io/programmingblockchain/content/
5 votes
Pourquoi les gens ont-ils peur de poster une solution et de se faire descendre ? Est-ce un signe que Bitcoin n'est pas ce que nous pensons qu'il est ? Ne devrais-je PAS être inquiet en tant que spéculateur sur le bitcoin ? En référence au commentaire fait par @Hey24sheep et d'autres. Un drapeau jaune ?
0 votes
@Hey24sheep : Veuillez le poster comme une réponse avec un extrait de code pour que je puisse le marquer comme réponse acceptée, merci.
1 votes
@rvnlord Bonjour, je suis désolé mais je n'ai pas le code et le nœud pour le vérifier à nouveau. J'ai réessayé quand on m'a répondu mais je n'ai pas réussi à obtenir les mêmes résultats qu'avant. Je l'ai fait il y a longtemps.
0 votes
@Hey24sheep Juste un conseil pour la prochaine fois : même si vous postez une réponse et qu'elle est rétrogradée, la supprimer vous permettra de récupérer tous vos points de toute façon En outre, comme d'autres l'ont mentionné, si vous avez une solution qui fonctionne avec une explication appropriée dans votre réponse, je ne vois pas pourquoi quelqu'un vous rétrograderait pour cela.
0 votes
@KevinCruijssen Je m'en souviendrai la prochaine fois. J'avais une solution qui fonctionnait. J'ai juste peur des votes négatifs, parce que j'ai déjà reçu des votes négatifs pour des réponses correctes dans le passé.
1 votes
@Hey24sheep Vous pouvez être rétrogradé pour une réponse correcte, une solution fonctionnelle, une question valable, pour avoir dit la vérité ou pour rien du tout. Ne laissez pas ces choses stupides vous définir. Si vos connaissances apportent une valeur ajoutée au sujet et aident quelqu'un, c'est la chose la plus importante. Ne laissez personne vous décourager. J'ai corrigé le code, grâce à vos conseils un peu plus tôt, cependant je ne peux pas le tester contre le nœud local car je n'en ai plus. Je vous suis cependant reconnaissant pour votre contribution. Si vous fournissez une solution fonctionnelle en tant que réponse, dès que vous vous sentirez prêt, je m'assurerai que vous receviez une prime.
1 votes
@rvnlord Je n'ai pas la solution ou le nœud. Je le garderai en tête pour la prochaine fois :) Merci