C # .NET के साथ LOCAL बिटकॉइन ब्लॉकचेन को क्वेरी करें


175

मैं केवल स्थानीय रूप से संग्रहीत ब्लॉकचैन (बिटकॉइन कोर के माध्यम से डाउनलोड) का उपयोग करके किसी दिए गए बिटकॉइन पते के संतुलन की जांच करने की कोशिश कर रहा हूं । कुछ इसी तरह (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;
}
  1. यह क्वेरी के दौरान लटका रहता है
  2. मैं InMemoryNoSqlRepositoryएक फाइल में संग्रहीत होने के बजाय कुछ चाहता हूं ताकि वह उपयोग कर सके ReIndex()जिससे सब कुछ धीमा हो जाए

मेरी आवश्यकता पहले तरीके की तरह ही शेष राशि की जांच करना है लेकिन मेरी डिस्क पर संग्रहीत ब्लॉक को क्वेरी करके।

वास्तव में मुझे जो चाहिए वह सिर्फ इस सवाल का जवाब हो सकता है :


1
आदर्श रूप में मैं अपने दूसरे तरीके में केवल NBitcoin का उपयोग करना चाहूंगा जो काम नहीं करता है और मुझे नहीं पता कि क्यों। IIS पर QBitNinja Server मेरा दूसरा विकल्प है, लेकिन जैसा कि आपने BitcoinLib का उल्लेख किया है, मैं इसे अंतिम उपाय के रूप में आज़मा सकता हूं। यहां संतुलन केवल एक उदाहरण है, मैं कई दिलचस्प चीजों के लिए स्थानीय ब्लॉकचेन को क्वेरी करना चाहूंगा। हालाँकि मुझे लगा था कि BitcoinLib अब अपडेट नहीं है। मैं किसी भी मदद की सराहना करता हूं और ऐसा लगता है कि आप केवल वही हैं जो अब तक कोशिश कर रहा है :)। तो हाँ मैं आपको 50 प्रतिनिधि दूंगा अगर कोई बेहतर जवाब नहीं देता है।
रवानलॉर्ड

1
मेरे पास स्थानीय नोड नहीं है लेकिन मैंने ब्लॉकचेन कोड के साथ लगभग 4 साल पहले एक अच्छा सा काम किया था। मैं एक बहुत अच्छा शिक्षित अनुमान दे सकता हूं कि जिस कारण से यह इतना लंबा हो सकता है वह यह है कि क्रमबद्ध ब्लॉकचेन डेटा संरचित है और जिस तरह से लिनैक इंजन उस डेटा पर सवाल उठाता है। मुझे संदेह है कि आपकी दिनचर्या "लटकी हुई" है क्योंकि अंतर्निहित पार्सिंग / क्वेरी कोड अनुकूलित नहीं है। आपका कोड बहुत संभावना है कि काम कर रहा है, लेकिन इसे उत्तरदायी निष्पादन के लिए कुछ अंतर्निहित अनुकूलन की आवश्यकता हो सकती है।
RLH

12
नमस्ते, यह एक पुराना सवाल है लेकिन मैंने कल इसे देखा। मैंने आपका कोड NBitcoin के साथ आज़माया। आपका कोड मेरे आंशिक पुराने स्थानीय नोड पर तभी काम करता है जब मैं इस लाइन इंडेक्स पर टिप्पणी करता हूं। ReIndex (); और यह लाइन var श्रृंखला = node.GetChain () ;; मैंने अपने कोड को भी थोड़ा घुमाया कि गेटचैन के बजाय मैंने गेटब्लॉक किया। और simillar इसे काम करने के लिए बदलता है। मैं अपमानित नहीं होना चाहता, इसलिए मैं यह टिप्पणी पोस्ट कर रहा हूं :)। मुझे उम्मीद है इससे आपको मदद मिली होगी।
अरे

19
@ Hey24sep आपका कोड काम करता है? फिर उत्तर के रूप में पोस्ट करें। मुझे विश्वास नहीं है कि कोई भी आपको काम के समाधान के लिए कम करेगा।
मार्टिन ब्रौन

5
लोग समाधान पोस्ट करने और मतदान करने से क्यों डरते हैं? क्या यह संकेत है कि बिटकॉइन वह नहीं है जो हम सोचते हैं कि यह है? क्या मुझे बिटकॉइन सट्टेबाज के रूप में चिंतित नहीं होना चाहिए? @ Hey24sheep और अन्य द्वारा की गई टिप्पणी का जिक्र। पीला झंडा समय?
रिच बियान्को

जवाबों:


1

आपके प्रश्न के पहले और दूसरे प्रयास एक जैसे नहीं हैं। पहले एक बैलेंस के लिए डेमन से पूछने के लिए json rpc का उपयोग करता है (और मैं कहता हूं कि यह उचित तरीका है - आप अपने कार के इंजन को ऊपर नहीं लेते हैं और आगे बढ़ने के लिए पिस्टन को धक्का देते हैं और आगे बढ़ने के लिए खुद को नीचे गिराते हैं?) दूसरा डेमन के डेटाबेस को खोलने और शेष राशि की सीधे गणना करने का प्रयास करता है।

आपको लोकलहोस्ट को क्वेरी करने के लिए "नेटवर्क की आवश्यकता नहीं है", आपको बस एक ऐसी मशीन की आवश्यकता है जिसमें टीसीपी / आईपी सपोर्ट स्थापित हो, इसलिए जो भी साधन हो, उसके द्वारा पहली विधि का उपयोग करें - या तो एक लाइब्रेरी का उपयोग करके जो संबंधित json-rpc डेटा लिखता है एक HTTP अनुरोध में, या प्रासंगिक http अनुरोध खुद बनाकर ..

BitcoinLib को बनाए रखा जा सकता है या नहीं रखा जा सकता है (मुझे नहीं पता) लेकिन यह आपके स्थानीय डेमॉन को क्वेरी करने की क्षमता को अमान्य नहीं करता है; जहाँ तक मुझे पता है कि GetBalance को हटा दिया गया है या उसे हटा नहीं दिया गया है, और मैं GetBalance सहित विभिन्न कार्यों के लिए नवीनतम बिटकॉइन के साथ BitcoinLib का उपयोग करता हूं।


मैं इस सवाल के बारे में पूरी तरह से भूल गया। @ Hey24sheep ने इस समस्या को हल किया, हालाँकि मेरे पास अभी पूरा स्थानीय नोड उपलब्ध नहीं है। मुझे LOCAL और OFFLINE डेटा को फिर से क्वेरी करने के प्रयास की आवश्यकता थी। मुझे इसकी तुलना में बहुत तेजी से क्वेरी करने की आवश्यकता है जो कि मैं 3 पार्टी स्रोतों से एपीआई का उपयोग करके प्राप्त कर सकता हूं।
रैवनलॉर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.