使用C#.NET查询LOCAL比特币区块链

rvn*_*ord 174 .net c# bitcoin blockchain

我试图通过使用本地存储的区块链(通过比特币核心下载)来检查给定比特币地址的余额.与此类似的东西(通过使用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;
}
Run Code Online (Sandbox Code Playgroud)

上面的示例需要访问网络.我需要离线做同样的事情.我想出了类似的东西,但显然它不起作用:

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;
}
Run Code Online (Sandbox Code Playgroud)
  1. 它在查询期间挂起
  2. 我想要的东西,而不是InMemoryNoSqlRepository存储在文件中,以防止使用ReIndex()减慢一切

我的要求是以与第一种方法相同的方式检查余额,但查询存储在磁盘上的块.

实际上我要求的可能只是这个问题的答案:

Cai*_*ard 4

您问题中的第一次和第二次尝试完全不同。第一个使用 json rpc 向守护进程询问平衡(我敢说这是正确的方法 - 你不会打开汽车发动机的顶部并自己上下推动活塞来实现向前运动,是吗?)第二个尝试打开守护程序本身的数据库并直接计算余额。

您不需要“需要网络”来查询本地主机,您只需要一台安装了 TCP/IP 支持的计算机,因此无论通过什么方式都可以使用第一种方法 - 要么使用写入相关 json-rpc 数据的库到一个http请求中,或者通过自己形成相关的http请求..

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