SOLPDT 1.1 — Agentic Trust Layer Extension
Настоящее приложение определяет процедуру Handshake (рукопожатия) — строго регламентированный процесс, в ходе которого Агент доказывает свою техническую и юридическую состоятельность Лицензиару для получения аттестата sig.a (Authoritative Attestation).
Initial-Dossier — это структурированный JSON-документ, который Агент передаёт Лицензиару при инициации процедуры верификации. Документ содержит все необходимые данные для проведения автоматизированного аудита в соответствии с методологией SOLPDT.
После успешного прохождения Handshake Лицензиар выдаёт цифровую подпись sig.a, которая встраивается в поле sig.a структуры Payload-V2 (см. раздел 2.1 основной спецификации). Без валидной sig.a транзакции Агента не признаются доверенными в экосистеме SOLPDT, а статус nma не может быть установлен в true.
Агент формирует Initial-Dossier в формате JSON согласно схеме, приведённой в разделе C.3, и отправляет его Лицензиару через API или защищённый канал связи. Запрос должен содержать уникальный request_id и криптографический nonce для защиты от повторного использования.
Лицензиар проводит автоматизированный аудит Агента, включающий:
stake_accountАгент проверяет Digital Access Token (DAT) Лицензиара, используя ссылку licensor_dat_ref из собственного досье. Проверка включает:
Если DAT валиден, доверие между Агентом и Лицензиаром считается установленным.
После успешного прохождения всех проверок Лицензиар:
sig.a (Authoritative Attestation)sig.a на callback_url, указанный в Initial-DossierС этого момента Агент включает полученную sig.a в поле sig.a каждой транзакции Payload-V2. Любой участник экосистемы SOLPDT может мгновенно проверить подпись и убедиться, что Агент верифицирован аккредитованным Лицензиаром.
Ниже представлена эталонная структура Initial-Dossier. Все поля, отмеченные как required, обязательны к заполнению. Отсутствие любого обязательного поля приводит к отклонению запроса с кодом HS_ERR_MISSING_FIELDS.
{
"dossier_header": {
"version": "1.1",
"request_id": "req-987456321",
"timestamp": 1715856000,
"nonce": "a7b8c9d0e1f2"
},
"identity_block": {
"agent_pubkey": "A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v",
"operator_id": "LLC-TECH-AGENT-01",
"legal_jurisdiction": "RU",
"controller_sig": "3z9x8c7v6b5n4m3l2k1j0h9g8f7e6d5c4b3a2"
},
"technical_manifest": {
"payload_standard": "Payload-V2",
"crypto_suite": "AES-GCM-256-Ed25519",
"compliance_gateway_program_id": "CGW1111111111111111111111111111111111111",
"rpc_endpoint_hash": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"security_trust_layer": {
"stake_account": "Stake99999999999999999999999999999999999999",
"min_stake_amount": 50.0,
"staking_token": "SOL",
"slashing_consent": true,
"trl_monitoring_enabled": true
},
"accounting_context": {
"ias_38_compliance": true,
"fsbu_14_2022_support": true,
"asset_type": "Digital_Intangible_Asset",
"valuation_oracle": "Pyth-Network-Mainnet",
"base_currency": "RUB"
},
"attestation_meta": {
"licensor_dat_ref": "DAT-888-REGIONAL-NODE-05",
"callback_url": "https://agent-api.internal/solpdt/callback"
}
} | Поле | Тип | Обязательность | Описание |
|---|---|---|---|
version | String | required | Версия протокола SOLPDT. Фиксированное значение "1.1". |
request_id | String | required | Уникальный идентификатор запроса. Рекомендуется формат req-{unix_timestamp}-{random}. |
timestamp | Integer | required | Unix-время (секунды) формирования запроса. |
nonce | String | required | Криптографическая соль. Минимум 12 символов. Защита от replay-атак. |
| Поле | Тип | Обязательность | Описание |
|---|---|---|---|
agent_pubkey | String | required | Публичный ключ Агента в сети Solana (Base58). |
operator_id | String | required | Идентификатор юридического лица или оператора Агента. |
legal_jurisdiction | String | required | Код юрисдикции по стандарту ISO 3166-1 alpha-2 (например, RU, US, DE). |
controller_sig | String | required | Подпись владельца приватного ключа, подтверждающая контроль над agent_pubkey. |
| Поле | Тип | Обязательность | Описание |
|---|---|---|---|
payload_standard | String | required | Фиксированное значение "Payload-V2". |
crypto_suite | String | required | Используемый набор криптографических алгоритмов. Допустимые значения: AES-GCM-256-Ed25519. |
compliance_gateway_program_id | String | required | Program ID смарт-контракта Compliance-Gateway в сети Solana (Base58). |
rpc_endpoint_hash | String | required | SHA-256 хеш URL доверенного RPC-узла, через который Агент взаимодействует с сетью. |
| Поле | Тип | Обязательность | Описание |
|---|---|---|---|
stake_account | String | required | Адрес аккаунта в Solana, на котором заблокирован гарантийный депозит (Stake). |
min_stake_amount | Float | required | Минимальная сумма залога в токенах, указанных в staking_token. |
staking_token | String | required | Тикер токена залога (SOL, USDC, или другой SPL-токен). |
slashing_consent | Boolean | required | Подтверждение согласия с условиями изъятия залога при нарушении. Должен быть строго true. |
trl_monitoring_enabled | Boolean | required | Подтверждение готовности к мониторингу через TRL. Должен быть строго true. |
| Поле | Тип | Обязательность | Описание |
|---|---|---|---|
ias_38_compliance | Boolean | required | Подтверждение соответствия стандарту IAS 38 (МСФО). |
fsbu_14_2022_support | Boolean | required | Подтверждение соответствия стандарту ФСБУ 14/2022 (РФ). |
asset_type | String | required | Тип нематериального актива. Рекомендуемое значение: Digital_Intangible_Asset. |
valuation_oracle | String | required | Идентификатор оракула цены (например, Pyth-Network-Mainnet). |
base_currency | String | required | Валюта учёта по ISO 4217 (RUB, USD, EUR). |
| Поле | Тип | Обязательность | Описание |
|---|---|---|---|
licensor_dat_ref | String | required | Идентификатор Digital Access Token (DAT) Лицензиара, выданного Корневым узлом. |
callback_url | String | required | URL для получения sig.a после успешной аттестации. Должен принимать POST-запросы. |
| Поле | Правило валидации | Действие при ошибке |
|---|---|---|
slashing_consent | Должен быть строго true. | Отказ с кодом HS_ERR_SLASHING_CONSENT_FALSE. Агент не принимает экономическую ответственность. |
trl_monitoring_enabled | Должен быть строго true. | Отказ с кодом HS_ERR_TRL_MONITORING_DISABLED. |
stake_account | Должен содержать залог ≥ min_stake_amount в токене staking_token. | Отказ с кодом HS_ERR_INSUFFICIENT_STAKE. |
compliance_gateway_program_id | Должен быть валидным Program ID в сети Solana. | Отказ с кодом HS_ERR_INVALID_CGW. |
licensor_dat_ref | DAT должен быть выдан Корневым узлом и не находиться в TRL. | Отказ с кодом HS_ERR_DAT_REVOKED. |
callback_url | Должен быть доступен и возвращать HTTP 200 на тестовый POST-запрос. | Отказ с кодом HS_ERR_CALLBACK_UNREACHABLE. |
legal_jurisdiction | Должен соответствовать ISO 3166-1 alpha-2. | Отказ с кодом HS_ERR_INVALID_JURISDICTION. |
После успешного Handshake, полученная sig.a встраивается в поле sig.a структуры Payload-V2 (см. раздел 2.1 основной спецификации).
| Initial-Dossier | Payload-V2 | Назначение |
|---|---|---|
agent_pubkey | Отправитель транзакции | Идентификация Агента в сети Solana |
compliance_gateway_program_id | Transfer Hook токена | AML-проверка при каждой транзакции |
stake_account | Резерв для слэшинга | Источник средств при экономическом наказании |
valuation_oracle | settlement_context.currency (косвенно) | Оценка стоимости актива |
base_currency | settlement_context.currency | Валюта расчётов |
| Код ошибки | HTTP статус | Описание | Рекомендуемое действие |
|---|---|---|---|
HS_ERR_MISSING_FIELDS | 400 | Отсутствуют обязательные поля в Initial-Dossier. | Проверить схему JSON. |
HS_ERR_SLASHING_CONSENT_FALSE | 403 | slashing_consent !== true. | Установить true. |
HS_ERR_TRL_MONITORING_DISABLED | 403 | trl_monitoring_enabled !== true. | Установить true. |
HS_ERR_INSUFFICIENT_STAKE | 402 | Залог на stake_account меньше min_stake_amount. | Пополнить залоговый депозит. |
HS_ERR_INVALID_CGW | 400 | compliance_gateway_program_id невалиден. | Проверить Program ID. |
HS_ERR_DAT_REVOKED | 403 | DAT Лицензиара отозван или в TRL. | Обратиться к другому Лицензиару. |
HS_ERR_CALLBACK_UNREACHABLE | 503 | callback_url недоступен. | Проверить доступность эндпоинта. |
HS_ERR_INVALID_JURISDICTION | 400 | Некорректный код юрисдикции. | Использовать ISO 3166-1 alpha-2. |
HS_ERR_DUPLICATE_REQUEST | 409 | request_id уже был использован. | Сгенерировать новый request_id. |
HS_ERR_TIMESTAMP_EXPIRED | 400 | timestamp отличается от серверного времени более чем на 300 секунд. | Синхронизировать время. |
{
"status": "error",
"error": {
"code": "HS_ERR_INSUFFICIENT_STAKE",
"message": "Залог на счёте Stake999... составляет 25.0 SOL, требуется минимум 50.0 SOL."
},
"request_id": "req-987456321",
"retry_possible": true
} При успешной верификации Лицензиар отправляет на callback_url следующий JSON:
{
"status": "approved",
"request_id": "req-987456321",
"agent_pubkey": "A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8S9t0U1v",
"sig_a": "5YtXz2M4pQ7rS9tU1vW3xY5zA7bC9dE1fG3hJ5kL7mN9pQ2rS5tU8vW2xYz4A6B8C0D",
"licensor_dat_ref": "DAT-888-REGIONAL-NODE-05",
"issued_at": 1715856300,
"valid_until": 1747392300,
"attestation_uri": "https://solpdt.com/verify/sig/5YtXz2M4pQ7..."
} Агент обязан сохранить sig.a и включать её в каждую транзакцию Payload-V2. Срок действия аттестата (valid_until) составляет 365 дней с момента выдачи, после чего требуется повторное прохождение Handshake.
request_id может быть использован только один раз. Лицензиар обязан вести реестр обработанных request_id с TTL не менее 7 дней.timestamp, отличающимся от серверного времени более чем на 300 секунд, должны отклоняться.agent_pubkey. Используется алгоритм Ed25519.sig.a в защищённом хранилище (HSM, секреты Kubernetes, Vault). Компрометация sig.a эквивалентна компрометации аттестации.КОРНЕВОЙ УЗЕЛ (СОЗДАТЕЛЬ СТАНДАРТА): Юрий Соколов (SOL Trust Network)
КОНТАКТЫ: standards@solpdt.com