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

104 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Разработка контрактов
DChain поддерживает два способа написания WASM-контрактов.
## Выбор подхода
| | TinyGo SDK | Бинарный WASM |
|-|-----------|--------------|
| **Язык** | Go | Go (кодогенератор) |
| **Инструменты** | TinyGo 0.30+ | Стандартный Go |
| **Сложность** | Низкая | Высокая |
| **Размер .wasm** | ~30100 KB | 5002000 байт |
| **Отладка** | Стандартная | Сложная |
| **Рекомендуется** | Новые контракты | Минимальные/системные |
## TinyGo SDK (рекомендуется)
Пишите контракты как обычный Go-код:
```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](tinygo.md)
## Бинарный WASM
Генераторы в `contracts/*/gen/main.go` создают минимальные WASM-модули вручную через LEB128-кодирование. Размер получается ~500 байт, но написание сложное.
Подробнее: [Бинарный WASM](binary-wasm.md)
## Документация по разделам
| Документ | Содержание |
|---------|-----------|
| [TinyGo SDK](tinygo.md) | Установка, SDK API, сборка, деплой, пример |
| [Host functions](host-functions.md) | Полный справочник 14 host-функций |
| [Межконтрактные вызовы](inter-contract.md) | call_contract, composability, глубина |
| [Бинарный WASM](binary-wasm.md) | LEB128, секции, кодогенератор |
| [Gas и Treasury](gas-model.md) | Gas модель, treasury, governance |
## Общая структура контракта
```
contracts/
mycontract/
main.go # TinyGo источник
mycontract_abi.json # ABI (описание методов)
mycontract.wasm # Скомпилированный бинарник
```
## ABI формат
```json
{
"contract": "mycontract",
"version": "1.0.0",
"description": "...",
"methods": [
{
"name": "method_name",
"description": "...",
"args": [
{"name": "param1", "type": "string"},
{"name": "amount", "type": "uint64"}
]
}
]
}
```
Поддерживаемые типы: `string`, `uint64`, `bytes`.
## Деплой контракта
```bash
# Локально
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>`.