Bluzelle Lovelace уже выпущена

Запуск первой общедоступной тестовой сети Bluzelle

Я рад, как технический директор и соучредитель Bluzelle, объявить, что самый первый выпуск базы данных Bluzelle под названием Lovelace теперь доступен, доступен и готов к общедоступному использованию.

Напомним, наши ежемесячные обновления за последние шесть месяцев информировали публику о разработке Lovelace, включая выпуск бета-версии в конце апреля, совпадающий с нашим хакатоном в Ванкувере. Нашей целью было выпустить общедоступную тестовую версию Bluzelle, известную как Lovelace, к концу июня.

Лавлейс

Ниже приведены ключевые особенности, которые я с гордостью объявляю:

  • Поддержка смарт-контрактов Ethereum Solidity. Мы достигли и превзошли эту важную цель с бонусной возможностью выполнять полный CRUD, который включает операции записи.
  • Поддержка смарт-контрактов NEO C #. Мы также превысили эту важную цель, предоставив дополнительную возможность выполнять полный CRUD, включая операции записи.
  • Поддержка Javascript. У нас есть полная поддержка CRUD из приложений Javascript, будь то приложения node.js, веб-приложения или другие варианты использования Javascript.
  • Поддержка Python. Скрипты Python, будь то на веб-сервере или автономно, могут получить доступ к сети Bluzelle с полной поддержкой CRUD.
  • Общедоступная тестовая сеть в Интернете, открытая для публики для разработки с использованием любых доступных интерфейсов, включая WebSockets, а также нашего интерфейса командной строки. Это идеальное средство для создания драйверов и поддержки Bluzelle с других языков и платформ.
  • Поддержка запуска частных тестовых роев Bluzelle, в основном для использования командами разработчиков, работающих над интеграцией и совместной работой.

Чтобы начать общение, мы включаем в это объявление шаги по непосредственной работе с Lovelace, независимо от того, являетесь ли вы разработчиком смарт-контрактов, обычным разработчиком программного обеспечения или хотите запустить свою локальную частную тестовую сеть в соответствии с вышеуказанными достижениями.

Разработка смарт-контрактов Ethereum

В смарт-контрактах Ethereum Solidity ключевая идея состоит в том, чтобы написать смарт-контракт, который использует библиотеки Bluzelle для выполнения CRUD-запросов. Эти запросы направляются через Oracalize в рой, а затем ответы отправляются обратно через Oracalize в ваш смарт-контракт. Затем важно реализовать слушателя для обработки ответов. Этот асинхронный шаблон запроса-ответа - это то, как должно быть структурировано ваше приложение Ethereum dApp.

Убедитесь, что в вашем dApp импортируете файл bluzelle.sol из:

Https://github.com/bluzelle/bluzelle-sol/blob/master/contracts/BluzelleClient.sol

Обратите внимание, что смарт-контракт BluzelleClient всегда можно изменить, если пользователь желает иметь более надежное или более безопасное децентрализованное приложение.

BluzelleClient содержит все ожидаемые операции CRUD, необходимые для взаимодействия с роем Bluzelle. Один просто импортирует этот служебный смарт-контракт и вызывает любую из четырех функций: чтение (строковый ключ), удаление (строковый ключ), установка. (строковый ключ, строковые данные), обновление (строковый ключ, строковые данные) и создание (строковый ключ, строковые данные).

Файл SampleDapp.sol:

Https://github.com/bluzelle/bluzelle-sol/blob/master/contracts/SampleDapp.sol

демонстрирует, как использовать эти четыре функции для передачи данных с роем bluzelle:

/* Read the value from Bluzelle (this requires a small fee to pay Oracalize) */
Function getValue(string _key) onlyOwner public payable
{
     read(_key);
}
/* Set the value */
function set(string _key, string _value) onlyOwner public payable
{
     update(_key, _value);
}
/* Create new KVP */
function add(string _key, string _value) onlyOwner public payable
{
     create(_key, _value);
}
/* Remove a KVP */
function eliminate(string _key) onlyOwner public payable
{
    remove(_key);
}

