the programming programing c# .net bitcoin blockchain

programming - Consulta LOCAL Bitcoin blockchain con C#.NET



programing the blockchain in c# (1)

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; }

  1. Se cuelga durante la consulta
  2. Quiero que algo en lugar de InMemoryNoSqlRepository se almacene en un archivo para evitar el uso de ReIndex() 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 :


El primer y segundo intento en su pregunta no se parecen en nada. Primero, usa json rpc para pedirle al demonio el equilibrio (y me atrevo a decir que es la forma correcta: no quitas la parte superior del motor de tu auto y empujas los pistones hacia arriba y hacia abajo para lograr el movimiento hacia adelante, ¿verdad?) el segundo intenta abrir la base de datos del demonio y calcular el saldo directamente.

No "necesita una red" para consultar el host local, solo necesita una máquina que tenga instalado el soporte TCP / IP, así que use el primer método por cualquier medio, ya sea usando una biblioteca que escriba los datos json-rpc relevantes en una solicitud http, o formando la solicitud http relevante usted mismo ...

BitcoinLib puede o no mantenerse (no lo sé) pero eso no invalida su capacidad de consultar a su demonio local; por lo que sé, GetBalance no se ha eliminado ni refactorizado, y uso BitcoinLib con el último bitcoind para una variedad de operaciones, incluido GetBalance