web-dev-qa-db-ja.com

C#.NETでLOCAL Bitcoinブロックチェーンをクエリする

ONLYを使用して、特定のビットコインアドレスのbalanceを確認しようとしていますビットコインコア)。これに似たもの(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. すべてを遅くするReIndex()の使用を防ぐために、InMemoryNoSqlRepositoryの代わりに何かをファイルに保存したい

私の要件はCheck Balanceと同じですが、ディスクに保存されているブロックをクエリすることです。

実際に私が必要とするのは、単に この質問 への答えかもしれません:

174
rvnlord

あなたの質問の最初と2番目の試みは似ていません。最初にjson rpcを使用して、デーモンにバランスを求めます(そして、私はそれが適切な方法だと思います-あなたはあなたの車のエンジンからトップを取り、前進運動を達成するためにあなた自身でピストンを押し下げませんか?) 2番目は、デーモンのデータベース自体を開き、残高を直接計算しようとします。

Localhostを照会するために「ネットワークは必要ありません」。TCP/ IPサポートがインストールされているマシンが必要なだけなので、何らかの方法で最初の方法を使用します。関連するjson-rpcデータを書き込むライブラリを使用するかhttpリクエストに変換するか、関連するhttpリクエストを自分で作成します。

BitcoinLibは維持される場合と維持されない場合があります(わかりません)が、ローカルデーモンを照会する機能を無効にすることはありません。私が知る限り、GetBalanceは削除またはリファクタリングされていません。また、GetBalanceを含むさまざまな操作に最新のビットコインでBitcoinLibを使用しています

1
Caius Jard