Query LOCAL Bitcoin blockchain ด้วย C # .NET


175

ฉันพยายามตรวจสอบยอดคงเหลือของที่อยู่ 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;
}
  1. มันค้างระหว่างการสืบค้น
  2. ฉันต้องการบางสิ่งแทนที่จะInMemoryNoSqlRepositoryเก็บไว้ในไฟล์เพื่อป้องกันการใช้ReIndex()ซึ่งทำให้ทุกอย่างช้าลง

ความต้องการของฉันคือการตรวจสอบยอดคงเหลือเหมือนกับวิธีแรก แต่โดยการสอบถามบล็อกที่เก็บไว้ในดิสก์ของฉัน

จริงๆแล้วสิ่งที่ฉันต้องการอาจเป็นเพียงคำตอบสำหรับคำถามนี้ :


1
เป็นการดีที่ฉันต้องการใช้ NBitcoin เฉพาะในวิธีที่สองของฉันซึ่งใช้งานไม่ได้และฉันไม่รู้ว่าทำไม QBitNinja Server บน IIS เป็นตัวเลือกที่สองของฉัน แต่เมื่อคุณพูดถึง BitcoinLib ฉันอาจลองเป็นทางเลือกสุดท้าย ยอดคงเหลือที่นี่เป็นเพียงตัวอย่างฉันต้องการสอบถาม blockchain ในพื้นที่สำหรับสิ่งที่น่าสนใจมากมาย แม้ว่าฉันคิดว่า BitcoinLib จะไม่ปรับปรุงอีกต่อไป ฉันขอขอบคุณความช่วยเหลือใด ๆ และดูเหมือนว่าคุณเป็นคนเดียวที่พยายามมาจนถึงตอนนี้ :) ใช่ฉันจะให้ตัวแทน 50 คนถ้าไม่มีใครตอบได้ดีกว่า
rvnlord

1
ฉันไม่มีโหนดในเครื่อง แต่ฉันทำงานกับ blockchain code ได้ดีเมื่อประมาณ 4 ปีที่แล้ว ฉันสามารถเดาได้อย่างดีว่าเหตุผลที่สิ่งนี้อาจใช้เวลานานมากคือวิธีที่โครงสร้างข้อมูล blockchain ถูกจัดโครงสร้างและวิธีที่โปรแกรม linq ค้นหาข้อมูลนั้น ฉันสงสัยว่ารูทีนของคุณคือ "หยุด" เนื่องจากรหัสการวิเคราะห์ / การสืบค้นพื้นฐานไม่ได้รับการปรับปรุง รหัสของคุณใช้งานได้ดี แต่อาจต้องมีการปรับแต่งพื้นฐานเพื่อการประมวลผลที่ตอบสนองได้ดี
RLH

12
สวัสดีมันเป็นคำถามเก่า แต่ฉันเห็นเมื่อวานนี้ ฉันลองรหัสของคุณด้วย NBitcoin รหัสของคุณทำงานบนโหนดโลคัลเก่าบางส่วนของฉันเฉพาะเมื่อฉันคอมเม้นต์ดัชนีบรรทัดนี้ ReIndex (); และสายนี้ var chain = node.GetChain (); ฉันยัง tweaked รหัสของฉันเล็กน้อยว่าแทนที่จะ GetChain ฉันได้ GetBlocks และการเปลี่ยนแปลง simillar เพื่อให้มันใช้งานได้ ฉันไม่ต้องการลงคะแนนดังนั้นฉันโพสต์ความคิดเห็นนี้ :) ฉันหวังว่ามันจะช่วยคุณ
Hey24sheep

19
@ Hey24sheep รหัสของคุณใช้งานได้? จากนั้นโพสต์เป็นคำตอบ ฉันไม่เชื่อว่าจะมีใครลงคะแนนให้คุณสำหรับวิธีแก้ปัญหาการทำงาน
Martin Braun

5
ทำไมคนกลัวที่จะโพสต์วิธีแก้ปัญหาและลงคะแนน? นี่เป็นสัญญาณว่า Bitcoin ไม่ใช่สิ่งที่เราคิดว่าใช่หรือไม่ ฉันไม่ควรกังวลว่าเป็นนักเก็งกำไร Bitcoin หรือไม่? อ้างถึงความคิดเห็นที่ทำโดย @ Hey24sheep และคนอื่น ๆ เวลาธงเหลืองหรือไม่
รวย Bianco

คำตอบ:


1

ความพยายามครั้งแรกและครั้งที่สองในคำถามของคุณนั้นไม่เหมือนกัน ก่อนอื่นใช้ json rpc เพื่อขอภูตเพื่อความสมดุล (และฉันกล้าบอกว่ามันเป็นวิธีที่เหมาะสม - คุณไม่ถอดเครื่องยนต์รถยนต์ของคุณและผลักลูกสูบขึ้นและลงเพื่อให้เกิดการเคลื่อนที่ไปข้างหน้าใช่ไหม?) ครั้งที่สองพยายามเปิดฐานข้อมูลของ daemon และคำนวณยอดเงินโดยตรง

คุณไม่ต้อง "เครือข่าย" เพื่อสืบค้น localhost คุณเพียงแค่ต้องมีเครื่องที่ติดตั้งการสนับสนุน TCP / IP ดังนั้นให้ใช้วิธีแรกไม่ว่าจะด้วยวิธีใดก็ตาม - โดยการใช้ห้องสมุดที่เขียนข้อมูล json-rpc ที่เกี่ยวข้อง เป็นคำขอ http หรือโดยสร้างคำขอ http ที่เกี่ยวข้องด้วยตัวคุณเอง ..

BitcoinLib อาจจะมีหรือไม่มีการบำรุงรักษา (ฉันไม่รู้) แต่นั่นก็ไม่ได้ทำให้ความสามารถในการสอบถามภูตท้องถิ่นของคุณเป็นโมฆะ เท่าที่ฉันรู้ว่า GetBalance ยังไม่ได้ถูกลบออกหรือถูกปรับสภาพใหม่และฉันใช้ BitcoinLib กับ bitcoind ล่าสุดสำหรับการดำเนินงานที่หลากหลายรวมถึง GetBalance


ฉันลืมคำถามนี้โดยสิ้นเชิง @ Hey24sheep แก้ไขปัญหาแม้ว่าฉันจะไม่ได้มีโหนดในเครื่องเต็มรูปแบบในขณะนี้ ฉันต้องการความพยายามในการค้นหาข้อมูล LOCAL และออฟไลน์แล้ว ฉันต้องการค้นหาเร็วกว่าที่ฉันสามารถทำได้โดยใช้ API กับแหล่งข้อมูลบุคคลที่สาม
rvnlord
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.