Files
dchain/docs/development/README.md
vsecoder 7e7393e4f8 chore: initial commit for v0.0.1
DChain single-node blockchain + React Native messenger client.

Core:
- PBFT consensus with multi-sig validator admission + equivocation slashing
- BadgerDB + schema migration scaffold (CurrentSchemaVersion=0)
- libp2p gossipsub (tx/v1, blocks/v1, relay/v1, version/v1)
- Native Go contracts (username_registry) alongside WASM (wazero)
- WebSocket gateway with topic-based fanout + Ed25519-nonce auth
- Relay mailbox with NaCl envelope encryption (X25519 + Ed25519)
- Prometheus /metrics, per-IP rate limit, body-size cap

Deployment:
- Single-node compose (deploy/single/) with Caddy TLS + optional Prometheus
- 3-node dev compose (docker-compose.yml) with mocked internet topology
- 3-validator prod compose (deploy/prod/) for federation
- Auto-update from Gitea via /api/update-check + systemd timer
- Build-time version injection (ldflags → node --version)
- UI / Swagger toggle flags (DCHAIN_DISABLE_UI, DCHAIN_DISABLE_SWAGGER)

Client (client-app/):
- Expo / React Native / NativeWind
- E2E NaCl encryption, typing indicator, contact requests
- Auto-discovery of canonical contracts, chain_id aware, WS reconnect on node switch

Documentation:
- README.md, CHANGELOG.md, CONTEXT.md
- deploy/single/README.md with 6 operator scenarios
- deploy/UPDATE_STRATEGY.md with 4-layer forward-compat design
- docs/contracts/*.md per contract
2026-04-17 14:16:44 +03:00

3.1 KiB
Raw Blame History

Разработка контрактов

DChain поддерживает два способа написания WASM-контрактов.

Выбор подхода

TinyGo SDK Бинарный WASM
Язык Go Go (кодогенератор)
Инструменты TinyGo 0.30+ Стандартный Go
Сложность Низкая Высокая
Размер .wasm ~30100 KB 5002000 байт
Отладка Стандартная Сложная
Рекомендуется Новые контракты Минимальные/системные

TinyGo SDK (рекомендуется)

Пишите контракты как обычный Go-код:

package main

import dc "go-blockchain/contracts/sdk"

//export increment
func increment() {
    v := dc.GetU64("counter")
    dc.PutU64("counter", v+1)
    dc.Log("incremented")
}

func main() {}

Подробное руководство: TinyGo SDK

Бинарный WASM

Генераторы в contracts/*/gen/main.go создают минимальные WASM-модули вручную через LEB128-кодирование. Размер получается ~500 байт, но написание сложное.

Подробнее: Бинарный WASM

Документация по разделам

Документ Содержание
TinyGo SDK Установка, SDK API, сборка, деплой, пример
Host functions Полный справочник 14 host-функций
Межконтрактные вызовы call_contract, composability, глубина
Бинарный WASM LEB128, секции, кодогенератор
Gas и Treasury Gas модель, treasury, governance

Общая структура контракта

contracts/
  mycontract/
    main.go              # TinyGo источник
    mycontract_abi.json  # ABI (описание методов)
    mycontract.wasm      # Скомпилированный бинарник

ABI формат

{
  "contract": "mycontract",
  "version": "1.0.0",
  "description": "...",
  "methods": [
    {
      "name": "method_name",
      "description": "...",
      "args": [
        {"name": "param1", "type": "string"},
        {"name": "amount", "type": "uint64"}
      ]
    }
  ]
}

Поддерживаемые типы: string, uint64, bytes.

Деплой контракта

# Локально
client deploy-contract \
  --key key.json \
  --wasm mycontract.wasm \
  --abi  mycontract_abi.json \
  --node http://localhost:8081

# В Docker
docker exec node1 client deploy-contract \
  --key /keys/node1.json \
  --wasm /path/to/mycontract.wasm \
  --abi  /path/to/mycontract_abi.json \
  --node http://node1:8080

Успешный деплой логирует contract_id: <hex16>.