Files
dchain/docs/development
vsecoder 546d2c503f chore(release): clean up repo for v0.0.1 release
Excluded from release bundle:
- CONTEXT.md, CHANGELOG.md (agent/project working notes)
- client-app/ (React Native messenger — tracked separately)
- contracts/hello_go/ (unused standalone example)

Kept contracts/counter/ and contracts/name_registry/ as vm-test fixtures
(referenced by vm/vm_test.go; NOT production contracts).

Docs refactor:
- docs/README.md — new top-level index with cross-references
- docs/quickstart.md — rewrite around single-node as primary path
- docs/node/README.md — full rewrite, all CLI flags, schema table
- docs/api/README.md — add /api/well-known-version, /api/update-check
- docs/contracts/README.md — split native (Go) vs WASM (user-deployable)
- docs/update-system.md — new, full 5-layer update system design
- README.md — link into docs/, drop CHANGELOG/client-app references

Build-time version system (inherited from earlier commits this branch):
- node --version / client --version with ldflags-injected metadata
- /api/well-known-version with {build, protocol_version, features[]}
- Peer-version gossip on dchain/version/v1
- /api/update-check against Gitea release API
- deploy/single/update.sh with semver guard + 15-min systemd jitter
2026-04-17 14:37:00 +03:00
..
2026-04-17 14:16:44 +03:00
2026-04-17 14:16:44 +03:00

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

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 node.json \
  --wasm mycontract.wasm \
  --abi  mycontract_abi.json \
  --node http://localhost:8080

В Docker (single-node):

docker exec dchain /usr/local/bin/client deploy-contract \
  --key /keys/node.json \
  --wasm /path/to/mycontract.wasm \
  --abi  /path/to/mycontract_abi.json \
  --node http://localhost:8080

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