BitDB для метаданных блока биткойнов

Сегодня я анонсирую Meta, BitDB для запроса метаданных блока.



Как и Chronos, Meta нарушает многие правила BitDB.

Фактически, он полностью отличается от схемы объекта транзакции BitDB. Вот как выглядит каждый объект:

Тем не менее, это все еще BitDB. Вы можете использовать тот же Bitquery для запроса Meta, как и в любом другом BitDB.

Еще один примечательный момент: Meta - это первая BitDB, которая просканирует весь путь от блока Genesis, что означает, что вы можете запрашивать весь набор метаданных блокчейна, а не с определенной высоты блока (в настоящее время Узлы Genesis и Babel начинают сканирование с высоты 525470, а узел Chronos даже не имеет этого понятия, он имеет политику 24-часового скользящего окна эфемерность)

Функции

Вот основные моменты:

  1. Полнота: сканирование выполняется полностью от Genesis Block.
  2. Нет транзакций. Просто блокируйте метаданные: Meta буквально представляет собой базу данных блочных метаданных. Вместо того, чтобы каждая запись была транзакцией Биткойн, мета-записи представляют собой метаданные блока для каждого блока. Если вы ищете базу данных для запросов транзакций, используйте Genesis (полный узел транзакции), Babel (световой узел только данные) или Chronos (временный эфемерный узел).
  3. Чрезвычайно экономичный: поскольку в ней хранятся ТОЛЬКО метаданные блока, вся база данных занимает всего около 1,2 ГБ, что означает, что она уместится в памяти любого современного компьютера, и она будет работать быстро даже на любом некачественном компьютере.
  4. Виртуальный атрибут: как и Chronos, Meta добавила несколько виртуальных атрибутов: chainworkdecimal и timeago. timeago должно быть очевидным. Это динамически вычисляемое значение, полученное из атрибута time. Атрибут chainworkdecimal - это еще один динамический атрибут, полученный во время выполнения из chainwork. Атрибут chainwork хранится в шестнадцатеричном формате, поэтому полезно иметь дополнительный атрибут, который отображает данные в десятичном формате.

Вот как выглядит его проводник (обратите внимание на атрибуты):

Как и Chronos, Meta становится мощной при использовании вместе с другими BitDB.

Как и другие новые узлы BitDB, выпущенные на этой неделе, у этого есть отдельная конечная точка API:

https://meta.bitdb.network/query/18uQBWMhHgiieR6FnQtXDDba8T97LVu5uH

Это означает, что ваши запросы будут выглядеть так:

https://meta.bitdb.network/query/18uQBWMhHgiieR6FnQtXDDba8T97LVu5uH/[BASE64_ENCODED_QUERY]

Теперь давайте посмотрим, как работают запросы. Но сначала, если вы не знакомы с Bitquery, я рекомендую ознакомиться с документацией BitDB:



Демо

1. Получите 10 блоков от Genesis

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

{
  "v": 3,
  "q": {
    "find": {
      "height": {
        "$lte": 3
      }
    }
  }
}

Мы получаем следующий ответ (последний элемент - это блок Бытия, высотой 1 и «10 лет назад»):

2. Получите рут Меркла для блока

Зная хэш блока или высоту блока, вы можете узнать его корень Меркла.

Давайте найдем корень Меркла для блока Бытия:

{
  "v": 3,
  "q": {
    "find": {
      "height": 1
    },
    "project": {
      "merkleroot": 1
    }
  }
}

И вот что мы получаем:

Если вы новичок в этом, вы можете узнать, как работает этот язык запросов:



Учебное пособие: диаграмма истории сложности биткойнов в 42 строках

Создавать приложения с помощью BitDB настолько просто, что для создания приложения с диаграммой истории сложности биткойнов требуется всего 42 строки кода JavaScript + HTML. Вот что мы будем строить:

Вы можете проверить это здесь: https://unwriter.github.io/difficulty/

