Python для блокчейна: создание приложений от теории до токена
Для кого эта статья:
- Разработчики, интересующиеся блокчейн-технологиями и Python
- Студенты и начинающие программисты, желающие освоить блокчейн-разработку
Специалисты из области IT, стремящиеся улучшить свои навыки в разработке децентрализованных приложений
Мир блокчейн-технологий стремительно растёт, а Python стал языком выбора для множества разработчиков, погружающихся в эту сферу. Неудивительно: гибкость, читаемый синтаксис и богатая экосистема библиотек делают Python идеальным инструментом для экспериментов с блокчейном. Независимо от того, изучаете ли вы технологию из любопытства или планируете строить на ней карьеру, понимание того, как реализовать базовые блокчейн-концепции на Python, открывает двери в мир децентрализованных приложений. Погрузимся в практическое руководство с примерами кода, которые превратят абстрактные концепции в работающие проекты 🚀
Хотите освоить Python и создавать не только блокчейн-проекты, но и веб-приложения, нейросети или игры? Обучение Python-разработке от Skypro — это путь от новичка до уверенного разработчика за 9 месяцев. Вы получите не только теоретические знания, но и практический опыт работы над реальными проектами под руководством экспертов-практиков. 95% выпускников трудоустраиваются в течение 3 месяцев после завершения обучения!
Основы блокчейн-технологии и её связь с Python
Блокчейн — это децентрализованная база данных, представляющая собой цепочку блоков, связанных криптографическими хешами. Каждый блок содержит набор транзакций и ссылку на предыдущий блок, что делает систему устойчивой к изменениям и фальсификациям. Эта технология лежит в основе биткоина и других криптовалют, но её применение простирается далеко за пределы финансовой сферы.
Python прекрасно подходит для работы с блокчейном по нескольким причинам:
- Простой синтаксис, что упрощает понимание сложных концепций блокчейна
- Богатая экосистема библиотек для криптографии (hashlib, cryptography)
- Развитые инструменты для работы с популярными блокчейн-платформами (web3py для Ethereum)
- Отличная поддержка асинхронного программирования для работы с сетевыми узлами
Ключевые концепции блокчейна, которые мы будем реализовывать с помощью Python, включают:
| Концепция | Описание | Реализация в Python |
|---|---|---|
| Хеширование | Преобразование данных произвольной длины в строку фиксированной длины | Библиотека hashlib (SHA-256) |
| Блоки | Контейнеры для группы транзакций | Классы Python с полями для данных |
| Цепочка блоков | Связанный список блоков | Список объектов или база данных |
| Консенсус | Механизм согласования состояния цепочки | Алгоритмы на Python (PoW, PoS) |
| Смарт-контракты | Самоисполняемый код на блокчейне | Solidity + интерфейсы Python |
Теперь, когда мы понимаем основы, давайте подготовим среду для разработки нашего первого блокчейн-приложения на Python 🛠️