Вы можете заметить, что в объявлении всех четырех функций есть ключевое слово payable. Это означает, что эти четыре функции требуют оплаты в ETH, чтобы серверы Oracalize выполняли запрос данных к рою Bluzelle.

Например, чтобы создать новую пару ключ-значение, просто выполните добавление (ключ, значение) в своем dApp и отправьте (например) 0,002 eth в транзакции. Если эта сумма по крайней мере равна требуемой комиссии Oracalize для такой транзакции, запрос будет отправлен в рой. Если сумма переведенного ETH на самом деле превышает требуемую комиссию Oracalize, то часть отправленной суммы принимается, а остальная часть возвращается обратно в ваш контракт dApp. Пользователь может просто выполнить функцию retrieveETH для извлечения неиспользованного ETH, как показано в примере.

После того, как операция CRUD выполнена и данные отправлены или запрошены от роя, нужно просто дождаться выполнения функции __callback Oracalize. В dApp можно изменить функцию __callback как угодно, чтобы данные обрабатывались должным образом.

Разработчик может решить, изменять ли состояние бизнес-логики в смарт-контракте или просто генерировать событие. Пожалуйста, смотрите SampleDapp.sol, SampleDappPublic.sol и Bluzelle.sol для реального такого примера:

Https://github.com/bluzelle/bluzelle-sol/tree/master/contracts

Заинтересованные разработчики могут бесплатно опробовать уже развернутое приложение dApp, доступное для широкой публики. Просто перейдите по ссылке:

Https://www.myetherwallet.com/#contracts

и выберите сеть Ropsten. Затем используйте адрес контракта:

0xeA6Fa8C8e59FFc5B0DffF1613B7D09e7617b9FD4

и следующий abi:

