Запись и чтение данных в блокчейне биткоина

  • Tutorial
Записать в блокчейн биткоина можно не только финансовые операции, но и практически любые данные. Записанные в блокчейн биткоина данные становятся общедоступными и их практически невозможно удалить или изменить. Эту особенность можно использовать например для создания децентрализованных сайтов, которые не поддаются никакой блокировке.

С помощью библиотеки blockchaindata-lib запись и чтение данных в блокчейне можно организовать буквально в несколько строк кода.

Инструменты


Библиотека blockchaindata-lib написана на node.js. Исходный код с примерами доступен на гитхаб github.com/3s3s/blockchaindata-lib. Чтобы добавить библиотеку в ваш проект, достаточно выполнить в консоли одну команду

npm install blockchaindata-lib

Для работы с блокчейном, необходимо настроить RPC доступ к кошельку биткоина или совместимого с биткоином форка (Litecoin, Dogecoin и т.п.). По умолчанию blockchaindata-lib будет пытаться обращаться к серверу RPC по следующим реквизитам:

адрес: http://127.0.0.1:18332
пользователь: rpc_btc_test
пароль: rpc_btc_password_test

Умолчания можно изменить библиотечной функцией

updateNetwork(url, user, password) 

Таким образом, чтобы работать с библиотекой, первым делом нужно запустить тестовый кошелек биткоина:

  1. Скачать кошелек биткоина (или совместимого форка.)
  2. Создать файл ~/.bitcoin/bitcoin.conf (или в windows %APPDATA%/Bitcoin/bitcoin.conf)
  3. В файле bitcoin.conf записать следующие настройки

    
    testnet=1
    server=1
    rpcbind=127.0.0.1
    rpcallowip=127.0.0.1
    rpcuser=rpc_btc_test
    rpcpassword=rpc_btc_password_test
    txindex=1

  4. Сохранить изменения в bitcoin.conf и запустить bitcoind (или в windows bitcoin-qt.exe)
  5. Дождаться синхронизации блокчейна

С указанными выше настройками, кошелек запустится в тестовой сети биткоина.

Запись данных


В биткоине запрещены транзакции в которых нет никаких трат. Поэтому перед тем, как что-то записать в блокчейн биткоина, обязательно придется пополнить свой кошелек. Биткоины для тестовой сети можно получить бесплатно, если поискать в гугле что-то вроде «bitcoin testnet faucet». Когда кошелек пополнен, можно наконец записывать данные.

Библиотека имеет несколько функций для записи данных:

SaveTextToBlockchain( dataString )
SaveJSONToBlockchain( objectJSON )
SaveFileToBlockchain( data )

В принципе, что эти функции делают — понятно из названия. Результат выполнения функций — объект
{result: <true | false>, message: <string>, txid: <string>}


Рассмотрим пример использования:

'use strict';

const blockchaindata = require('blockchaindata-lib')

async function test1()
{
    try {
        //Сохраняем текст в блокчейне        
        const ret1 = await blockchaindata.SaveTextToBlockchain("Этот текст будет сохранен в блокчейне");
        if (ret1.result == false) throw new Error("SaveTextToBlockchain failed, message: "+ret1.message);

        console.log("SaveTextToBlockchain success! txid="+ret1.txid+"\n--------------------------")
    }
    catch (e) {
        console.log(e.message)
    }
}

test1();

Если этот код выполнится без ошибок, то в консоль будет выведен хэш транзакции. По этому хэшу можно будет прочитать данные.

Чтение данных


Для того, чтобы читать записанные ранее в блокчейн данные, вам необходимо знать только хэш транзакции. Кошелек при этом может быть пустой, то есть если хотите только читать данные, то пополнять кошелек не обязательно.

Пример кода


'use strict';

const blockchaindata = require('blockchaindata-lib');

async function test2()
{
    //Читаем данные из блокчейна
    try {
        const savedObject = await blockchaindata.GetObjectFromBlockchain("8af6633160b982a0b0b4d4962ad28e0d5b3dd97e05e27cc2dd64ec0c56820df5");
        if (savedObject.type == 'error') throw new Error(savedObject.message)
            
        if (savedObject.type == 'text')
            console.log(Buffer.from(savedObject.base64, 'base64').toString('utf8'));
        else
            console.log(savedObject.base64);
    }
    catch(e) {
        console.log(e.message)
    }
}

test2();


Если этот код сработает без ошибок, то в консоль будет выдан текст html страницы, которую я ранее уже сохранил в блокчейне.

Где применить?


В блокчейне можно например сохранить статический сайт. Этот сайт практически невозможно будет удалить или каким-то образом заблокировать. Однако чтобы читать такой сайт, нужен будет дополнительный софт: новый браузер или расширение для браузера.

Расширение для браузера это самое простое решение. Пример такого расширения можно посмотреть здесь github.com/3s3s/blockchaindata

Скачать и установить это расширение для Firefox можно здесь: yadi.sk/d/a3xM9BCepP4nBw
После установки Firefox будет перехватывать и обрабатывать ссылки на сайты в формате
http://tbtc/<txid>


Например такая ссылка будет работать http://tbtc/8af6633160b982a0b0b4d4962ad28e0d5b3dd97e05e27cc2dd64ec0c56820df5

