Аккаунты и разрешения¶
Аккаунт в COOPOS — это именованная сущность протокола: область в глобальном состоянии, где хранятся разрешения, квоты ресурсов и (если развёрнут контракт) WASM+ABI. Пользователи, сервисные роли и смарт-контракты представлены одинаково — как аккаунты. Криптография ключей и подписей вынесена в Ключи и подписи; общая картина — в разделе концептуальная модель COOPOS.
mindmap
root((Аккаунт))
Контракты["Системные и прикладные контракты"]
Организации["Кооперативы и роли"]
Участники["Пайщики и сервисные аккаунты"]
Имя аккаунта (name)¶
Имя кодируется как 64-битное значение; в тексте это до 12 символов из набора a–z и 1–5. Это ограничение протокола, а не произвольное соглашение: от него зависят таблицы контрактов (_n у имён таблиц в коде на CDT).
Примеры имён
gzxcsdaqwejf, dfjlkeifjdka — условные обезличенные идентификаторы; в продакшене имена могут быть осмысленными, если укладываются в алфавит и длину.
Иерархия разрешений¶
У каждого аккаунта есть набор именованных разрешений. Минимальный стандартный набор:
| Имя | Назначение |
|---|---|
owner |
Высший уровень: смена структуры active и других потомков, восстановление контроля. Родителя нет (parent пустой). |
active |
Повседневные операции: подпись действий, переводы, вызовы контрактов. Обычно дочерний к owner. |
Каждое разрешение содержит required_auth: порог (threshold), список ключей с весами, список аккаунтов (делегирование authority другого аккаунта) и опционально wait (задержка). Порог должен быть достигнут суммой весов выбранных ключей/аккаунтов при проверке транзакции.
flowchart LR
Аккаунт["Аккаунт"]
Аккаунт --> АктивныеРазрешения["active"]
Аккаунт --> ВладелецРазрешения["owner"]
Аккаунт --> КодовыеРазрешения["eosio.code при необходимости"]
АктивныеРазрешения --> Действия["Подпись действий пользователя"]
ВладелецРазрешения --> Изменение["Смена ключей / структуры полномочий"]
КодовыеРазрешения --> КаскадныеДействия["Inline-действия из WASM"]
Авторизация действия¶
В каждом действии указывается список пар actor@permission (в сериализованном виде — actor + строка permission). Узел проверяет, что подписи транзакции закрывают требуемые authority для каждого действия в пакете. Несовпадение — отказ всей транзакции.
Сокращение в документации: символ @ перед именем разрешения, например @active, @owner.
Разрешение eosio.code¶
Чтобы контракт мог порождать встроенные (inline) действия от своего имени, у его аккаунта в соответствующей ветке authority должна быть возможность исполнения кода контракта — на практике это оформляется как участие eosio.code в authority (политика развёртывания контракта). Так связываются многошаговые сценарии в одной атомарной транзакции.
flowchart TB
subgraph TX["Транзакция"]
ДействиеПайщика["Действие пользователя"]
ДействиеСмартКонтракта1["Действие контракта A"]
ДействиеСмартКонтракта2["Inline от контракта A → B"]
end
ДействиеПайщика -->|"@active"| ДействиеСмартКонтракта1
ДействиеСмартКонтракта1 -.->|"@eosio.code"| ДействиеСмартКонтракта2
Делегирование между аккаунтами¶
В required_auth можно указать другой аккаунт с весом: тогда действия от имени первого аккаунта может подписывать ключами второго (если это разрешено конфигурацией). Системные сценарии платформы могут жёстко задавать схемы делегирования между системными контрактами; прикладной смысл см. в документации по контрактам кооператива.
Привилегированные аккаунты¶
Аккаунт может быть помечен как privileged — ему разрешён расширенный набор встроенных примитивов на уровне узла (зависит от версии и политики сети). В публичной цепи такие аккаунты ограничены и задаются генезисом/управлением сети.
Восстановление доступа¶
Потеря приватного ключа не «отменяет» аккаунт: пока owner можно сменить по согласованной процедуре (мультисиг кооператива, системный контракт восстановления и т.д.), в цепь записывается новая authority. Имя аккаунта неизменно; юридическая идентификация участника вне цепи остаётся на стороне кооператива.
sequenceDiagram
participant Пайщик as Пайщик
participant Кооператив as Кооператив
participant СмартКонтракт as Кооперативный контракт
participant Блокчейн as Блокчейн
Пайщик->>Кооператив: Утерян ключ — процедура восстановления
Кооператив->>СмартКонтракт: Действие по правилам контракта
СмартКонтракт->>Блокчейн: Обновление authority аккаунта
Блокчейн-->>Пайщик: Доступ с новыми ключами
Справка: вид аккаунта в API¶
Ниже — ориентировочная структура ответа узла (поля могут отличаться в зависимости от версии и плагинов). Используйте как карту полей, а не как жёсткую схему.
{
"account_name": "example",
"head_block_num": 123456,
"head_block_time": "2023-11-24T10:00:00.000",
"privileged": false,
"last_code_update": "2023-01-01T12:00:00.000",
"created": "2021-05-10T14:00:00.000",
"ram_quota": 8192,
"net_weight": 1000,
"cpu_weight": 1000,
"net_limit": { "used": 0, "available": 50000, "max": 50000 },
"cpu_limit": { "used": 0, "available": 50000, "max": 50000 },
"ram_usage": 1024,
"permissions": [
{
"perm_name": "owner",
"parent": "",
"required_auth": {
"threshold": 1,
"keys": [{ "key": "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV", "weight": 1 }],
"accounts": [],
"waits": []
}
},
{
"perm_name": "active",
"parent": "owner",
"required_auth": {
"threshold": 1,
"keys": [{ "key": "EOS7T3XhQiLzRYCZCsD6qZZLmRud8kLzjhKrmfN3oBczmXtB5uPiP", "weight": 1 }],
"accounts": [],
"waits": []
}
}
],
"total_resources": {
"owner": "example",
"net_weight": "1.0000 AXON",
"cpu_weight": "1.0000 AXON",
"ram_bytes": 8192
},
"self_delegated_bandwidth": {
"from": "example",
"to": "example",
"net_weight": "1.0000 AXON",
"cpu_weight": "1.0000 AXON"
},
"refund_request": null,
"voter_info": {
"owner": "example",
"proxy": "",
"producers": [],
"staked": 10000,
"last_vote_weight": "0.00000000000000000",
"proxied_vote_weight": "0.00000000000000000",
"is_proxy": 0
}
}