[{“constant”:true,”inputs”:[],”name”:”last_value_read”,”outputs”:[{“name”:””,”type”:”string”}],”payable”:false,”stateMutability”:”view”,”type”:”function”},{“constant”:false,”inputs”:[{“name”:”_uuid”,”type”:”string”}],”name”:”changeUUID”,”outputs”:[],”payable”:false,”stateMutability”:”nonpayable”,”type”:”function”},{“constant”:false,”inputs”:[{“name”:”myid”,”type”:”bytes32"},{“name”:”result”,”type”:”string”}],”name”:”__callback”,”outputs”:[],”payable”:false,”stateMutability”:”nonpayable”,”type”:”function”},{“constant”:false,”inputs”:[{“name”:”newOwner”,”type”:”address”}],”name”:”changeOwnership”,”outputs”:[],”payable”:false,”stateMutability”:”nonpayable”,”type”:”function”},{“constant”:false,”inputs”:[{“name”:”myid”,”type”:”bytes32"},{“name”:”result”,”type”:”string”},{“name”:”proof”,”type”:”bytes”}],”name”:”__callback”,”outputs”:[],”payable”:false,”stateMutability”:”nonpayable”,”type”:”function”},{“constant”:false,”inputs”:[{“name”:”_key”,”type”:”string”}],”name”:”eliminate”,”outputs”:[],”payable”:true,”stateMutability”:”payable”,”type”:”function”},{“constant”:true,”inputs”:[],”name”:”current_uuid”,”outputs”:[{“name”:””,”type”:”string”}],”payable”:false,”stateMutability”:”view”,”type”:”function”},{“constant”:true,”inputs”:[],”name”:”last_result_received”,”outputs”:[{“name”:””,”type”:”string”}],”payable”:false,”stateMutability”:”view”,”type”:”function”},{“constant”:true,”inputs”:[],”name”:”apiCreate”,”outputs”:[{“name”:””,”type”:”string”}],”payable”:false,”stateMutability”:”view”,”type”:”function”},{“constant”:true,”inputs”:[],”name”:”last_key_used”,”outputs”:[{“name”:””,”type”:”string”}],”payable”:false,”stateMutability”:”view”,”type”:”function”},{“constant”:true,”inputs”:[],”name”:”owner”,”outputs”:[{“name”:””,”type”:”address”}],”payable”:false,”stateMutability”:”view”,”type”:”function”},{“constant”:false,”inputs”:[{“name”:”_key”,”type”:”string”}],”name”:”getValue”,”outputs”:[],”payable”:true,”stateMutability”:”payable”,”type”:”function”},{“constant”:true,”inputs”:[],”name”:”keyExists”,”outputs”:[{“name”:””,”type”:”bool”}],”payable”:false,”stateMutability”:”view”,”type”:”function”},{“constant”:false,”inputs”:[{“name”:”_url”,”type”:”string”}],”name”:”changeURL”,”outputs”:[],”payable”:false,”stateMutability”:”nonpayable”,”type”:”function”},{“constant”:false,”inputs”:[],”name”:”retrieveETH”,”outputs”:[],”payable”:true,”stateMutability”:”payable”,”type”:”function”},{“constant”:true,”inputs”:[],”name”:”apiRemove”,”outputs”:[{“name”:””,”type”:”string”}],”payable”:false,”stateMutability”:”view”,”type”:”function”},{“constant”:false,”inputs”:[{“name”:”_key”,”type”:”string”},{“name”:”_value”,”type”:”string”}],”name”:”set”,”outputs”:[],”payable”:true,”stateMutability”:”payable”,”type”:”function”},{“constant”:false,”inputs”:[{“name”:”_key”,”type”:”string”},{“name”:”_value”,”type”:”string”}],”name”:”add”,”outputs”:[],”payable”:true,”stateMutability”:”payable”,”type”:”function”},{“constant”:true,”inputs”:[],”name”:”apiRead”,”outputs”:[{“name”:””,”type”:”string”}],”payable”:false,”stateMutability”:”view”,”type”:”function”},{“constant”:true,”inputs”:[],”name”:”apiUpdate”,”outputs”:[{“name”:””,”type”:”string”}],”payable”:false,”stateMutability”:”view”,”type”:”function”},{“inputs”:[{“name”:”_uuid”,”type”:”string”}],”payable”:false,”stateMutability”:”nonpayable”,”type”:”constructor”},{“anonymous”:false,”inputs”:[{“indexed”:true,”name”:”prevOwner”,”type”:”address”},{“indexed”:true,”name”:”newOwner”,”type”:”address”}],”name”:”OwnershipChanged”,”type”:”event”},{“anonymous”:false,”inputs”:[{“indexed”:false,”name”:”_action”,”type”:”string”},{“indexed”:false,”name”:”_key”,”type”:”string”},{“indexed”:false,”name”:”_response”,”type”:”bool”},{“indexed”:false,”name”:”_timestamp”,”type”:”uint256"}],”name”:”swarm_response”,”type”:”event”},{“anonymous”:false,”inputs”:[{“indexed”:false,”name”:”_key”,”type”:”string”},{“indexed”:false,”name”:”_value”,”type”:”string”},{“indexed”:false,”name”:”_timestamp”,”type”:”uint256"}],”name”:”swarm_read”,”type”:”event”}]

Разработка Javascript

Разработка Javascript может принимать две общие формы: приложения node.js, работающие на стороне сервера, и веб-приложения, работающие в браузере, оба из которых могут напрямую взаимодействовать с роем Bluzelle через библиотеки JS Bluzelle. Идея здесь состоит в том, чтобы загрузить и обратиться к библиотекам JS, а затем сделать правильные запросы для подключения к рою, а затем дождаться асинхронного ответа.

Использовать Bluzelle в приложении JavaScript просто.

Запустить:

npm install bluzelle

в корне вашего проекта, затем включите bluzelle с помощью:

const bluzelle = require(‘bluzelle’);

Чтобы подключиться к серверу, укажите хост и порт узла Bluzelle, а также укажите уникальный uuid для своей базы данных.

Функции API Bluzelle реализуют общие функции базы данных для пар ключ-значение, такие как создание и чтение. Полная документация по API доступна по адресу:

Https://bluzelle.github.io/api/

