Я пытаюсь проверить баланс данного адреса Биткойн, используя ТОЛЬКО локально сохраненную цепочку блоков (загруженную через Биткойн-ядро). Нечто похожее на это (с помощью 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()
которое замедляет все
Мое требование - проверить баланс так же, как в первом методе, но путем запроса блоков, хранящихся на моем диске.
На самом деле то, что мне нужно, может быть просто ответом на этот вопрос :
c#
.net
bitcoin
blockchain
rvnlord
источник
источник
Ответы:
Первая и вторая попытки в вашем вопросе не похожи друг на друга. Сначала используется json rpc, чтобы запросить баланс у демона (и я осмелюсь сказать, что это правильный путь - вы не снимаете верхнюю часть двигателя автомобиля и не толкаете поршни вверх и вниз для достижения движения вперед, не так ли?) вторая попытка открыть саму базу данных демона и рассчитать баланс напрямую.
Вам не «нужна сеть» для запроса локального хоста, вам просто нужен компьютер, на котором установлена поддержка TCP / IP, поэтому просто используйте первый метод любым способом - либо с помощью библиотеки, которая записывает соответствующие данные json-rpc в запрос http или путем формирования соответствующего запроса http самостоятельно.
BitcoinLib может поддерживаться или не поддерживаться (я не знаю), но это не лишает его возможности запрашивать у вашего локального демона; Насколько я знаю, GetBalance не был удален или подвергнут рефакторингу, и я использую BitcoinLib с новейшей биткойной для различных операций, включая GetBalance.
источник