ฉันพยายามตรวจสอบยอดคงเหลือของที่อยู่ Bitcoin ที่กำหนดโดยใช้blockchain ที่เก็บไว้ในเครื่องเท่านั้น (ดาวน์โหลดผ่าน 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()
ซึ่งทำให้ทุกอย่างช้าลง
ความต้องการของฉันคือการตรวจสอบยอดคงเหลือเหมือนกับวิธีแรก แต่โดยการสอบถามบล็อกที่เก็บไว้ในดิสก์ของฉัน
จริงๆแล้วสิ่งที่ฉันต้องการอาจเป็นเพียงคำตอบสำหรับคำถามนี้ :