我试图仅使用本地存储的区块链(通过比特币核心下载)来检查给定比特币地址的余额。类似于这种方法(使用 NBitCoin 和/或 QBitNinja),但无需访问网络:
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;
}
以上示例需要访问网络。我需要在离线情况下执行相同的操作。我想到了类似于这样的东西,但显然它不起作用:
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;
}
- 查询期间挂起
- 我想要一些东西来代替
InMemoryNoSqlRepository
,将其存储到文件中,以防止使用ReIndex()
导致所有内容变慢。
我的要求是通过查询存储在我的磁盘上的块来以与第一种方法相同的方式检查余额。
实际上,我需要的可能只是对这个问题的答案: