我试图通过使用 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;
}
-
它在查询期间挂起
-
我想要一些东西而不是
InMemoryNoSqlRepository
存储在一个文件中,以防止使用ReIndex()
减慢一切
我的要求是 Check Balance 与第一种方法相同,但是查询存储在磁盘上的块 .
实际上我需要的可能只是this question的答案:
1 回答
你问题中的第一次和第二次尝试都不相同 . 第一个使用json rpc向守护进程询问 balancer (我敢说这是正确的方法 - 你不要把你的汽车发动机顶起来并自己上下推动活塞以实现向前运动,对吗?)第二次尝试打开守护程序的数据库本身并直接计算余额 .
你不需要“网络”来查询localhost,你只需要一台安装了TCP / IP支持的机器,所以只需使用第一种方法 - 通过使用写入相关json-rpc数据的库进入http请求,或自己形成相关的http请求..
BitcoinLib可能会或可能不会被维护(我不知道),但这并不会使其查询本地守护程序的能力无效;据我所知GetBalance还没有被删除或重构,我使用BitcoinLib和最新的bitcoind进行各种操作,包括GetBalance