Próbuję sprawdzić saldo podanego adresu Bitcoin, używając TYLKO lokalnie przechowywanego blockchaina (pobieranego przez Bitcoin Core). Coś podobnego do tego (przy użyciu NBitCoin i / lub QBitNinja), ale bez konieczności dostępu do sieci:
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;
}
Powyższy przykład wymaga dostępu do sieci. Muszę zrobić to samo w trybie offline. Wymyśliłem coś takiego, ale oczywiście to nie działa:
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;
}
- Zawiesza się podczas zapytania
- Chcę, aby coś zamiast
InMemoryNoSqlRepository
było przechowywane w pliku, aby zapobiec używaniu,ReIndex()
które spowalnia wszystko
Moim wymaganiem jest sprawdzenie salda w taki sam sposób, jak w pierwszej metodzie, ale poprzez odpytywanie bloków przechowywanych na moim dysku.
Właściwie to, czego potrzebuję, może być odpowiedzią na to pytanie :
c#
.net
bitcoin
blockchain
rvnlord
źródło
źródło
Odpowiedzi:
Pierwsza i druga próba twojego pytania nie są do siebie podobne. Pierwszy z nich używa json rpc, aby zapytać demona o równowagę (i śmiem twierdzić, że to właściwy sposób - nie zdejmujesz górnej części silnika samochodu i nie naciskasz tłoków w górę iw dół, aby uzyskać ruch do przodu, prawda?) drugi próbuje otworzyć samą bazę danych demona i bezpośrednio obliczyć saldo.
Nie potrzebujesz sieci do wysyłania zapytań do lokalnego hosta, potrzebujesz tylko maszyny z zainstalowaną obsługą TCP / IP, więc po prostu użyj pierwszej metody w jakikolwiek sposób - albo używając biblioteki, która zapisuje odpowiednie dane json-rpc do żądania http lub samodzielnie tworząc odpowiednie żądanie http.
BitcoinLib może być utrzymywany lub nie (nie wiem), ale to nie unieważnia jego możliwości wysyłania zapytań do lokalnego demona; o ile wiem, GetBalance nie został usunięty ani refaktoryzowany, a używam BitcoinLib z najnowszym bitcoindem do różnych operacji, w tym GetBalance
źródło