Запросити локальний блокчейн Bitcoin за допомогою C # .NET


175

Я намагаюся перевірити баланс даної адреси Bitcoin, використовуючи ТОЛЬКО локально збережений блокчейн (завантажений через 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 на IIS - це мій другий варіант, але, як ви згадали BitcoinLib, я б спробував це в крайньому випадку. Баланс тут - лише приклад, я хотів би запитати локальний блокчейн про багато цікавих речей. Хоча я думав, що BitcoinLib більше не оновлюється. Я вдячний за будь-яку допомогу, і, схоже, ти єдиний, хто намагається поки що :). Так, я дам вам 50 повторень, якщо ніхто не дасть кращої відповіді.
rvnlord

1
У мене немає локального вузла, але я працював з кодом blockchain непогано близько 4 років тому. Я можу дати дуже вдале здобуте здогад, що причиною, за якою це може зайнятись, є те, як структуровані серіалізовані дані блокчейна та те, як движок linq запитує ці дані. Я підозрюю, що ваша рутина "звисає", оскільки базовий код розбору / запиту не оптимізований. Ваш код дуже ймовірно працює, але він може потребувати деяких оптимізацій, що лежать в основі, для швидкого виконання.
RLH

12
Привіт, це старе питання, але я це бачив вчора. Я спробував ваш код з NBitcoin. Ваш код працює на моєму частковому старому локальному вузлі, лише якщо я коментую цей рядок індекс.ReIndex (); і ця лінія var ланцюга = node.GetChain () ;. Я також трохи змінив свій код, що замість GetChain я зробив GetBlocks. і подібні зміни, щоб змусити його працювати. Я не хочу, щоб я був обмежений, тому я публікую цей коментар :). Я сподіваюся, що це вам допоможе.
Hey24sheep

19
@ Hey24sheep Ваш код працює? Потім опублікуйте це як відповідь. Я не вірю, що хтось би виступав з вами за робоче рішення.
Мартін Браун

5
Чому люди бояться опублікувати рішення та отримати право голосу? Це ознака того, що біткойн - це не те, що, на нашу думку, є? Чи мене НЕ турбують як біткойн-спекулянта? Посилаючись на коментар, зроблений @ Hey24sheep та іншими. Час жовтого прапора?
Багатий Б’янко

Відповіді:


1

Перша та друга спроби у вашому питанні нічим не схожі. Спочатку використовується json rpc, щоб попросити демона на рівновагу (і я смію сказати, що це правильний шлях - ви не знімаєте верхню частину двигуна свого автомобіля і не натискаєте поршні вгору і вниз, щоб досягти руху вперед, чи не так?) друга спроба відкрити саму базу даних демона та обчислити баланс безпосередньо.

Вам не потрібна мережа для запиту localhost, вам просто потрібна машина, на якій встановлена ​​підтримка TCP / IP, тому просто використовуйте перший метод будь-якими способами - або за допомогою бібліотеки, яка записує відповідні дані json-rpc на запит http, або самостійно сформувавши відповідний запит http.

BitcoinLib може підтримуватись або не підтримуватись (я не знаю), але це не скасовує його можливості запитувати ваш локальний демон; наскільки я знаю, GetBalance не було видалено або відновлено, і я використовую BitcoinLib з останньою біткойн для різних операцій, включаючи GetBalance


Я повністю забув про це питання. @ Hey24sheep вирішив проблему, хоча зараз у мене немає повного локального вузла. Мені тоді була потрібна спроба запиту даних LOCAL і OFFLINE. Мені потрібно було запитувати його набагато швидше, ніж я можу досягти, використовуючи API для сторонніх джерел.
rvnlord
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.