Эффективность


Библиотека blockchaindata-lib сжимает данные перед помещением их в блокчейн с помощью алгоритма deflate, поэтому данный метод особенно эффективен для записи текстовых документов. В ходе тестирования мне удавалось записать в блокчейн до 70 кб сжатых данных. Хотя ограничений на размер входящих данных нет, ошибки на больших массивах данных появляются из-за внутренней реализации кода биткоина.

При записи данных в блокчейн, нужно так же учитывать финансовую составляющую. Чтение и запись данных в тестовой сети биткоина с помощью библиотеки blockchaindata-lib это просто и бесплатно. Однако если вы захотите писать данные в рабочую сеть биткоина, то вам нужно будет учесть ненулевую цену биткоина.
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 13

    0

    Вот уж издевательство, писать данные килобайтами, а в мейнет еще и очень дорогое.
    Этой фиче давно уже придумали применение в виде таймстемпинга хешей.
    Раньше чтобы зафиксировать время документа, его почтой себе отправляли и не снимали печать, а теперь вот есть шикарный способ получить доказательства, что файл существовал на момент создания блока с нужной транзакцией.

      +1
      Это имеет смысл, если сохраняется документ о покупки недвижимости, или нечто похожее.
      К тому-же нет явного требования использовать существующую сеть, можно и нужно создавать новую — заточенную именно под эти операции.
      0
      Я могу ошибаться, но IPFS тоже позволяет децентрализованно раздавать документы, которые нельзя изменить. Зачем нагружать блокчейн биткойна кучей мусора? Я слышал, что он уже и так не на каждый винчестер влезет.
        0
        Ну да, для хранения медийного контента технология не подходит. Но текстовых данных так сохранить можно довольно много. Насколько я понимаю, в IPFS данные хранятся только у тех, кто их скачивал и значит в принципе могут оказаться и недоступны. В отличии от IPFS, из блокчейна данные точно никуда не пропадут и будут доступны до тех пор, пока в сети есть хоть один узел.
          0

          Каждый пользователь скачивает себе всю историю блокчейна или там это как-то выборочно? Если все владельцы сайтов начнут засылать их в блокчейн, его это не похоронит? Насколько этот способ применим для всех сразу? Это же как хранить у себя весь интернет.

            0
            Чтобы читать произвольную информацию из блокчейна, пользователю нужно либо иметь у себя весь блокчейн локально, либо где-то на сервере к которому нужно настроить доступ по RPC.
            Арихитектурно, биткоин не сможет хранить слишком много. Если в блокчейн писать одни только данные и ничего больше, то за сутки туда можно записать не более 300 мегабайт.
            То есть да, весь интернет в биткоин не запихнуть. Однако вполне подойдет для вечного и надежного хранения в неизменном виде каких-либо документов (медицинские карты, договоры купли-продажи и т.п).

              0
              Мне кажется, если такие методы, которые иногда предлагаются в духе «давайте начнём хранить X в биткойне», если приобретут мировое распространение, замусорят его так, что им будет очень сложно пользоваться. Я загуглил, сейчас блокчейн уже занимает 250 ГБ. Это же попытка хранить какие-то свои данные у пользователей по всему миру, которые об этом не просили, которые согласились хранить данные о платежах, чтобы пользоваться биткойном. Это как прийти к соседу и попросить его подержать на балконе твой диван, а то у него застеклённый, а у тебя нет.
                0
                Биткоин это полигон для испытаний. Описанную технологию можно без всяких изменений использовать в любом совместимом с биткоином форке.
                  0
                  Это понятно, но может быть примеры кода тогда давать на каком-то собственном блокчейне, чтобы не засорять продакшен такими тестовыми проектами?
                    0
                    Дак в примерах нигде нет ничего специфичного для биткоина. Я тестировал на тестнете, но можно и на догах и на лайтах и на чем-то собственном. Просто я сильно подозреваю, что если бы на хабре начал писать про собственный никому неизвестный форк, то вызвал бы подозрение в пиаре ))
          0
          Если интересно, тема блокчейна серьезно прорабатывается FinTech компаниями в банковском кредитовании.

          Проблема:
          Дело в том, что при оформлении кредита участвует масса компаний и они генерят массу документов. В документы вносятся правки и участники могут работать с разными версиями и генерить разные результаты, которые затем сливаются в информацию о кредите и содержат дефекты.
          Во избежание этой путанницы есть масса софта, но за 14 лет борьбы с этой проблемой (контроль качества банковских кредитов) я не встречал надежного решения. Прикручивают OCR для извлечения и авто-сравнения данных, создают rules, анализируют вручную.

          Решение:
          Блокчейн может эту проблему частично решить — неизменяемое хранилище данных о кредите течении его жизненного цикла позволяет фиксировать все правки и с применением smart contracts реагировать согласно законов.

          Может не хранить все документы и может не в Public, но некоторые решения на базе blockchain продаются, некоторые в разработках.
            0
            Шикарно, но биткоин для такого дороговат.
            Вот сделать бы такое на doge
              0
              RPC биткоина и догов совместим. Так что можете смело пробовать для doge

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое