Запись и чтение данных в блокчейне биткоина
Записать в блокчейн биткоина можно не только финансовые операции, но и практически любые данные. Записанные в блокчейн биткоина данные становятся общедоступными и их практически невозможно удалить или изменить. Эту особенность можно использовать например для создания децентрализованных сайтов, которые не поддаются никакой блокировке.
С помощью библиотеки 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)
Таким образом, чтобы работать с библиотекой, первым делом нужно запустить тестовый кошелек биткоина:
- Скачать кошелек биткоина (или совместимого форка.)
- Создать файл ~/.bitcoin/bitcoin.conf (или в windows %APPDATA%/Bitcoin/bitcoin.conf)
- В файле 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
- Сохранить изменения в bitcoin.conf и запустить bitcoind (или в windows bitcoin-qt.exe)
- Дождаться синхронизации блокчейна
С указанными выше настройками, кошелек запустится в тестовой сети биткоина.
Запись данных
В биткоине запрещены транзакции в которых нет никаких трат. Поэтому перед тем, как что-то записать в блокчейн биткоина, обязательно придется пополнить свой кошелек. Биткоины для тестовой сети можно получить бесплатно, если поискать в гугле что-то вроде «bitcoin testnet faucet». Когда кошелек пополнен, можно наконец записывать данные.
Библиотека имеет несколько функций для записи данных:
SaveTextToBlockchain( dataString ) SaveJSONToBlockchain( objectJSON ) SaveFileToBlockchain( data )
В принципе, что эти функции делают — понятно из названия. Результат выполнения функций — объект
{result:, message: , txid: }
Рассмотрим пример использования:
'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/
Например такая ссылка будет работать http://tbtc/8af6633160b982a0b0b4d4962ad28e0d5b3dd97e05e27cc2dd64ec0c56820df5
Эффективность
Библиотека blockchaindata-lib сжимает данные перед помещением их в блокчейн с помощью алгоритма deflate, поэтому данный метод особенно эффективен для записи текстовых документов. В ходе тестирования мне удавалось записать в блокчейн до 70 кб сжатых данных. Хотя ограничений на размер входящих данных нет, ошибки на больших массивах данных появляются из-за внутренней реализации кода биткоина.
При записи данных в блокчейн, нужно так же учитывать финансовую составляющую. Чтение и запись данных в тестовой сети биткоина с помощью библиотеки blockchaindata-lib это просто и бесплатно. Однако если вы захотите писать данные в рабочую сеть биткоина, то вам нужно будет учесть ненулевую цену биткоина.