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 :
c#
.net
bitcoin
blockchain
rvnlord
la source
la source
Réponses:
Les première et deuxième tentatives dans votre question ne se ressemblent en rien. Le premier utilise json rpc pour demander au démon l'équilibre (et j'ose dire que c'est la bonne manière - vous ne retirez pas le haut du moteur de votre voiture et ne poussez pas les pistons de haut en bas pour obtenir un mouvement vers l'avant, n'est-ce pas?) la seconde tente d'ouvrir la base de données du démon elle-même et de calculer directement le solde.
Vous n'avez pas "besoin d'un réseau" pour interroger l'hôte local, vous avez juste besoin d'une machine sur laquelle le support TCP / IP est installé, alors utilisez simplement la première méthode par quelque moyen que ce soit - soit en utilisant une bibliothèque qui écrit les données json-rpc pertinentes dans une requête http, ou en créant vous-même la requête http appropriée.
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 refactorisé, et j'utilise BitcoinLib avec le dernier bitcoind pour une variété d'opérations, y compris GetBalance
la source