Estoy tratando de verificar el saldo de una dirección de Bitcoin dada utilizando SOLO la cadena de bloques almacenada localmente (descargada a través de Bitcoin Core). Algo similar a esto (usando NBitCoin y / o QBitNinja), pero sin necesidad de acceso a la red:
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;
}
El ejemplo anterior necesita acceso a la red. Necesito hacer lo mismo sin conexión. Se me ocurrió algo como esto, pero obviamente no funciona:
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;
}
- Se cuelga durante la consulta
- Quiero algo en lugar de
InMemoryNoSqlRepository
ser almacenado en un archivo para evitar el usoReIndex()
que ralentiza todo
Mi requisito es verificar el saldo de la misma manera que en el primer método, pero consultando bloques almacenados en mi disco.
En realidad, lo que necesito podría ser una respuesta a esta pregunta :