用 C # . NET 查询本地比特币区块链

我试图通过使用本地存储的区块链 只有(通过比特币核心下载)来检查给定比特币地址的 平衡。类似的东西(通过使用 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;
}
  1. 它在查询期间挂起
  2. 我想要的东西,而不是 InMemoryNoSqlRepository被存储在一个文件,以防止使用 ReIndex(),这会减慢一切

我的要求是通过查询存储在磁盘上的块,使用与第一个方法相同的方法来实现 检查平衡

实际上,我需要的可能只是对 这个问题的回答:

11375 次浏览

你问题的第一次和第二次尝试完全不同。第一个程序使用 json rpc 来要求守护进程保持平衡(我敢说这是正确的方法——你不需要把汽车引擎的顶部取下来,自己上下推动活塞来达到前进的动作,去做吧 第二个程序尝试打开守护进程的数据库本身并直接计算余额。

你不需要一个“网络”来查询本地主机,你只需要一台安装了 TCP/IP 支持的机器,所以只要使用第一种方法就可以了——要么使用一个将相关 json-rpc 数据写入 http 请求的库,要么自己形成相关的 http 请求。.

BitcoinLib 可能会被维护,也可能不会被维护(我不知道) ,但这并不意味着它查询本地守护进程的能力失效; 据我所知,GetBalance 还没有被删除或重构,我使用 BitcoinLib 和最新的 bitcoind 进行包括 GetBalance 在内的各种操作