Настройка среды для разработки блокчейна на Python
Прежде чем приступить к созданию блокчейн-приложений, необходимо настроить рабочую среду с нужными инструментами и библиотеками. Процесс относительно прост, но требует внимания к деталям.
Антон Сергеев, руководитель блокчейн-направления
Когда я впервые начал эксперименты с блокчейном, то допустил классическую ошибку: установил десятки библиотек и фреймворков, думая, что "больше значит лучше". В результате потратил недели на борьбу с конфликтующими зависимостями. Теперь я всегда рекомендую начинающим разработчикам: начните с минимального набора инструментов, используйте виртуальные окружения и добавляйте только те компоненты, которые действительно нужны для конкретной задачи. Этот подход сэкономил моей команде сотни часов при разработке нашего первого децентрализованного приложения для управления цепочкой поставок.
Вот базовый набор шагов для настройки среды разработки:
- Установите актуальную версию Python (рекомендуется Python 3.8 или выше)
- Создайте виртуальное окружение для изоляции зависимостей:
python -m venv blockchain_env
source blockchain_env/bin/activate # для Linux/Mac
blockchain_env\Scripts\activate # для Windows
- Установите базовые библиотеки для работы с криптографией:
pip install hashlib requests flask
- Для работы с Ethereum установите библиотеку web3py:
pip install web3
В зависимости от ваших конкретных задач, могут потребоваться дополнительные библиотеки:
| Библиотека | Назначение | Команда установки |
|---|---|---|
| py-solc-x | Компиляция смарт-контрактов Solidity | pip install py-solc-x |
| eth-brownie | Фреймворк для разработки и тестирования смарт-контрактов | pip install eth-brownie |
| ganache-cli | Локальная тестовая сеть Ethereum | npm install -g ganache-cli (требуется Node.js) |
| pycryptodome | Расширенные криптографические алгоритмы | pip install pycryptodome |
Для удобства работы рекомендую также настроить IDE с поддержкой Python. Популярные варианты включают VSCode с расширением Python и PyCharm. Они предоставляют подсветку синтаксиса, автодополнение и инструменты отладки, что значительно упрощает разработку.
После настройки среды самое время проверить её работоспособность с помощью простого скрипта:
import hashlib
def create_hash(data):
return hashlib.sha256(data.encode()).hexdigest()
test_data = "Мой первый блокчейн на Python"
hash_result = create_hash(test_data)
print(f"Данные: {test_data}")
print(f"Хеш: {hash_result}")
Если скрипт успешно запустился и вывел хеш-значение, ваша среда готова к разработке блокчейн-приложений 🚀 Теперь можно переходить к созданию простого блокчейна с нуля!
Создание простого блокчейна с нуля: шаги и код
Лучший способ понять принципы работы блокчейна — это создать его самостоятельно. Разработаем минималистичный, но функциональный блокчейн на Python, который демонстрирует ключевые концепции: блоки, хеширование, цепочку и простой консенсус.
Начнем с определения структуры блока и основных функций для работы с цепочкой:
import hashlib
import time
import json
from datetime import datetime
class Block:
def __init__(self, index, transactions, timestamp, previous_hash, nonce=0):
self.index = index
self.transactions = transactions
self.timestamp = timestamp
self.previous_hash = previous_hash
self.nonce = nonce
self.hash = self.compute_hash()
def compute_hash(self):
"""
Создает SHA-256 хеш блока
"""
block_string = json.dumps(self.__dict__, sort_keys=True)
return hashlib.sha256(block_string.encode()).hexdigest()
Теперь создадим основной класс блокчейна для управления цепочкой блоков:
class Blockchain:
# Сложность алгоритма майнинга
difficulty = 2
def __init__(self):
self.unconfirmed_transactions = []
self.chain = []
self.create_genesis_block()
def create_genesis_block(self):
"""
Генерирует первый блок цепочки с произвольным предыдущим хешем
"""
genesis_block = Block(0, [], str(datetime.now()), "0")
genesis_block.hash = genesis_block.compute_hash()
self.chain.append(genesis_block)
@property
def last_block(self):
"""
Возвращает последний блок в цепочке
"""
return self.chain[-1]
def proof_of_work(self, block):
"""
Функция, которая пытается подобрать значение nonce, чтобы получить хеш,
удовлетворяющий условиям сложности майнинга
"""
block.nonce = 0
computed_hash = block.compute_hash()
while not computed_hash.startswith('0' * Blockchain.difficulty):
block.nonce += 1
computed_hash = block.compute_hash()
return computed_hash
def add_block(self, block, proof):
"""
Добавляет блок в цепочку после проверки
"""
previous_hash = self.last_block.hash
# Проверка корректности предыдущего хеша
if previous_hash != block.previous_hash:
return False
# Проверка валидности доказательства работы
if not self.is_valid_proof(block, proof):
return False
block.hash = proof
self.chain.append(block)
return True
def is_valid_proof(self, block, block_hash):
"""
Проверяет, удовлетворяет ли хеш требованиям сложности майнинга
"""
return (block_hash.startswith('0' * Blockchain.difficulty) and
block_hash == block.compute_hash())
def add_new_transaction(self, transaction):
"""
Добавляет новую транзакцию в пул неподтвержденных транзакций
"""
self.unconfirmed_transactions.append(transaction)
def mine(self):
"""
Интерфейс для добавления ожидающих транзакций в блокчейн
"""
if not self.unconfirmed_transactions:
return False
last_block = self.last_block
new_block = Block(index=last_block.index + 1,
transactions=self.unconfirmed_transactions,
timestamp=str(datetime.now()),
previous_hash=last_block.hash)
proof = self.proof_of_work(new_block)
self.add_block(new_block, proof)
self.unconfirmed_transactions = []
return new_block.index
Теперь давайте протестируем наш блокчейн, добавив несколько транзакций и создав блоки:
# Инициализация блокчейна
blockchain = Blockchain()
# Добавление транзакций
blockchain.add_new_transaction({
"sender": "Alice",
"recipient": "Bob",
"amount": 5
})
blockchain.add_new_transaction({
"sender": "Bob",
"recipient": "Charlie",
"amount": 2
})
# Майнинг блока (добавление транзакций в цепочку)
print("Начинаем майнинг...")
block_index = blockchain.mine()
print(f"Блок #{block_index} успешно создан!")
# Проверка состояния блокчейна
print(f"Длина цепочки: {len(blockchain.chain)}")
print(f"Последний блок: {json.dumps(blockchain.last_block.__dict__, indent=4)}")
Этот базовый блокчейн демонстрирует ключевые принципы работы технологии:
- Блоки связаны в цепочку через хеш-указатели (previous_hash)
- Консенсус достигается через механизм Proof of Work (PoW)
- Транзакции группируются в блоки перед добавлением в цепочку
- Неизменяемость данных обеспечивается проверкой хешей
Для полноценного блокчейн-приложения потребуются дополнительные компоненты, такие как сетевой слой для распределения цепочки между узлами, механизмы разрешения конфликтов при ветвлении цепочки и система проверки транзакций. Однако даже этот простой пример дает фундаментальное понимание принципов работы блокчейна ⛓️
Python-библиотеки для работы с Ethereum и смарт-контрактами
Хотя создание собственного блокчейна с нуля — отличное упражнение для понимания технологии, в большинстве реальных проектов вы будете взаимодействовать с существующими блокчейн-платформами, такими как Ethereum. Python предлагает несколько мощных библиотек для работы с Ethereum и смарт-контрактами, которые значительно упрощают разработку.
Екатерина Волкова, блокчейн-разработчик
На заре моей карьеры в блокчейне я потратила месяцы на изучение низкоуровневых интерфейсов Ethereum JSON-RPC. Писала собственные обертки и утилиты, чтобы упростить взаимодействие со смарт-контрактами. Однажды коллега показал мне web3py, и я была поражена: код, который занимал у меня 200 строк, сократился до 20! Тогда я усвоила важный урок: не изобретай велосипед там, где уже есть Ferrari. Сегодня моя команда использует экосистему Python-библиотек для Ethereum как основу нашей инфраструктуры, что позволяет сосредоточиться на бизнес-логике, а не на технических деталях взаимодействия с блокчейном.
Рассмотрим основные библиотеки для работы с Ethereum экосистемой:
Web3.py — основной инструмент
Web3.py — это Python-порт популярной JavaScript библиотеки Web3.js. Она предоставляет высокоуровневый интерфейс для взаимодействия с блокчейном Ethereum.
# Установка
# pip install web3
from web3 import Web3
# Подключение к Ethereum через Infura
infura_url = "https://mainnet.infura.io/v3/YOUR_INFURA_KEY"
web3 = Web3(Web3.HTTPProvider(infura_url))
# Проверка соединения
print(f"Подключено к Ethereum: {web3.is_connected()}")
# Получение текущего номера блока
print(f"Текущий блок: {web3.eth.block_number}")
# Получение баланса адреса
address = "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
balance_wei = web3.eth.get_balance(address)
balance_eth = web3.from_wei(balance_wei, "ether")
print(f"Баланс адреса {address}: {balance_eth} ETH")
Работа со смарт-контрактами через web3py выглядит следующим образом:
# Загрузка смарт-контракта
# ABI (Application Binary Interface) описывает интерфейс контракта
contract_abi = [{"inputs":[],"name":"retrieve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"store","outputs":[],"stateMutability":"nonpayable","type":"function"}]
contract_address = "0x1234567890123456789012345678901234567890"
# Создание экземпляра контракта
contract = web3.eth.contract(address=contract_address, abi=contract_abi)
# Вызов метода контракта (чтение данных)
stored_value = contract.functions.retrieve().call()
print(f"Сохраненное значение: {stored_value}")
# Отправка транзакции (изменение состояния)
account = "0xYOUR_ACCOUNT_ADDRESS"
private_key = "YOUR_PRIVATE_KEY"
# Создание транзакции
nonce = web3.eth.get_transaction_count(account)
tx = contract.functions.store(100).build_transaction({
'chainId': 1, # ID основной сети Ethereum
'gas': 2000000,
'gasPrice': web3.to_wei('50', 'gwei'),
'nonce': nonce,
})
# Подписание и отправка транзакции
signed_tx = web3.eth.account.sign_transaction(tx, private_key)
tx_hash = web3.eth.send_raw_transaction(signed_tx.rawTransaction)
print(f"Транзакция отправлена: {tx_hash.hex()}")
# Ожидание подтверждения транзакции
receipt = web3.eth.wait_for_transaction_receipt(tx_hash)
print(f"Транзакция подтверждена в блоке {receipt.blockNumber}")
Помимо web3py, существуют и другие полезные библиотеки для работы с Ethereum:
| Библиотека | Описание | Особенности |
|---|---|---|
| Brownie | Фреймворк для разработки и тестирования смарт-контрактов | Встроенная консоль Python, управление проектами, тестирование |
| py-solc-x | Обёртка для компилятора Solidity | Компиляция смарт-контрактов прямо из Python |
| eth-abi | Кодирование/декодирование данных в формате Ethereum ABI | Низкоуровневая обработка данных для взаимодействия с контрактами |
| eth-account | Управление Ethereum-аккаунтами | Создание подписей, подписание транзакций без сетевого соединения |
| Vyper | Альтернативный язык смарт-контрактов | Более безопасный и Pythonic подход к написанию контрактов |
При выборе библиотеки для вашего проекта учитывайте следующие факторы:
- Масштаб проекта: для небольших скриптов достаточно web3py, для серьезных проектов лучше полноценные фреймворки типа Brownie
- Требования к безопасности: критичные для безопасности проекты могут потребовать дополнительных библиотек для проверки и аудита
- Необходимость тестирования: для разработки через тестирование (TDD) Brownie предлагает более удобные инструменты
- Опыт команды: если команда больше знакома с Python, чем с JavaScript, Python-библиотеки могут быть предпочтительнее
Теперь, когда мы знакомы с основными инструментами для работы с Ethereum, перейдем к практическому проекту — созданию собственного токена на блокчейне 🪙
Практический проект: собственный токен на блокчейне
Создание собственного токена на блокчейне — отличный способ применить полученные знания на практике. В этом разделе мы разработаем простой ERC-20 токен на Ethereum с использованием Solidity и Python для взаимодействия с ним.
Для начала нам нужно написать смарт-контракт токена на языке Solidity. Вот базовая реализация ERC-20 токена:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleToken {
string public name;
string public symbol;
uint8 public decimals;
uint256 public totalSupply;
mapping(address => uint256) private balances;
mapping(address => mapping(address => uint256)) private allowances;
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
constructor(string memory _name, string memory _symbol, uint8 _decimals, uint256 _initialSupply) {
name = _name;
symbol = _symbol;
decimals = _decimals;
totalSupply = _initialSupply * 10**uint256(_decimals);
balances[msg.sender] = totalSupply;
emit Transfer(address(0), msg.sender, totalSupply);
}
function balanceOf(address account) public view returns (uint256) {
return balances[account];
}
function transfer(address recipient, uint256 amount) public returns (bool) {
require(balances[msg.sender] >= amount, "Insufficient balance");
balances[msg.sender] -= amount;
balances[recipient] += amount;
emit Transfer(msg.sender, recipient, amount);
return true;
}
function allowance(address owner, address spender) public view returns (uint256) {
return allowances[owner][spender];
}
function approve(address spender, uint256 amount) public returns (bool) {
allowances[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
require(balances[sender] >= amount, "Insufficient balance");
require(allowances[sender][msg.sender] >= amount, "Insufficient allowance");
balances[sender] -= amount;
balances[recipient] += amount;
allowances[sender][msg.sender] -= amount;
emit Transfer(sender, recipient, amount);
return true;
}
}
Теперь используем Python и библиотеку web3py для компиляции и развертывания этого контракта в тестовой сети Ethereum:
import json
from web3 import Web3
from solcx import compile_source, install_solc
# Установка компилятора Solidity
install_solc('0.8.0')
# Компиляция контракта
with open('SimpleToken.sol', 'r') as file:
contract_source_code = file.read()
compiled_sol = compile_source(
contract_source_code,
output_values=['abi', 'bin'],
solc_version='0.8.0'
)
contract_id, contract_interface = compiled_sol.popitem()
abi = contract_interface['abi']
bytecode = contract_interface['bin']
# Подключение к локальной тестовой сети (Ganache)
w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))
# Проверка соединения
if not w3.is_connected():
print("Не удалось подключиться к Ethereum")
exit()
# Получение аккаунта для развертывания
account = w3.eth.accounts[0]
w3.eth.default_account = account
# Создание контракта
SimpleToken = w3.eth.contract(abi=abi, bytecode=bytecode)
# Параметры токена
token_name = "My Python Token"
token_symbol = "MPT"
token_decimals = 18
initial_supply = 1000000 # 1 миллион токенов
# Развертывание контракта
print(f"Развертывание токена {token_name}...")
tx_hash = SimpleToken.constructor(
token_name,
token_symbol,
token_decimals,
initial_supply
).transact()
# Ожидание завершения транзакции
tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
print(f"Токен развернут по адресу: {tx_receipt.contractAddress}")
# Сохранение ABI для дальнейшего использования
with open('token_abi.json', 'w') as file:
json.dump(abi, file)
# Создание экземпляра контракта для взаимодействия
token_contract = w3.eth.contract(
address=tx_receipt.contractAddress,
abi=abi
)
# Проверка информации о токене
print(f"Название: {token_contract.functions.name().call()}")
print(f"Символ: {token_contract.functions.symbol().call()}")
print(f"Десятичные знаки: {token_contract.functions.decimals().call()}")
total_supply = token_contract.functions.totalSupply().call()
print(f"Общее количество: {total_supply / (10**token_decimals)} {token_symbol}")
# Проверка баланса владельца
owner_balance = token_contract.functions.balanceOf(account).call()
print(f"Баланс {account}: {owner_balance / (10**token_decimals)} {token_symbol}")
После развертывания токена мы можем добавить функции для выполнения основных операций:
def transfer_tokens(w3, token_contract, sender, recipient, amount, decimals):
"""
Переводит токены от отправителя к получателю
"""
# Конвертация суммы в минимальные единицы токена
amount_in_smallest_units = int(amount * (10**decimals))
# Получение текущего баланса для проверки
sender_balance = token_contract.functions.balanceOf(sender).call()
if sender_balance < amount_in_smallest_units:
print(f"Недостаточно токенов. Баланс: {sender_balance / (10**decimals)}")
return False
# Создание транзакции
tx_hash = token_contract.functions.transfer(
recipient,
amount_in_smallest_units
).transact({'from': sender})
# Ожидание завершения транзакции
tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
# Проверка успешности транзакции
if tx_receipt.status == 1:
print(f"Успешно отправлено {amount} токенов от {sender} к {recipient}")
# Обновленные балансы
new_sender_balance = token_contract.functions.balanceOf(sender).call()
new_recipient_balance = token_contract.functions.balanceOf(recipient).call()
print(f"Новый баланс отправителя: {new_sender_balance / (10**decimals)}")
print(f"Новый баланс получателя: {new_recipient_balance / (10**decimals)}")
return True
else:
print("Транзакция не удалась")
return False
# Использование функции для перевода токенов
recipient = w3.eth.accounts[1] # Другой аккаунт в тестовой сети
transfer_amount = 1000 # Перевести 1000 токенов
transfer_tokens(
w3,
token_contract,
account, # отправитель (владелец токенов)
recipient,
transfer_amount,
token_decimals
)
Для более сложных проектов вам могут понадобиться дополнительные функции:
- Управление разрешениями (approve/allowance/transferFrom) для создания децентрализованных бирж
- Механизмы сжигания токенов для уменьшения общего предложения
- Функции замораживания аккаунтов для регулируемых токенов
- Механизмы голосования для токенов управления
При разработке реальных токенов рекомендуется использовать проверенные библиотеки, такие как OpenZeppelin, вместо написания контрактов с нуля. Это значительно снижает риски безопасности.
Для развертывания токена в основной сети Ethereum вместо тестовой сети вам потребуется:
- Реальный аккаунт Ethereum с достаточным количеством ETH для оплаты газа
- Приватный ключ этого аккаунта для подписания транзакций
- Провайдер, такой как Infura или Alchemy, для подключения к основной сети
- Тщательное тестирование контракта во всех тестовых сетях перед развертыванием
Вот как будет выглядеть код для развертывания в основной сети:
from web3 import Web3
from eth_account import Account
import os
# Загрузка приватного ключа из безопасного источника
private_key = os.environ.get("PRIVATE_KEY") # Никогда не храните ключи в коде!
account = Account.from_key(private_key)
# Подключение к основной сети через Infura
infura_url = f"https://mainnet.infura.io/v3/{os.environ.get('INFURA_KEY')}"
w3 = Web3(Web3.HTTPProvider(infura_url))
# Проверка подключения
if not w3.is_connected():
print("Не удалось подключиться к Ethereum")
exit()
# Развертывание контракта с подписанием транзакции
SimpleToken = w3.eth.contract(abi=abi, bytecode=bytecode)
construct_txn = SimpleToken.constructor(
token_name,
token_symbol,
token_decimals,
initial_supply
).build_transaction({
'from': account.address,
'nonce': w3.eth.get_transaction_count(account.address),
'gas': 2000000,
'gasPrice': w3.to_wei('50', 'gwei')
})
# Подписание транзакции
signed_txn = w3.eth.account.sign_transaction(construct_txn, private_key)
# Отправка транзакции
tx_hash = w3.eth.send_raw_transaction(signed_txn.rawTransaction)
print(f"Транзакция отправлена: {tx_hash.hex()}")
# Ожидание подтверждения (может занять несколько минут)
tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
print(f"Токен развернут по адресу: {tx_receipt.contractAddress}")
Создание собственного токена — это только начало. С использованием Python и соответствующих библиотек вы можете разрабатывать более сложные блокчейн-приложения: децентрализованные биржи, системы голосования, приложения для отслеживания цепочек поставок и многое другое 🌐
Освоение Python для блокчейн-разработки открывает перед вами новые горизонты в мире децентрализованных технологий. Мы рассмотрели основы блокчейна, создали простую цепочку блоков с нуля, познакомились с инструментами для работы с Ethereum и даже развернули собственный токен. Но это лишь верхушка айсберга. Блокчейн-технологии продолжают эволюционировать, предлагая разработчикам Python все новые возможности для инноваций. Начните с малого — экспериментируйте с кодом из этого руководства, модифицируйте его под свои нужды, и вскоре вы сможете создавать полноценные децентрализованные приложения, которые могут изменить целые индустрии.