【发布时间】: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;
}
- 查询期间挂起
- 我希望将一些东西而不是
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