Крихітний блокчейн на Python. Частина 1

5 хв. читання

Хоча деякі вважають, що блокчейн – проблемне рішення, немає сумнівів, що ця технологія – чудо обчислень. Але що насправді таке блокчейн?

Цифровий гросбух, у якому транзакції, у біткоінах або в інших криптовалютах, записуються хронологічно та публічно.

У більш загальних термінах, це публічна база даних, де нові дані зберігаються у контейнері, який називається блоком, і додаються до незмінного ланцюга (звідси назва блокчейн) із даними, які були додані до нього у минулому. У випадку із біткоінами та іншими криптовалютами, ці дані є групами транзакцій. Але, звичайно, дані можуть бути будь-якого типу.

Технологія блокчейн призвела до виникнення нових, повністю цифрових валют, таких як Біткоін (Bitcoin) та Лайткоін (Litecoin), які не випускаються або не управляються центральним органом влади. Це привносить нову свободу людям, які вважають, що сьогоднішні банківські системи є шахрайськими або схильними до невдач. Блокчейн також здійснив революцію в розподілених обчисленнях у вигляді технологій, таких як Ефіріум (Ethereum), у якій представлені цікаві концепції, такі як смарт-контракти.

У цій статті я зроблю простий блокчейн менш ніж у 50 рядків коду Python 2. Він буде називатися SnakeCoin.

Почнемо з визначення того, як будуть виглядати наші блоки. У блокчейні кожен блок зберігається з міткою часу та, необов'язково, індексом. У SnakeCoin ми збираємося зберігати й те, й інше. І щоб забезпечити цілісність у всьому ланцюгу, кожен блок буде мати самоідентифікуючий хеш. Як і у Біткоін, хеш кожного блоку буде криптографічним хешем індексу, мітки часу, даних та хешу попереднього блоку. А дані можуть бути якими ви захочете.

import hashlib as hasher

class Block:
  def __init__(self, index, timestamp, data, previous_hash):
    self.index = index
    self.timestamp = timestamp
    self.data = data
    self.previous_hash = previous_hash
    self.hash = self.hash_block()
  
  def hash_block(self):
    sha = hasher.sha256()
    sha.update(str(self.index) + 
               str(self.timestamp) + 
               str(self.data) + 
               str(self.previous_hash))
    return sha.hexdigest()
```	

Добре. Тепер у нас є структура нашого блоку, але ми створюємо блок**чейн**. Нам потрібно почати додавати блоки до нашого поточного ланцюга. Як я згадував раніше, кожен блок потребує інформацію із минулого блоку. Але, при цьому, виникає питання: як перший блок у блокчейні туди потрапляє? Що ж, перший блок, або **первинний блок (genesis block)**, є спеціальним блоком. У багатьох випадках, він додається вручну або має унікальну логіку, яка дозволяє його додавати.
		
Ми створимо функцію, яка просто повертає первинний блок, щоб спростити задачу. Цей блок має індекс 0 і має довільне значення даних та довільне значення в параметрі  «попередній хеш».

```python
import datetime as date

def create_genesis_block():
  # Вручну побудуйте блок із нульовим індексом
  # та довільним попереднім хешем
  return Block(0, date.datetime.now(), "Genesis Block", "0")

Тепер, коли ми можемо створити первинний блок, нам потрібна функція, яка буде генерувати наступні блоки у блокчейні. Ця функція візьме попередній блок у ланцюгу в якості параметру, створить дані для блоку, який буде згенерований, і поверне новий блок із відповідними даними. Коли нові блоки хешують інформацію із попередніх блоків, цілісність блокчейну збільшується з кожним новим блоком. Якби ми цього не зробили, то для зовнішньої сторони було б легше «змінити минуле» і замінити наш ланцюг своїм зовсім новим. Цей ланцюг хешів діє як криптографічний доказ і гарантує, що після додання блоку до блокчейну, його не можна буде замінити або видалити.

def next_block(last_block):
  this_index = last_block.index + 1
  this_timestamp = date.datetime.now()
  this_data = "Hey! I'm block " + str(this_index)
  this_hash = last_block.hash
  return Block(this_index, this_timestamp, this_data, this_hash)

Тепер ми можемо створити наш блокчейн. У нашому випадку, блокчейн являє собою простий список у Python. Перший елемент списку - первинний блок. І, звичайно, нам потрібно додати наступні блоки. Оскільки SnakeCoin – крихітний ланцюг, ми додамо тільки 20 нових блоків. Це можна зробити за допомогою циклу for.

# Створіть блокчейн та додайте первинний блок
blockchain = [create_genesis_block()]
previous_block = blockchain[0]

# Скільки блоків нам потрібно додати після первинного блоку
num_of_blocks_to_add = 20

# Додайте блоки до ланцюга
for i in range(0, num_of_blocks_to_add):
  block_to_add = next_block(previous_block)
  blockchain.append(block_to_add)
  previous_block = block_to_add
  # Повідомте всіх про це!
  print "Block #{} has been added to the blockchain!".format(block_to_add.index)
  print "Hash: {}\
".format(block_to_add.hash) 

Перевірмо те, що ми вже зробили:

Крихітний блокчейн на Python. Частина 1
Не хвилюйтесь. Він дійде до 20

Наш блокчейн працює. Якщо ви хочете бачити більше інформації в консолі, ви можете відредагувати вихідний файл та надрукувати мітки часу або дані кожного блоку.

Це все, що може запропонувати SnakeCoin. Щоб вивести SnakeCoin на рівень нинішніх виробничих блокчейнів, нам потрібно додати інші функції: рівень сервера, щоб відстежувати зміни в ланцюжку на декількох машинах і алгоритм доказу виконаної роботи, щоб обмежити кількість блоків, доданих в заданий часовий період.

Якщо ви хочете отримати додаткову технічну інформацію, ви можете продивитись вихідний документ Біткоін.

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 6.2K
Приєднався: 7 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація