Kueri LOCAL Bitcoin blockchain dengan C # .NET

175

Saya mencoba memeriksa saldo alamat Bitcoin tertentu dengan HANYA menggunakan blockchain yang disimpan secara lokal (diunduh melalui Bitcoin Core). Sesuatu yang mirip dengan ini (dengan menggunakan NBitCoin dan / atau QBitNinja), tetapi tanpa memerlukan akses ke jaringan:

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

Contoh di atas membutuhkan akses ke jaringan. Saya perlu melakukan hal yang sama secara offline. Saya datang dengan sesuatu seperti ini, tetapi jelas itu tidak berhasil:

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. Itu hang selama permintaan
  2. Saya ingin sesuatu daripada InMemoryNoSqlRepositorydisimpan dalam file untuk mencegah penggunaan ReIndex()yang memperlambat semuanya

Persyaratan saya adalah untuk Periksa Saldo dengan cara yang sama seperti pada metode pertama tetapi dengan menanyakan blok yang disimpan pada disk saya.

Sebenarnya yang saya butuhkan mungkin hanya menjadi jawaban untuk pertanyaan ini :

rvnlord
sumber
1
Idealnya saya hanya ingin menggunakan NBitcoin seperti pada metode kedua saya yang tidak berfungsi dan saya tidak tahu mengapa. QBitNinja Server di IIS adalah opsi kedua saya, tetapi seperti yang Anda sebutkan BitcoinLib, saya mungkin mencobanya sebagai upaya terakhir. Saldo di sini hanyalah contoh, saya ingin menanyakan blockchain lokal untuk banyak hal menarik. Meskipun saya pikir BitcoinLib tidak diperbarui lagi. Saya menghargai segala bantuan dan sepertinya Anda adalah satu-satunya yang berusaha sejauh ini :). Jadi ya saya akan memberi Anda 50 rep jika tidak ada yang memberikan jawaban yang lebih baik.
rvnlord
1
Saya tidak memiliki simpul lokal tetapi saya bekerja dengan kode blockchain sedikit sekitar 4 tahun yang lalu. Saya bisa memberikan tebakan berpendidikan yang sangat baik bahwa alasan mengapa hal ini mungkin memakan waktu begitu lama adalah cara terstrukturnya data blok rantai serial dan cara mesin linq menanyakan data itu. Saya menduga bahwa rutin Anda "menggantung" karena kode parsing / query yang mendasarinya tidak dioptimalkan. Kode Anda sangat mungkin berfungsi tetapi mungkin perlu beberapa optimasi yang mendasari untuk eksekusi responsif.
RLH
12
Hai, ini pertanyaan lama tapi saya melihat ini kemarin. Saya mencoba kode Anda dengan NBitcoin. Kode Anda hanya berfungsi pada simpul lokal lama parsial saya hanya jika saya mengomentari indeks baris ini.ReIndex (); dan baris ini var chain = node.GetChain () ;. Saya juga sedikit mengubah kode saya dan bukannya GetChain saya melakukan GetBlocks. dan perubahan simillar untuk membuatnya berfungsi. Saya tidak ingin downvoted jadi saya memposting komentar ini :). Saya harap ini membantu Anda.
Hey24sheep
19
@ Hey24sheep Kode Anda berfungsi? Lalu posting sebagai jawaban. Saya tidak percaya ada orang yang akan menurunkan Anda untuk solusi yang berhasil.
Martin Braun
5
Mengapa orang takut untuk mengirim solusi dan turun memilih? Apakah ini pertanda bahwa Bitcoin bukan seperti yang kami pikirkan? Haruskah saya TIDAK khawatir sebagai spekulator Bitcoin? Mengacu pada komentar yang dibuat oleh @ Hey24sheep dan lainnya. Waktu bendera kuning?
Rich Bianco

Jawaban:

1

Upaya pertama dan kedua dalam pertanyaan Anda sama saja. Yang pertama menggunakan json rpc untuk meminta keseimbangan pada dasmon (dan saya berani mengatakan itu cara yang tepat - Anda tidak mengambil bagian atas dari mesin mobil Anda dan mendorong piston ke atas dan ke bawah sendiri untuk mencapai gerakan maju, bukan?) yang kedua mencoba untuk membuka database daemon itu sendiri dan menghitung saldo secara langsung.

Anda tidak "memerlukan jaringan" untuk menanyakan localhost, Anda hanya perlu mesin yang memasang dukungan TCP / IP, jadi gunakan saja metode pertama dengan cara apa pun - baik dengan menggunakan perpustakaan yang menulis data json-rpc yang relevan menjadi permintaan http, atau dengan membentuk permintaan http yang relevan sendiri ..

BitcoinLib mungkin atau mungkin tidak dipertahankan (saya tidak tahu) tetapi itu tidak membatalkan kemampuannya untuk menanyakan daemon lokal Anda; sejauh yang saya tahu GetBalance belum dihapus atau dire-refored, dan saya menggunakan BitcoinLib dengan bitcoind terbaru untuk berbagai operasi termasuk GetBalance

Caius Jard
sumber
Saya benar-benar lupa tentang pertanyaan ini. @ Hey24sheep menyelesaikan masalah, meskipun saya tidak memiliki simpul lokal penuh tersedia sekarang. Saya perlu upaya untuk query data LOCAL dan OFFLINE saat itu. Saya perlu menanyakannya lebih cepat daripada yang dapat saya capai dengan menggunakan API ke sumber pihak ke-3.
rvnlord