# Разработка контрактов DChain поддерживает два способа написания WASM-контрактов. ## Выбор подхода | | TinyGo SDK | Бинарный WASM | |-|-----------|--------------| | **Язык** | Go | Go (кодогенератор) | | **Инструменты** | TinyGo 0.30+ | Стандартный Go | | **Сложность** | Низкая | Высокая | | **Размер .wasm** | ~30–100 KB | 500–2000 байт | | **Отладка** | Стандартная | Сложная | | **Рекомендуется** | Новые контракты | Минимальные/системные | ## 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: `.