Жизненно важно разработать асинхронный шаблон, который должным образом ожидает и обрабатывает ответ на запросы до того, как будут сделаны последующие зависимые запросы. Обычно это достигается за счет использования обещаний JavaScript (MDN, Разработчики Google). Убедитесь, что зависимые запросы обрабатываются с помощью синтаксиса .then (), а асинхронные ошибки выявляются и обрабатываются.

Ниже приведен пример приложения, использующего Bluzelle JavaScript API.

const bluzelle = require(‘bluzelle’);
bluzelle.connect(‘ws://testnet.bluzelle.com:51010’,
‘45498479–2447–47a6–8c36-efa5d251a283’);
bluzelle.create(‘myKey’, ‘myValue’).then(() =>
{
     bluzelle.read(‘myKey’).then(value =>
     {
          console.log(value); // ‘myValue’
     }).catch(e => console.log(e.message));
}).catch(e => console.log(e.message));

Изменения протокола Bluzelle Wire

Для выпуска Lovelace мы изменили наш протокол проводки с протокола на основе JSON на использование протокольных буферов Google (protobuf).

Буферы протокола - это не зависящий от языка и платформы, расширяемый механизм Google для сериализации структурированных данных (например, XML), но меньше, быстрее и проще. Вы определяете, как вы хотите, чтобы ваши данные были структурированы один раз, а затем вы можете использовать специальный сгенерированный исходный код, чтобы легко записывать и считывать структурированные данные в различные потоки данных и из них, используя множество языков.

Поскольку проводной протокол Bluzelle swarmDB основан на protobuf, вам необходимо установить компилятор protobuf, чтобы использовать указанные ниже функции.

Ubuntu

$ apt-get install protobuf-compile

MacOS

$ brew install protobuf

(обратите внимание на инструкции и вывод… если у вас более старая версия protoc или protobuf, вам может потребоваться запустить «brew link - overwrite protobuf»)

Разработка без привязки к языку и платформе

Возможно, наиболее важной областью разработки для экосистемы Bluzelle является возможность создавать драйверы и интеграцию непосредственно с роем Bluzelle, где результатом является потенциальный доступ к рою с нового языка программирования или платформы или где разработчику требуется очень мало - ровный прямой доступ к рою. Именно здесь проявляются низкоуровневые интерфейсы Bluzelle с доступностью API WebSockets.

Можно установить соединение WebSocket вручную, используя тот же хост и порт, что и в других примерах. Протокол предназначен для отправки сообщения запроса в строковой кодировке и получения последовательного ответа. После получения ответа соединение WebSocket закрывается. Для последующих запросов необходимо установить новое соединение.

Полную документацию по API WebSocket можно найти по следующей ссылке:

Https://bluzelle.github.io/api/#websocket-api

Убедитесь, что вы установили protofbuf, как описано в разделе «Изменения протокола Bluzelle Wire» выше.

Python с использованием protobufs

Сначала вам нужно клонировать репозиторий swarmdb:

$ git clone https://github.com/bluzelle/swarmdb

В каталоге pyBluzelle запустите (эта команда не является подробной, и успех может означать отсутствие фактического вывода):

$ protoc — python_out=./ — proto_path=swarmdb/proto bluzelle.proto database.proto audit.proto

Настройте Python virtualenv для запуска пакета в:

$ sudo pip install virualenv
$ virtualenv crud-app
$ source crud-app/bin/activate
$ sudo pip install protobuf websocket-client

Пример чтения ключа из роя на Python:

