BlockKick - это децентрализованная краудфандинговая платформа (аналог Kickstarter), построенная на собственном блокчейне. Проект создан в образовательных целях.
- Собственный блокчейн на Rust
- PoW консенсус
- P2P сеть между узлами
- Встроенный криптокошелёк с Ed25519 подписями
- Сервис для агрегации данных о проектах
Ядро блокчейна: валидация транзакций, консенсус PoW, P2P протокол.
Технологии:
- Rust
- SHA-256 для хеширования
- Ed25519 для цифровых подписей
Интерфейс для пользователей: создание проектов, голосование, управление кошельком.
Сервис для сбора и агрегации данных о проектах и транзакциях.
# Команда пользователя
create-project --name "Open Source Game" --goal 1000 --deadline 30
# Ответ системы
Project created! ID: proj_abc123# Команда пользователя
vote --project-id "proj_123" --amount 50
# Ответ системы
Vote submitted! TX: tx_def456
Project raised: 800/1000 (80%)# Запуск майнинга
start-mining --threads 4
# Вывод
Mining started...
Block 105 found! Reward: 50 coins
Broadcast to network...Все транзакции в BlockKick используют единый базовый формат с типизированными данными.
{
"id": "<tx_hash_sha256>",
"tx_type": "<тип_транзакции>",
"from": "<public_key_sender_hex>",
"to": "<address_receiver_hex или null>",
"data": { ... },
"timestamp": <unix_timestamp>,
"signature": "<ed25519_signature_hex>",
}| Поле | Тип | Описание |
|---|---|---|
id |
String | SHA-256 хеш от сериализованной транзакции |
tx_type |
String | Тип транзакции: create_project, fund_project, transfer, coinbase |
from |
String/null | Публичный ключ отправителя (hex, 64 символа), null для coinbase |
to |
String/null | Адрес получателя, null для операций с проектами |
data |
Object | Типо-специфичные данные транзакции (см. ниже) |
timestamp |
Integer | Unix timestamp создания транзакции |
signature |
String/null | Ed25519 подпись транзакции, null для coinbase |
Создает новый краудфандинговый проект в блокчейне.
{
"id": "tx_a1b2c3d4e5f6...",
"tx_type": "create_project",
"from": "04a1b2c3d4e5f6...",
"to": null,
"data": {
"project_id": "proj_x7y8z9...",
"name": "Open Source Game",
"description": "Indie game built with Rust",
"goal_amount": 1000,
"deadline_timestamp": 1735689600,
"creator_wallet": "04creator_address_hex..."
},
"timestamp": 1733097600,
"signature": "3045022100a1b2c3d4..."
}Поле в data |
Тип | Описание |
|---|---|---|
project_id |
String | Уникальный ID проекта (SHA-256 от name + creator_wallet + timestamp) |
name |
String | Название проекта |
description |
String | Описание проекта |
goal_amount |
Integer | Целевая сумма сбора в коинах |
deadline_timestamp |
Integer | Unix timestamp дедлайна сбора |
creator_wallet |
String | Адрес кошелька создателя |
Переводит средства от бэкера напрямую создателю проекта. Средства не замораживаются.
{
"id": "tx_e5f6g7h8i9j0...",
"tx_type": "fund_project",
"from": "04backer_public_key_hex...",
"to": "04creator_address_hex...",
"data": {
"project_id": "proj_x7y8z9...",
"amount": 50,
"backer_note": "Good luck with the project!"
},
"timestamp": 1733098000,
"signature": "3045022100b2c3d4e5..."
}Поле в data |
Тип | Описание |
|---|---|---|
project_id |
String | ID проекта для финансирования |
amount |
Integer | Сумма взноса в коинах |
backer_note |
String | Опциональное сообщение от бэкера |
Важно: Средства переводятся напрямую на адрес создателя проекта (creator_wallet из транзакции create_project). Возврат средств не предусмотрен.
Стандартный перевод коинов между кошельками.
{
"id": "tx_s9t0u1v2w3x4...",
"tx_type": "transfer",
"from": "04sender_public_key_hex...",
"to": "04receiver_public_key_hex...",
"data": {
"amount": 100,
"message": "Thanks for your help!"
},
"timestamp": 1733100000,
"signature": "3045022100e5f6g7h8..."
}Поле в data |
Тип | Описание |
|---|---|---|
amount |
Integer | Сумма перевода в коинах |
message |
String | Опциональное сообщение (макс. 200 символов) |
Специальная транзакция, создающая новые монеты и выплачивающая награду майнеру за найденный блок.
{
"id": "tx_coinbase_abc123...",
"tx_type": "coinbase",
"from": null,
"to": "04miner_public_key_hex...",
"data": {
"reward": 50,
"block_height": 105
},
"timestamp": 1733100000,
"signature": null
}Поле в data |
Тип | Описание |
|---|---|---|
reward |
Integer | Награда майнеру в коинах (определяется протоколом) |
block_height |
Integer | Высота блока, за который выплачивается награда |
Особенности:
- Не имеет подписи (
signature: null) — монеты создаются протоколом, а не тратятся - Поле
fromравноnull— эмитентом является сеть - Создаётся майнером при нахождении блока и включается в этот блок
- Награда проверяется нодами согласно правилам консенсуса PoW
{
"header": {
"index": 0,
"timestamp": 1733100000,
"prev_hash": "0000000000000000000000000000000000000000000000000000000000000000",
"merkle_root": "abc123...",
"nonce": 12345
},
"transactions": [ ... ]
}| Поле | Тип | Описание |
|---|---|---|
header |
Object | Заголовок блока (см. ниже) |
transactions |
Array | Массив транзакций (минимум 1 coinbase) |
{
"index": 0,
"timestamp": 1733100000,
"prev_hash": "0000000...",
"merkle_root": "abc123...",
"nonce": 12345
}| Поле | Тип | Описание |
|---|---|---|
index |
Integer | Высота блока (0 для genesis) |
timestamp |
Integer | Unix timestamp создания блока |
prev_hash |
String | SHA-256 хеш предыдущего блока (64 hex символа) |
merkle_root |
String | Корень Меркла всех транзакций в блоке |
nonce |
Integer | Число для подбора хеша (PoW) |
Хеш блока вычисляется как SHA-256 от сериализованного BlockHeader:
block_hash = SHA256(serialize(header))
Корень Меркла вычисляется рекурсивным хешированием пар хешей транзакций:
1. Хеш каждой транзакции = ID транзакции
2. Если нечётное количество - последний хеш дублируется
3. Пары хешей конкатенируются и хешируются
4. Повторять, пока не останется один хеш
Для пустого блока (genesis):
merkle_root = SHA256("empty")
- Алгоритм: SHA-256
- Применение:
- Вычисление ID транзакций
- Вычисление ID проектов
- Хеширование блоков
- Алгоритм: Ed25519
- Ключи:
- Приватный ключ: 32 байта
- Публичный ключ: 32 байта (hex-кодирование, 64 символа)
- Применение: Подпись всех транзакций кроме
coinbase
- Баланс пользователя вычисляется прохождением всех транзакций в блокчейне:
Баланс = (Все входящие транзакции) - (Все исходящие транзакции)
-
При краудфандинге средства не замораживаются, а сразу переводятся создателю проекта
-
Возврат средств бэкерам, если проект не набрал нужную сумму, не предусмотрен
-
Для большей простоты разрешения форков подсчет средств пользователя осуществляется по требованию, проходясь по всем блокам начиная с корневого
- Порядок полей в структурах: ID транзакции вычисляется от JSON-сериализации.
serde_jsonсохраняет порядок полей в том виде, в котором они объявлены вstruct. Изменение порядка полей в коде сломает валидность существующих транзакций. - Детерминированность: При одинаковых входных данных и неизменном порядке полей ID транзакции всегда будет одинаковым.
| ФИО | Роль |
|---|---|
| Чернов | Blockchain Core |
| Раздьяконов | Blockchain Core |
| Липов | DApp + Wallet + Aggregation Service |
MIT License
Сделано для обучения блокчейн-технологиям



