Введение

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

Предпосылки:

  • Базовое понимание Руби
  • Знакомство с концепциями блокчейна

Понимание основ

Что такое Блокчейн?

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

Хэш-функция

Хеш-функция — это математический алгоритм, который принимает входные данные и генерирует выходные данные фиксированного размера, обычно в виде строки символов. В программировании блокчейна обычно используется SHA-256 (алгоритм безопасного хеширования). Встроенная библиотека Ruby Digest::SHA256 позволяет легко генерировать хэши.

Пример кода:

require 'digest'

def sha256(data)
  Digest::SHA256.hexdigest(data)
end

puts sha256("Hello, world!")  # Output: 7509e5bda0c762d2bac7f90d758b5b2263fa01ccbc542ab5e3df163be08e6ca9

Создание простого блокчейна

Определение структуры блока

Мы начнем с создания класса Block, который будет хранить данные нашего блока.

Пример кода:

class Block
  attr_reader :index, :timestamp, :data, :previous_hash, :hash

  def initialize(index, timestamp, data, previous_hash)
    @index = index
    @timestamp = timestamp
    @data = data
    @previous_hash = previous_hash
    @hash = calculate_hash
  end

  def calculate_hash
    sha256("#{@index}#{@timestamp}#{@data}#{@previous_hash}")
  end
end

Создание блока генезиса

Первый блок в блокчейне называется «блоком генезиса». Он уникален тем, что у него нет родительского блока. Давайте создадим метод для генерации блока генезиса.

Пример кода:

def create_genesis_block
  timestamp = Time.now.to_i
  Block.new(0, timestamp, "Genesis Block", "0")
end

Добавление блоков в цепочку

Теперь мы создадим класс Blockchain, который будет управлять нашими блоками.

Пример кода:

class Blockchain
  def initialize
    @chain = [create_genesis_block]
  end

  def add_block(data)
    previous_block = @chain.last
    new_block = Block.new(previous_block.index + 1, Time.now.to_i, data, previous_block.hash)
    @chain << new_block
  end
end

Взаимодействие с блокчейном

Теперь, когда наш базовый блокчейн настроен, мы можем взаимодействовать с ним с помощью Ruby.

Пример кода:

# Initialize a new blockchain
my_blockchain = Blockchain.new

# Add blocks to the blockchain
my_blockchain.add_block("First Block")
my_blockchain.add_block("Second Block")
my_blockchain.add_block("Third Block")

# Print the blockchain
my_blockchain.chain.each do |block|
  puts "Index: #{block.index}"
  puts "Timestamp: #{block.timestamp}"
  puts "Data: #{block.data}"
  puts "Previous Hash: #{block.previous_hash}"
  puts "Hash: #{block.hash}"
  puts "------"
end

Этот код демонстрирует, как взаимодействовать с созданной нами цепочкой блоков. Сначала мы инициализируем новый экземпляр класса Blockchain. Затем мы добавляем в цепочку блоков три блока, каждый из которых содержит строку в качестве данных. Наконец, мы распечатываем детали каждого блока в цепочке блоков, включая индекс, отметку времени, данные, предыдущий хеш и хэш самого блока.

Проверка блокчейна

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

Пример кода:

class Blockchain
  # ...

  def valid?
    @chain.each_cons(2) do |previous_block, current_block|
      return false if current_block.previous_hash != previous_block.hash
      return false if current_block.hash != current_block.calculate_hash
    end
    true
  end
end

В этом методе мы перебираем последовательные пары блоков и для каждой пары проверяем два условия:

  1. Атрибут previous_hash текущего блока должен совпадать с хешем предыдущего блока.
  2. Хэш текущего блока должен совпадать с результатом пересчета хеша с текущими данными.

Если какое-либо из этих условий не выполняется, метод возвращает false, указывая на то, что блок-цепочка недействительна. Если цикл завершается без каких-либо расхождений, метод возвращает true, указывая на то, что блок-цепочка действительна.

Теперь давайте проверим метод проверки с нашей существующей цепочкой блоков:

# Check the validity of the blockchain
puts "Blockchain valid? #{my_blockchain.valid?}" # Output: true

# Tamper with the data in the second block
my_blockchain.chain[1].instance_variable_set("@data", "Tampered Data")

# Check the validity of the blockchain again
puts "Blockchain valid? #{my_blockchain.valid?}" # Output: false

Этот пример демонстрирует, как метод valid? может помочь обнаружить любое вмешательство в данные блокчейна.

Заключение

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

  1. Документация по Ruby
  2. Основы блокчейна (IBM)
  3. Нежное введение в технологию блокчейн

Понравилось читать? Еще не являетесь участником Medium? Вы можете поддержать мою работу напрямую, зарегистрировавшись по моей реферальной ссылке здесь. Это быстро, просто и не требует дополнительных затрат. Спасибо за вашу поддержку!