Saya mencoba memeriksa saldo alamat Bitcoin tertentu dengan HANYA menggunakan blockchain yang disimpan secara lokal (diunduh melalui Bitcoin Core). Sesuatu yang mirip dengan ini (dengan menggunakan NBitCoin dan / atau QBitNinja), tetapi tanpa memerlukan akses ke jaringan:
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;
}
Contoh di atas membutuhkan akses ke jaringan. Saya perlu melakukan hal yang sama secara offline. Saya datang dengan sesuatu seperti ini, tetapi jelas itu tidak berhasil:
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;
}
- Itu hang selama permintaan
- Saya ingin sesuatu daripada
InMemoryNoSqlRepository
disimpan dalam file untuk mencegah penggunaanReIndex()
yang memperlambat semuanya
Persyaratan saya adalah untuk Periksa Saldo dengan cara yang sama seperti pada metode pertama tetapi dengan menanyakan blok yang disimpan pada disk saya.
Sebenarnya yang saya butuhkan mungkin hanya menjadi jawaban untuk pertanyaan ini :