【问题标题】:Query LOCAL Bitcoin blockchain with C# .NET使用 C# .NET 查询本地比特币区块链
【发布时间】:2017-04-23 00:05:18
【问题描述】:

我正在尝试使用本地存储的区块链(通过比特币核心下载)检查给定比特币地址的余额。与此类似的东西(通过使用 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() 这会减慢一切速度

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

其实我需要的可能只是this question的答案:

【问题讨论】:

  • 理想情况下,我只想像在我的第二种方法中那样使用 NBitcoin,这种方法不起作用,我不知道为什么。 IIS 上的 QBitNinja Server 是我的第二个选择,但正如您提到的 BitcoinLib,我可能会在最后的选择中尝试一下。这里的余额只是一个例子,我想查询本地区块链以获取许多有趣的东西。虽然我认为 BitcoinLib 不再更新。我很感激任何帮助,看起来你是迄今为止唯一一个在尝试的人:)。所以是的,如果没有人给出更好的答案,我会给你 50 个代表。
  • 我没有本地节点,但大约 4 年前我曾使用过区块链代码。我可以给出一个非常有根据的猜测,这可能需要这么长时间的原因是序列化的区块链数据的结构方式以及 linq 引擎查询该数据的方式。我怀疑您的例程正在“挂起”,因为底层解析/查询代码未优化。您的代码很可能正常工作,但它可能需要一些底层优化才能响应式执行。
  • 嗨,这是一个老问题,但我昨天看到了。我用 NBitcoin 试过你的代码。仅当我注释此行 index.ReIndex(); 时,您的代码才适用于我的部分旧本地节点。这条线 var chain = node.GetChain();。我还稍微调整了我的代码,而不是 GetChain,我使用了 GetBlocks。并进行类似的更改以使其正常工作。我不想被否决,所以我发表了这条评论:)。希望对你有帮助。
  • @Hey24sheep 您的代码有效吗?然后将其发布为答案。我不相信有人会否决您的有效解决方案。
  • 为什么人们害怕发布解决方案并被否决?这是否表明比特币不是我们认为的那样?作为比特币投机者,我不应该担心吗?参考@Hey24sheep 和其他人的评论。黄旗时间?

标签: c# .net bitcoin blockchain


【解决方案1】:

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

您不需要“需要网络”来查询本地主机,您只需要一台安装了 TCP/IP 支持的机器,所以只需通过任何方式使用第一种方法 - 使用编写相关 json 的库-rpc 数据转换成http请求,或者自己形成相关的http请求..

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

【讨论】:

  • 我完全忘记了这个问题。 @Hey24sheep 解决了这个问题,尽管我现在没有完整的本地节点可用。那时我需要尝试查询 LOCAL 和 OFFLINE 数据。我需要以比使用 API 访问 3rd 方来源更快的速度查询它。
猜你喜欢
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 2018-06-15
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多