#!/usr/bin/env python2.7
# Example of reading a keys value from the swarm
# https://bluzelle.github.io/api/#websocket-api
import websocket
import json
import base64
import bluzelle_pb2
import database_pb2
# Read a key
msg = bluzelle_pb2.bzn_msg()
msg.db.header.db_uuid = “b3fb1002–3702–4937–8a08-bfb53b0332c8”
msg.db.read.key = “release”
request = {}
request[“bzn-api”] = “database”;
request[“msg”] = base64.b64encode(msg.SerializeToString())
ws = websocket.create_connection(“ws://testnet.bluzelle.com:51010”)
ws.send(json.dumps(request))
response = database_pb2.database_response()
response.ParseFromString(ws.recv())
print(“Response: \n{}”.format(response))
ws.close()
$ python hello.py
Output:
Response:
header {
     db_uuid: “b3fb1002–3702–4937–8a08-bfb53b0332c8”
}
resp {
     value: “lovelace”
}

HTTP API

В качестве быстрых вспомогательных функций вы также можете ссылаться на раннюю версию HTTP API, которая обеспечивает прямой доступ к рою для выполнения запросов CRUD. Обратите внимание, что этот API все еще дорабатывается и находится в стадии разработки для Бернулли.

# Создать

$ curl — data “lovelace” -L http://testnet.bluzelle.com:8080/create/b3fb1002-3702-4937-8a08-bfb53b0332c8/release
ack

# Прочитано

$ curl -L http://testnet.bluzelle.com:8080/read/b3fb1002-3702-4937-8a08-bfb53b0332c8/release
acklovelace

# Обновление

$ curl — data “ontime!” -L http://testnet.bluzelle.com:8080/update/b3fb1002-3702-4937-8a08-bfb53b0332c8/release
ack

# Удалить

$ curl — data “-” -L http://testnet.bluzelle.com:8080/delete/b3fb1002-3702-4937-8a08-bfb53b0332c8/release
ack

Разработка на Python

Разработка на Python проста и требует, чтобы пользователь включил файл библиотеки Python Bluzelle. Идея здесь состоит в том, чтобы загрузить и обратиться к библиотеке Python, а затем сделать правильные запросы для подключения к рою и дождаться ответа. Настройте Python virtualenv для запуска пакета в:

$ sudo pip install virualenv
$ virtualenv crud-app
$ source crud-app/bin/activate

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

(crud-app)$

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

$ git clone https://www.github.com/bluzelle/pyBluzelle
$ cd pyBluzelle
$ git submodule update — init — recursive

Поскольку проводной протокол Bluzelle swarmDB основан на protobuf, вам необходимо установить компилятор protobuf. Убедитесь, что вы установили protofbuf, как описано в разделе «Изменения протокола Bluzelle Wire» выше.

Установив компилятор protobuf, вы можете скомпилировать наш IDL protobuf. В каталоге pyBluzelle запустите (эта команда не является подробной, и успех может означать отсутствие фактического вывода):

$ protoc — python_out=./pyBluzelle/proto — proto_path=proto/proto bluzelle.proto database.proto audit.proto

С дополнительными скомпилированными файлами protobuf python теперь вы можете установить модуль python. Запустить:

$ pip install -r requirements.txt
$ pip install .

Это дает возможность программно взаимодействовать с базой данных как часть сервера или клиентского приложения Python или с помощью инструмента командной строки crud. Давайте рассмотрим пример приложения для подключения в консоли Python:

$ python
>>> import pyBluzelle
>>> b = pyBluzelle.create_connection(“testnet.bluzelle.com”, 51010, “45498479–2447–47a6–8c36-efa5d251a283”)
>>> b.create(“myKey”,”myValue”)
>>> b.read(“myKey”)
‘myValue’

Запуск собственной частной тестовой сети

Во многих случаях для вас наиболее оптимальным способом разработки и работы с роем Bluzelle является запуск собственного роя, изолированного и в пределах ваших собственных машин или сетей. Запуск собственной тестовой сети довольно прост и по-прежнему дает вам доступ ко всем коннекторам, библиотекам и другим инструментам, доступным в общедоступной тестовой сети. Чтобы облегчить развертывание частных тестовых роев, Bluzelle реализовал сценарий быстрого развертывания docker-compose, который автоматически инициализирует и настраивает рой из трех узлов. Начните с клонирования репозитория docker-swarm-deploy:

$ git clone https://github.com/bluzelle/docker-swarm-deploy
$ cd docker-swarm-deploy

Теперь вам нужно настроить локальную среду для запуска роя. Найдите IP-адрес локального интерфейса, используя следующую команду:

$ ifconfig en1
en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
 inet6 fe80::1837:c97f:df86:c36f%en1 prefixlen 64 secured scopeid 0xa
 →>inet 192.168.0.34 netmask 0xffffff00 broadcast 192.168.0.255
 nd6 options=201<PERFORMNUD,DAD>
 media: autoselect
 status: active

В приведенном выше случае IP-адрес локального интерфейса 192.168.0.34. Если вы не видите inet ‹ipaddress›, запустите ifconfig и вручную найдите свой локальный IP-адрес. Ваш результат может отличаться в зависимости от операционной системы. Пример здесь основан на MacOS.

Измените файл .env в корне репозитория docker-swarm-deploy, чтобы включить IP-адрес локального интерфейса.

…
LOCAL_IP=192.168.0.34
…

Затем вам нужно создать учетную запись Etherscan. Перейдите на https://etherscan.io/register и создайте учетную запись. Создайте КЛЮЧ API Etherscan, щелкнув Разработчики - ›КЛЮЧИ API, и еще раз добавьте его в свой файл .env в корне docker-swarm-deploy.

…
ETHEREUM_IO_API_TOKEN=***********************
…
Finally, modify the .env file to include an Ethereum mainnet address that contains tokens or use the sample address provided below.
…
ETHEREUM_ADDRESS=0xddbd2b932c763ba5b1b7ae3b362eac3e8d40121a
…

Вот и все. Готово. Все, что вам нужно сделать, это вызвать рой с помощью:

$ docker-compose up

Теперь вы можете взаимодействовать с базой данных на портах 51010–51012.

Бернулли

Не обращая внимания на Лавлейс, мы рады перейти к разработке Бернулли, следующего этапа в дорожной карте Bluzelle DB. Названный в честь Даниэля Бернулли, я выбрал это имя, чтобы признать огромную ценность принципа Бернулли. Это фундаментальный принцип конструкции крыла самолета, который делает возможной авиацию.

Bernoulli будет иметь несколько мощных функций, включая, помимо прочего, следующие:

  • Децентрализация обнаружения узлов роя Bluzelle с помощью смарт-контракта Ethereum. Этот смарт-контракт действует как точка входа для потребителей БД для подключения к БД Bluzelle, не имея предварительных или кэшированных сведений о местонахождении узлов Bluzelle. Это важный шаг в истинной децентрализации базы данных Bluzelle с точки зрения начальной загрузки.
  • RESTful HTTP API для выполнения прямых запросов к рой через curl и т. Д.
  • Будет выпущен клиент CRUD с графическим интерфейсом, который может использоваться широкой публикой. Он будет иметь интерфейсы как в веб-браузере, так и в собственных версиях (MacOS, Windows, Linux и т. полный документ JSON. В «Лавлейс» мы покажем ранние концепции этого CRUD-клиента, ограниченного пока для частного использования.
  • Эмулятор Bluzelle будет выпущен для широкой публики, и разработчики смогут эмулировать рой и создавать программное обеспечение непосредственно против эмулятора без необходимости запускать рой тестовой сети. Это мощная функция, которая упрощает процесс разработки и упрощает разработчикам работу с Bluzelle DB.

Сообщество открытого исходного кода и CLA

Еще одна важная разработка, совпадающая с выпуском Lovelace, - это Bluzelle CLA, также известная как лицензионное соглашение участника. С CLA мы можем официально начать принимать взносы от членов сообщества открытого исходного кода, которые согласны с условиями CLA. Эти люди становятся ценными участниками экосистемы Bluzelle и могут создавать и утверждать запросы на вытягивание в своих проектах. Например, реализации PHP и Ruby, выпущенные вместе с Bluzelle, разрабатываются членами сообщества с открытым исходным кодом под лицензией CLA. Базовый демон лицензируется по AGPLv3, в то время как библиотеки используют разрешающие лицензии (например, MIT), которые поощряют разработку приложений.

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

Наш канал для разработчиков переехал в Gitter. Оставайтесь с нами на связи!