Подтвердить что ты не робот

Запрос ЛОКАЛЬНАЯ Биткойн-блочная цепочка с С#.NET

Я пытаюсь проверить баланс данного адреса биткойна, используя ТОЛЬКО локально сохраненную блок-цепочку (загруженную через Bitcoin Core). Что-то похожее на это (с помощью 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(), которое замедляет все

Мое требование - Проверить баланс так же, как и в первом методе, но запросом блоков, хранящихся на моем диске.

На самом деле то, что мне нужно, может быть просто ответом на этот вопрос:

4b9b3361