Ich versuche, den Kontostand einer bestimmten Bitcoin-Adresse zu überprüfen, indem ich NUR die lokal gespeicherte Blockchain verwende (heruntergeladen über Bitcoin Core). Ähnliches (mit NBitCoin und / oder QBitNinja), jedoch ohne Zugriff auf das Netzwerk:
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;
}
Das obige Beispiel benötigt Zugriff auf das Netzwerk. Ich muss das Gleiche offline tun. Ich habe mir so etwas ausgedacht, aber offensichtlich funktioniert es nicht:
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;
}
- Es hängt während der Abfrage
- Ich möchte, dass etwas
InMemoryNoSqlRepository
nicht in einer Datei gespeichert wird, um zu verhindern, dass die VerwendungReIndex()
alles verlangsamt
Meine Anforderung besteht darin, den Kontostand auf die gleiche Weise wie bei der ersten Methode zu überprüfen, jedoch indem auf meiner Festplatte gespeicherte Blöcke abgefragt werden.
Eigentlich könnte das, was ich benötige, nur eine Antwort auf diese Frage sein :
c#
.net
bitcoin
blockchain
rvnlord
quelle
quelle
Antworten:
Der erste und der zweite Versuch in Ihrer Frage sind nicht gleich. Zuerst fragt man den Dämon mit json rpc nach dem Gleichgewicht (und ich wage zu sagen, es ist der richtige Weg - Sie nehmen nicht das Verdeck Ihres Automotors ab und schieben die Kolben selbst auf und ab, um eine Vorwärtsbewegung zu erreichen, oder?) Beim zweiten Versuch wird die Datenbank des Dämons selbst geöffnet und der Kontostand direkt berechnet.
Sie benötigen kein "Netzwerk", um den lokalen Host abzufragen. Sie benötigen lediglich einen Computer, auf dem TCP / IP-Unterstützung installiert ist. Verwenden Sie also einfach die erste Methode auf irgendeine Weise - entweder mithilfe einer Bibliothek, die die relevanten json-rpc-Daten schreibt in eine http-Anfrage oder indem Sie die entsprechende http-Anfrage selbst bilden.
BitcoinLib kann beibehalten werden oder nicht (ich weiß nicht), aber dies macht seine Fähigkeit, Ihren lokalen Dämon abzufragen, nicht ungültig. Soweit ich weiß, wurde GetBalance nicht entfernt oder überarbeitet, und ich verwende BitcoinLib mit dem neuesten Bitcoind für eine Vielzahl von Vorgängen, einschließlich GetBalance
quelle