Files
dchain/docs/contracts/README.md
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

86 lines
3.5 KiB
Markdown
Raw Permalink 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.

# Smart contracts
DChain поддерживает **два типа** контрактов — native Go (запечены в
бинарь ноды) и WASM (деплоятся on-chain через `DEPLOY_CONTRACT` tx).
## Native (Go, скомпилированы в бинарь)
Живут в `blockchain/native*.go`. Видны как `native:<name>`, работают на
каждой ноде идентично (тот же Go-код — нет WASM-drift'а).
| Контракт | ID | Назначение |
|----------|----|-----------|
| [username_registry](username_registry.md) | `native:username_registry` | `@username` ↔ pubkey, плата 10_000 µT, min 4 символа |
Клиент находит `native:username_registry` автоматически через
`/api/well-known-contracts` — без конфигурирования.
## WASM (user-deployable)
Деплоятся любым обладателем баланса через `client deploy-contract`.
Исполняются в wazero runtime с gas limit и set'ом host-функций.
| Контракт | Назначение | Key features |
|----------|------------|--------------|
| [governance](governance.md) | On-chain параметры | Propose/approve workflow, admin role |
| [auction](auction.md) | English auction | Token escrow, автоматический refund, settle |
| [escrow](escrow.md) | Двусторонний escrow | Dispute/resolve, admin arbitration |
Исходники + WASM-артефакты — в `contracts/<name>/`. SDK для написания
новых контрактов — [../development/README.md](../development/README.md).
## Деплой WASM
Контракты **не деплоятся автоматически** — это выбор оператора.
Скрипт-хелпер:
```bash
./scripts/deploy_contracts.sh # деплоит auction + escrow + governance из CWD
```
Или вручную:
```bash
client deploy-contract \
--key node.json \
--wasm contracts/auction/auction.wasm \
--abi contracts/auction/auction_abi.json \
--node http://localhost:8080
```
После деплоя `contract_id` печатается в stdout — сохраните его.
## Вызов контракта (любой типа)
```bash
client call-contract \
--key node.json \
--contract <contract_id_or_native:name> \
--method <method> \
--arg <string_arg> # можно повторять
--arg64 <uint64_arg> # числовые аргументы
--gas 20000 # reasonable default; read-only методы: 5000
--amount 0 # tx.Amount (для методов с платой — см. username_registry)
--node http://localhost:8080
```
## Contract treasury
У каждого WASM-контракта есть **ownerless treasury** по адресу
`hex(sha256(contractID + ":treasury"))`. Private-key не существует,
списывать можно только через host function `transfer` из самого
контракта. Используется `auction` (escrow bids) и `escrow` (held amount).
## Просмотр state / логов
```bash
# Конкретный ключ state
curl -s http://localhost:8080/api/contracts/<id>/state/<key>
# Последние N логов контракта
curl -s "http://localhost:8080/api/contracts/<id>/logs?limit=20" | jq .
# Или через Explorer UI
open http://localhost:8080/contract?id=<id>
```