Estou tentando verificar o saldo de um determinado endereço Bitcoin usando APENAS a blockchain armazenada localmente (baixada via Bitcoin Core). Algo semelhante a isso (usando NBitCoin e / ou QBitNinja), mas sem a necessidade de acessar a rede:
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;
}
O exemplo acima precisa de acesso à rede. Eu preciso fazer a mesma coisa offline. Eu vim com algo assim, mas obviamente não 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;
}
- Trava durante a consulta
- Eu quero que algo em vez de
InMemoryNoSqlRepository
seja armazenado em um arquivo para impedir o uso, oReIndex()
que atrasa tudo
Meu requisito é verificar o equilíbrio da mesma maneira que no primeiro método, mas consultando os blocos armazenados no meu disco.
Na verdade, o que eu preciso pode ser apenas uma resposta para esta pergunta :
c#
.net
bitcoin
blockchain
rvnlord
fonte
fonte
Respostas:
A primeira e a segunda tentativas da sua pergunta não são iguais. Primeiro, você usa o json rpc para pedir ao daemon a balança (e ouso dizer que é o caminho certo - você não retira a tampa do motor do carro e empurra os pistões para cima e para baixo para conseguir avançar, não é?) o segundo tenta abrir o próprio banco de dados do daemon e calcular o saldo diretamente.
Você não "precisa de uma rede" para consultar o host local, apenas precisa de uma máquina com suporte a TCP / IP instalado; portanto, use o primeiro método por qualquer meio - usando uma biblioteca que grave os dados relevantes do json-rpc em uma solicitação http ou formando a solicitação http relevante por conta própria.
O BitcoinLib pode ou não ser mantido (não sei), mas isso não invalida sua capacidade de consultar seu daemon local; até onde eu sei, o GetBalance não foi removido ou refatorado e uso o BitcoinLib com o bitcoind mais recente para uma variedade de operações, incluindo GetBalance
fonte