Tôi đang cố gắng kiểm tra số dư của một địa chỉ Bitcoin nhất định bằng cách CHỈ sử dụng blockchain được lưu trữ cục bộ (được tải xuống qua Bitcoin Core). Một cái gì đó tương tự như thế này (bằng cách sử dụng NBitCoin và / hoặc QBitNinja), nhưng không cần truy cập vào mạng:
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;
}
Ví dụ trên cần truy cập vào mạng. Tôi cần làm điều tương tự nhé. Tôi đã nghĩ ra một cái gì đó như thế này, nhưng rõ ràng nó không hoạt động:
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;
}
- Nó bị treo trong khi truy vấn
- Tôi muốn một cái gì đó thay vì
InMemoryNoSqlRepository
được lưu trữ trong một tập tin để ngăn chặn việc sử dụngReIndex()
làm chậm mọi thứ
Yêu cầu của tôi là Kiểm tra Số dư giống như trong phương thức đầu tiên nhưng bằng cách truy vấn các khối được lưu trữ trên đĩa của tôi.
Trên thực tế những gì tôi yêu cầu có thể chỉ là một câu trả lời cho câu hỏi này :