Truy vấn blockchain Bitcoin LỘC với C # .NET


175

Tôi đang cố gắng kiểm tra số dư của một địa chỉ Bitcoin nhất định bằng cách CHỈ sử dụng blockchain được lưu trữ cục bộ (được tải xuống qua Bitcoin Core). Một cái gì đó tương tự như thế này (bằng cách sử dụng NBitCoin và / hoặc QBitNinja), nhưng không cần truy cập vào mạng:

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

Ví dụ trên cần truy cập vào mạng. Tôi cần làm điều tương tự nhé. Tôi đã nghĩ ra một cái gì đó như thế này, nhưng rõ ràng nó không hoạt động:

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. Nó bị treo trong khi truy vấn
  2. Tôi muốn một cái gì đó thay vì InMemoryNoSqlRepositoryđược lưu trữ trong một tập tin để ngăn chặn việc sử dụng ReIndex()làm chậm mọi thứ

Yêu cầu của tôi là Kiểm tra Số dư giống như trong phương thức đầu tiên nhưng bằng cách truy vấn các khối được lưu trữ trên đĩa của tôi.

Trên thực tế những gì tôi yêu cầu có thể chỉ là một câu trả lời cho câu hỏi này :


1
Lý tưởng nhất là tôi chỉ muốn sử dụng NBitcoin như trong phương pháp thứ hai của mình mà không hiệu quả và tôi không biết tại sao. Máy chủ QBitNinja trên IIS là tùy chọn thứ hai của tôi, nhưng như bạn đã đề cập đến BitcoinLib, tôi có thể thử nó như là phương sách cuối cùng. Cân bằng ở đây chỉ là một ví dụ, tôi muốn truy vấn blockchain cục bộ cho nhiều điều thú vị. Mặc dù tôi nghĩ rằng BitcoinLib không được cập nhật nữa. Tôi đánh giá cao bất kỳ sự giúp đỡ nào và có vẻ như bạn là người duy nhất đang cố gắng cho đến nay :). Vì vậy, tôi sẽ cung cấp cho bạn 50 đại diện nếu không ai trả lời tốt hơn.
rvnlord

1
Tôi không có nút cục bộ nhưng tôi đã làm việc với mã blockchain một chút tốt khoảng 4 năm trước. Tôi có thể đưa ra một phỏng đoán rất có căn cứ rằng lý do tại sao việc này có thể mất nhiều thời gian là cách dữ liệu chuỗi khối được tuần tự hóa được cấu trúc và cách công cụ linq truy vấn dữ liệu đó. Tôi nghi ngờ rằng thói quen của bạn là "treo" vì mã phân tích / truy vấn cơ bản không được tối ưu hóa. Mã của bạn rất có khả năng hoạt động nhưng nó có thể cần một số tối ưu hóa cơ bản để thực thi đáp ứng.
RLH

12
Xin chào, đây là một câu hỏi cũ nhưng tôi đã thấy điều này ngày hôm qua. Tôi đã thử mã của bạn với NBitcoin. Mã của bạn chỉ hoạt động trên nút cục bộ cũ một phần của tôi nếu tôi nhận xét chỉ mục dòng này.Re Index (); và dòng này var chain = node.GetChain ();. Tôi cũng đã điều chỉnh mã của mình một chút rằng thay vì GetChain tôi đã thực hiện GetBlocks. và simillar thay đổi để làm cho nó hoạt động. Tôi không muốn bị hạ thấp vì vậy tôi đang đăng bình luận này :). Tôi hy vọng nó sẽ giúp bạn.
Hey24sheep

19
@ Hey24sheep Mã của bạn hoạt động? Sau đó gửi nó như là câu trả lời. Tôi không tin bất cứ ai sẽ đánh giá thấp bạn cho một giải pháp làm việc.
Martin Braun

5
Tại sao mọi người sợ đăng một giải pháp và được bỏ phiếu? Đây có phải là dấu hiệu cho thấy Bitcoin không phải là những gì chúng ta nghĩ? Tôi có nên KHÔNG quan tâm như một nhà đầu cơ Bitcoin? Đề cập đến nhận xét được thực hiện bởi @ Hey24sheep và những người khác. Cờ vàng thời gian?
Rich Bianco

Câu trả lời:


1

Nỗ lực đầu tiên và thứ hai trong câu hỏi của bạn không có gì giống nhau. Đầu tiên, người ta sử dụng json rpc để hỏi daemon về sự cân bằng (và tôi dám nói đó là cách thích hợp - bạn không lấy phần trên của động cơ xe ra và đẩy pít-tông lên xuống để tự mình chuyển động, phải không?) lần thứ hai cố gắng tự mở cơ sở dữ liệu của daemon và tính toán số dư trực tiếp.

Bạn không "cần mạng" để truy vấn localhost, bạn chỉ cần một máy có hỗ trợ TCP / IP được cài đặt, vì vậy chỉ cần sử dụng phương thức đầu tiên bằng bất kỳ phương tiện nào - bằng cách sử dụng thư viện ghi dữ liệu json-rpc có liên quan vào một yêu cầu http, hoặc bằng cách tự hình thành yêu cầu http có liên quan ..

BitcoinLib có thể hoặc không được duy trì (tôi không biết) nhưng điều đó không làm mất hiệu lực khả năng truy vấn daemon cục bộ của bạn; theo như tôi biết GetBalance chưa bị xóa hoặc tái cấu trúc và tôi sử dụng BitcoinLib với bitcoin mới nhất cho nhiều hoạt động bao gồm cả GetBalance


Tôi hoàn toàn quên mất câu hỏi này. @ Hey24sheep đã giải quyết vấn đề, mặc dù hiện tại tôi không có nút cục bộ đầy đủ. Tôi cần cố gắng truy vấn dữ liệu LOCAL và OFFLINE sau đó. Tôi cần truy vấn nó nhanh hơn nhiều so với những gì tôi có thể đạt được bằng cách sử dụng API cho các nguồn của bên thứ 3.
rvnlord
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.