YEREL Bitcoin blok zincirini C # .NET ile sorgula


175

SADECE yerel olarak saklanan blockchain (Bitcoin Core üzerinden indirilir) kullanarak belirli bir Bitcoin adresinin dengesini kontrol etmeye çalışıyorum . Buna benzer bir şey (NBitCoin ve / veya QBitNinja kullanarak), ancak ağa erişmeye gerek kalmadan:

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;
}

Yukarıdaki örnekte ağa erişim gerekiyor. Aynı şeyi çevrimdışı yapmam gerekiyor. Ben böyle bir şey buldum, ama belli ki işe yaramıyor:

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. Sorgu sırasında kilitleniyor
  2. Her şeyi yavaşlatan kullanımını InMemoryNoSqlRepositoryönlemek için bir dosyada saklanmak yerine bir şey istiyorumReIndex()

Benim gereksinimi olan Bakiyesini Kontrol birinci yöntemde olduğu gibi ama benim diskte saklanan blokları sorgulayarak aynı şekilde.

Aslında istediğim sadece bu sorunun cevabı olabilir :


1
İdeal olarak NBitcoin'i sadece işe yaramayan ikinci yöntemimde kullanmak istiyorum ve nedenini bilmiyorum. IIS'deki QBitNinja Server benim ikinci seçeneğim, ancak BitcoinLib'den de bahsettiğiniz gibi, son çare olarak denemeliyim. Burada denge sadece bir örnek, birçok ilginç şey için yerel blockchain sorgulamak istiyorum. Yine de BitcoinLib'in güncellenmediğini düşündüm. Herhangi bir yardım için teşekkür ederiz ve şimdiye kadar deneyen tek kişi gibi görünüyor :). Kimse daha iyi cevap vermezse, size 50 temsilciyi vereceğim.
rvnlord

1
Yerel bir düğümüm yok ama blok zincir koduyla yaklaşık 4 yıl önce çalıştım. Çok iyi eğitimli bir tahmin verebilirim ki, bu kadar uzun sürmesinin nedeni, serileştirilmiş blockchain verilerinin yapılandırılma şekli ve linq motorunun bu verileri sorgulama yolu olmasıdır. Temel ayrıştırma / sorgulama kodu optimize edilmediğinden, yordamınızın "asılı" olduğundan şüpheleniyorum. Kodunuz büyük olasılıkla çalışıyor, ancak duyarlı yürütme için temelde bazı optimizasyonlar gerekebilir.
RLH

12
Merhaba, bu eski bir soru ama bunu dün gördüm. Kodunuzu NBitcoin ile denedim. Kodunuz yalnızca kısmi eski yerel düğümümde çalışır, ancak bu satır dizinine yorum yaparsam.ReIndex (); ve bu çizgi var zinciri = düğüm.GetChain () ;. Ben de GetChain yerine GetBlocks yaptım biraz benim kod tweaked. ve çalışmasını sağlamak için benzer değişiklikler. İndirilmek istemiyorum bu yüzden bu yorumu gönderiyorum :). Umarım size yardımcı olur.
Hey24sheep

19
@ Hey24sheep Kodunuz çalışıyor mu? Sonra cevap olarak gönderin. Kimsenin çalışan bir çözüm için sizi küçümseyeceğine inanmıyorum.
Martin Braun

5
İnsanlar neden bir çözüm yayınlamaktan ve oy kullanmaktan korkuyor? Bu, Bitcoin'in düşündüğümüz gibi olmadığının bir işareti mi? Bir Bitcoin spekülatörü olarak endişelenmemeli miyim? @ Hey24sheep ve diğerleri tarafından yapılan yoruma atıfta bulunarak. Sarı bayrak zamanı?
Zengin Bianco

Yanıtlar:


1

Sorunuzdaki ilk ve ikinci denemeler birbirine benzemez. Birincisi, cini dengeyi istemek için json rpc kullanıyor (ve bunun doğru yol olduğunu söylemeye cesaret ediyorum - ileriye doğru hareket etmek için araba motorunun üst kısmını çıkarmayın ve pistonları kendiniz yukarı ve aşağı itmeyin, değil mi?) ikincisi, arka plan programının veritabanını açmaya ve dengeyi doğrudan hesaplamaya çalışır.

Localhost'u sorgulamak için "bir ağa ihtiyacınız yok", sadece TCP / IP desteğinin yüklü olduğu bir makineye ihtiyacınız var, bu yüzden ilk yöntemi her ne şekilde olursa olsun kullanın - ya da ilgili json-rpc verilerini yazan bir kütüphane kullanarak bir http isteğine veya ilgili http isteğini kendiniz oluşturarak ..

BitcoinLib korunabilir veya korunmayabilir (bilmiyorum) ancak bu, yerel daemon'unuzu sorgulama yeteneğini geçersiz kılmaz; bildiğim kadarıyla GetBalance kaldırılmadı veya yeniden düzenlenmedi ve GetBalance dahil olmak üzere çeşitli işlemler için en son bitcoind ile BitcoinLib kullanıyorum


Bu soruyu tamamen unuttum. @ Hey24sheep sorunu çözdü, ancak şu anda tam yerel düğümüm yok. O zaman LOCAL ve OFFLINE verilerini sorgulamaya çalıştım. Üçüncü taraf kaynaklara API'ları kullanarak elde edebileceğimden çok daha hızlı sorgulamam gerekiyordu.
rvnlord
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.