私は確認しようとしていますバランス特定のビットコインアドレスを使用してのみローカルに保存されたブロックチェーン(Bitcoin Core 経由でダウンロード)。これに似たもの(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;
}
- クエリ中にハングする
- 使用によるすべての速度低下を
InMemoryNoSqlRepository
防ぐために、ファイルに保存する代わりに何かが欲しいReIndex()
私の要求はバランスチェック最初の方法と同じですが、ディスクに保存されているブロックを照会します。
実際、私が必要としているのは、この質問:
ベストアンサー1
質問の最初の試みと 2 番目の試みはまったく似ていません。最初の試みは、json rpc を使用してデーモンにバランスを問い合わせます (そして、私はあえてこれが正しい方法だと言います。前進するために、車のエンジンの上部を取り外してピストンを自分で上下に押したりはしませんよね?)。2 番目の試みは、デーモンのデータベース自体を開いて、バランスを直接計算しようとします。
ローカルホストを照会するのに「ネットワークは必要」ではなく、TCP/IP サポートがインストールされているマシンだけが必要なので、何らかの方法で最初の方法を使用します。つまり、関連する json-rpc データを http 要求に書き込むライブラリを使用するか、関連する http 要求を自分で作成します。
BitcoinLib はメンテナンスされているかどうかはわかりませんが (知りません)、ローカルデーモンを照会する機能が無効になるわけではありません。私の知る限り、GetBalance は削除またはリファクタリングされておらず、GetBalance を含むさまざまな操作に最新の bitcoind で BitcoinLib を使用しています。