|
| 1 | +# Агент-доступ (HF15) |
| 2 | + |
| 3 | +Аккаунт (**принципал**) может завести **агентов**: именованные публичные ключи, которым разрешено отправлять заданный список операций от его имени. Агент — не аккаунт, а запись у принципала. Собственные ключи принципала никому не передаются, агент отзывается одной операцией. |
| 4 | + |
| 5 | +Типичные случаи: торговый бот, который ставит в прогнозных рынках; сервис, который делает выплаты переводами; ключ, который внешний сервис (например vizhub) принимает для входа и своих действий. |
| 6 | + |
| 7 | +--- |
| 8 | + |
| 9 | +## `set_agent_permission_operation` (ID 105) |
| 10 | + |
| 11 | +**Подпись:** `active` аккаунта `account`. До HF15 отвергается. |
| 12 | + |
| 13 | +| Поле | Тип | Описание | |
| 14 | +|------|-----|----------| |
| 15 | +| `account` | `account_name_type` | Принципал | |
| 16 | +| `agent_name` | `string` | Имя агента, уникально у принципала; `[a-z0-9_-]`, непустое | |
| 17 | +| `agent_key` | `public_key_type` | Ключ агента; обязателен при выдаче, при отзыве не проверяется | |
| 18 | +| `operations` | `flat_set<string>` | Wire-имена операций, которые может подписывать ключ (`transfer`, `pm_place_bet`, …) | |
| 19 | +| `expiration` | `time_point_sec` | `1970-01-01T00:00:00` = бессрочно; время в прошлом = отзыв | |
| 20 | +| `addons` | `flat_set<string>` | Метки для внешних сервисов (напр. `vizhub`); до 10 штук, каждая короче 64 байт, без `,`. Нода их хранит, но не толкует: в цепи они ничего не дают | |
| 21 | +| `extensions` | `extensions_type` | Всегда `[]` | |
| 22 | + |
| 23 | +Выдача (бот может ставить и переводить, vizhub принимает его ключ): |
| 24 | + |
| 25 | +```json |
| 26 | +["set_agent_permission", { |
| 27 | + "account": "alice", |
| 28 | + "agent_name": "trade-bot", |
| 29 | + "agent_key": "VIZ6MyX5QiXAXRZk7SYCiqpi6Mtm8UbHWDFSV8HPpt7FJyahCnc2T", |
| 30 | + "operations": ["pm_place_bet", "transfer"], |
| 31 | + "expiration": "2027-01-01T00:00:00", |
| 32 | + "addons": ["vizhub"], |
| 33 | + "extensions": [] |
| 34 | +}] |
| 35 | +``` |
| 36 | + |
| 37 | +Агент только с addons (ключ для внешнего сервиса, без операций цепи): |
| 38 | + |
| 39 | +```json |
| 40 | +["set_agent_permission", { |
| 41 | + "account": "alice", |
| 42 | + "agent_name": "hub-login", |
| 43 | + "agent_key": "VIZ7…", |
| 44 | + "operations": [], |
| 45 | + "expiration": "1970-01-01T00:00:00", |
| 46 | + "addons": ["vizhub"], |
| 47 | + "extensions": [] |
| 48 | +}] |
| 49 | +``` |
| 50 | + |
| 51 | +Отзыв — оба списка пусты (ключ можно передать нулевой `VIZ1111111111111111111111111111111114T1Anm`): |
| 52 | + |
| 53 | +```json |
| 54 | +["set_agent_permission", { |
| 55 | + "account": "alice", "agent_name": "trade-bot", |
| 56 | + "agent_key": "VIZ1111111111111111111111111111111114T1Anm", |
| 57 | + "operations": [], "expiration": "1970-01-01T00:00:00", "addons": [], "extensions": [] |
| 58 | +}] |
| 59 | +``` |
| 60 | + |
| 61 | +Повторная выдача по тому же имени заменяет ключ, операции, addons и срок (смена ключа = перевыдача). |
| 62 | + |
| 63 | +## Правила |
| 64 | + |
| 65 | +- **Не делегируются никогда:** `set_agent_permission`, `proposal_create`, `proposal_update`, `proposal_delete`, `account_update`, `recover_account`, `change_recovery_account`, `set_account_price`, `set_subaccount_price`, `target_account_sale`. Виртуальные операции и устаревшие алиасы (писать `validator_update`, а не `witness_update`) отвергаются. |
| 66 | +- **Один ключ — один агент:** ключ, уже привязанный к другому имени того же принципала, отвергается. |
| 67 | +- **Не больше 16 агентов** на принципала. Выдача сначала удаляет его истёкших агентов. |
| 68 | +- **Когда подпись агента засчитывается:** транзакции не нужны master- и regular-подписи, собственные ключи принципала её не подписывают, агент жив (срок не истёк, список операций не пуст), его список покрывает **каждую** операцию транзакции, которой нужна подпись, и его ключ есть среди подписей. Через вложенные `account_auths` доступа нет. |
| 69 | +- **Удаление:** все агенты принципала стираются при смене master, смене active, восстановлении аккаунта, прямой продаже и закрытии аукциона. Смена только regular их не трогает. |
| 70 | + |
| 71 | +## Чтение агентов |
| 72 | + |
| 73 | +`database_api.get_agent_permissions(account)` — см. [database_api](../../plugins/database-api.md#get-agent-permissions-account). |
0 commit comments