Согласно Википедии, блокчейн - это:

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

Звучит неплохо, но как это работает?

Чтобы проиллюстрировать блокчейн, мы будем использовать интерфейс командной строки с открытым исходным кодом под названием Blockchain CLI.

Я также создал версию этого для браузера.

Установка версии интерфейса командной строки

Если вы еще этого не сделали, установите Node.js.

Затем запустите в своем терминале следующее:

# Clone this repository
$ git clone https://github.com/seanseany/blockchain-cli

# Go into the repository
$ cd blockchain-cli

# Install dependencies
$ npm install

# Run the app
$ npm start

Вы должны увидеть 👋 Welcome to Blockchain CLI!и blockchain → приглашение, готовое к выполнению команд.

Как выглядит блок?

Чтобы увидеть текущий блокчейн, введите blockchain или bc в командную строку. Вы должны увидеть блок, как на изображении ниже.

  • Индекс (№ блока): Какой это блок? (У блока Genesis индекс 0)
  • Хеш: действительна ли блокировка?
  • Предыдущий хеш: действителен ли предыдущий блок?
  • Отметка времени: когда был добавлен блок?
  • Данные: Какая информация хранится в блоке?
  • Одноразовый номер: Сколько итераций мы прошли, прежде чем нашли действительный блок?

Блок Генезиса

Каждый блокчейн начинается с the🏆 Genesis Block. Как вы увидите позже, каждый блок в цепочке блоков зависит от предыдущего блока. Итак, блок Genesis нужен для майнинга нашего первого блока.

Что происходит при добыче нового блока?

Давайте займемся добычей нашего первого блока. Введите mine freeCodeCamp♥︎ в подсказку.

Блокчейн просматривает последний блок в блокчейне на предмет индекса и предыдущего хэша. В этом случае блок Genesis - это самый последний блок.

  • Индекс: o + 1 = 1
  • Предыдущий хеш: 0000018035a828da0…
  • Отметка времени: при добавлении блока.
  • Данные: freeCodeCamp❤
  • Хеш: ??
  • Одноразовый номер: ??

Как рассчитывается хеш?

хеш-значение - это числовое значение фиксированной длины, которое однозначно идентифицирует данные.

Хэш вычисляется, принимая в качестве входных данных индекс, предыдущий хэш блока, временную метку, данные блока и одноразовый номер.

CryptoJS.SHA256(index + previousHash + timestamp + data + nonce)

Алгоритм SHA256 вычислит уникальный хеш с учетом этих входных данных. Одни и те же входные данные всегда будут возвращать один и тот же хэш.

Вы заметили четыре ведущих нуля в хэше блока?

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

function isValidHashDifficulty(hash, difficulty) {
  for (var i = 0, b = hash.length; i < b; i ++) {
      if (hash[i] !== '0') {
          break;
      }
  }
  return i >= difficulty;
}

Это также известно как система Proof-of-Work.

Что за нонс?

Одноразовый номер - это число, используемое для поиска действительного хеша.

let nonce = 0;
let hash;
let input;
while(!isValidHashDifficulty(hash)) {     
  nonce = nonce + 1;
  input = index + previousHash + timestamp + data + nonce;
  hash = CryptoJS.SHA256(input)
}

Одноразовый номер повторяется до тех пор, пока хеш не станет действительным. В нашем случае действительный хэш имеет не менее четырех ведущих нулей. Процесс поиска одноразового номера, соответствующего действительному хешу, называется майнингом.

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

Почему это важно?

Это важно, потому что он сохраняет неизменность блокчейна.

Если у нас есть следующий блокчейн A → B → C, и кто-то хочет изменить данные в блоке A. Вот что происходит:

  1. Изменения данных по блоку А.
  2. Хэш блока А изменяется, поскольку для его вычисления используются данные.
  3. Блок A становится недействительным, потому что в его хэше больше нет четырех ведущих нулей.
  4. Хэш блока B изменяется, поскольку хеш блока A использовался для вычисления хэша блока B.
  5. Блок B становится недействительным, потому что в его хэше больше нет четырех ведущих нулей.
  6. Хэш блока C изменяется, потому что хэш блока B использовался для вычисления хэша блока C.
  7. Блок C становится недействительным, потому что в его хэше больше нет четырех ведущих нулей.

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

Надеюсь, этот урок был для вас полезным!

Если вы хотите проверить веб-версию демонстрации, перейдите на http://blockchaindemo.io