А вот код. Всего 42 строки:

<html>
<head>
<style>
  body { margin: 0; }
  #chart { width: 100%; height: 100%; }
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.min.js"></script>
<script>
document.addEventListener("DOMContentLoaded", function(e) {
  var query = {
    "v": 3,
    "q": {
      "find": { "height": { "$gte": 556000 } },
      "limit": 10000,
      "project": { "difficulty": 1, "height": 1 }
    }
  }
  var endpoint = "https://block.bitdb.network/q/18uQBWMhHgiieR6FnQtXDDba8T97LVu5uH/"
  var encoded = btoa(JSON.stringify(query))
  var url = endpoint + encoded
  var header = { headers: { key: "173cVHXFHJ8GH2VwYZFgPGG1BpTsvfQVt8" } }
  fetch(url, header)
    .then(function(r) {
      return r.json()
    })
    .then(function(r) {
      var ctx = document.getElementById("chart").getContext('2d');
      var diff = r.block.map(function(b) { return b.difficulty }).reverse()
      var heights = r.block.map(function(b) { return b.height }).reverse()
      var chart = new Chart(ctx, {
        type: 'line',
        data: { labels: heights, datasets: [{label: 'bitcoin difficulty', data: diff }] },
        options: { animation: false }
      })
    })
})
</script>
</head>
<body>
  <canvas id="chart"></canvas>
</body>
</html>

Давайте быстро рассмотрим код, чтобы понять, как он работает.

Пошаговое объяснение

Первая и самая важная часть - это запрос:

var query = {
  "v": 3,
  "q": {
    "find": { "height": { "$gte": 556000 } },
    "limit": 10000,
    "project": { "difficulty": 1, "height": 1 }
  }
}

В основном он использует Bitquery для создания полезной нагрузки запроса. Запрос говорит:

  • Получите 10000 блоков, высота которых больше или равна 556000
  • Верните их атрибуты сложности и высоты.

Затем вам нужно сделать запрос к узлу Meta BitDB. Чтобы сделать запрос к BitDB, вам необходимо превратить ваш запрос в строку в кодировке base64, как показано ниже:

var endpoint = "https://block.bitdb.network/q/18uQBWMhHgiieR6FnQtXDDba8T97LVu5uH/"
var encoded = btoa(JSON.stringify(query))
var url = endpoint + encoded

Затем он делает запрос GET к URL-адресу с ключом API, который вы получаете из панели управления bitdb по адресу https://bitdb.network/v3/dashboard.

var header = { headers: { key: "173cVHXFHJ8GH2VwYZFgPGG1BpTsvfQVt8" } }
fetch(url, header)

Остальная часть кода просто получает результат от BitDB и рисует диаграмму с использованием библиотеки chart.js, поэтому я остановлюсь на этом. Просто скопируйте и вставьте приведенный выше полный код и попробуйте его на своем компьютере, он должен работать.

Или вы можете проверить репозиторий Github:



Заключение

Мета - это новый тип BitDB, который дает вам доступ к метаданным блоков Биткойна.

Впервые схема полностью отличается от других узлов BitDB, потому что Meta сканирует метаданные блока вместо транзакций. Однако вы по-прежнему можете волшебным образом использовать тот же битовый запрос, который используется во всех других BitDB (Genesis, Babel, Chronos) для взаимодействия с Meta.

Кроме того, вы можете смешивать и сопоставлять Meta с другими BitDB для создания сложных приложений.

Это разделение труда в действии.

Вы можете попробовать Meta Bitdb explorer по адресу:



А если вы новичок, вы, вероятно, сначала захотите узнать, как работает оригинальный Genesis Bitdb:



Также подписывайтесь на меня в Твиттере за обновлениями BitDB:



Наконец, если у вас есть какие-либо вопросы, присоединяйтесь к чату, чтобы задавать вопросы и встречаться с другими разработчиками биткойнов.