Аккаунты
Модель аккаунта, идентификаторы, ключи, адреса и человекочитаемые handle в NOXY.
Аккаунты
Аккаунт в NOXY — это 32-байтный идентификатор (AccountId), группирующий балансы, sequence-нонсы и зарегистрированные открытые ключи в состоянии блокчейна. Идентификатор остается неизменным при ротации подписывающих ключей аккаунта.
Вывод AccountId
AccountId выводится путем хэширования BLAKE3 с разделением домена:
AccountId = BLAKE3("NOXY-L0/v0.1/account-id/v1\0" || preimage)
preimage = BLAKE3(public_key) || account_type_u16_le || salt
Переменные преимеджа:
public_key: байты начального публичного ключа ML-DSA-44 (1312 байт).account_type_u16_le: 2-байтный little-endian дискриминант типа аккаунта.salt: произвольная соль длиной0..=64байт (обычно пустая).
Вывод идентификатора реализован в TypeScript SDK (@noxy/core) и воспроизводится кошельком.
Типы аккаунтов
Тип аккаунта жестко определяет спектр допустимых транзакционных payload, которые он может авторизовать.
| Дискриминант | Имя типа | Описание |
|:---|:---|:---|
| 1 | User | Обычные пользователи. По умолчанию кошельки создают этот тип. |
| 2 | ValidatorOperator | Владелец ноды валидатора. Может отправлять управляющие транзакции. |
| 3 | ChainCreator | Создатель service chains. |
| 4 | ServiceDefinitionOwner | Владелец определений межсетевых сервисов. |
| 5 | Governance | Управление глобальными параметрами консенсуса. |
Бинарная структура Account
На уровне хранения в RocksDB запись аккаунта сериализуется в фиксированном формате:
Account {
account_id: AccountId // 32 байта
account_type: u16 // LE дискриминант
status: u16 // Active (0) | Inactive (1)
sequence_nonce: u64 // LE счетчик транзакций
primary_key_id: KeyId // 32 байта
}
Поле sequence_nonce инкрементируется строго на 1 при каждом исполненном TransactionEnvelope, независимо от числа внутренних действий в батче.
Реестр ключей
Ключи хранятся отдельно от аккаунта в общем индексе KeyRegistryEntry. Идентификатор ключа KeyId выводится по формуле:
KeyId = BLAKE3("NOXY-L0/v0.1/key-id/v1\0" || account_id || BLAKE3(public_key) || key_role_u16_le)
Роли ключей
| Дискриминант | Роль ключа | Назначение |
|:---|:---|:---|
| 1 | AccountAuth | Подпись пользовательских транзакций (Transfer, RegisterKey и др.). |
| 2 | ValidatorConsensusPq | ML-DSA-44 ключ для подписи BFT-голосов консенсуса. |
| 3 | ValidatorConsensusClassical | Ed25519 ключ для гибридного BFT-голосования. |
| 4 | CheckpointSigner | Авторизация payload SubmitCheckpoint. |
Внешнее представление адресов
Канонической формой адреса на сетевом уровне всегда остаются 32 сырых байта AccountId. В UI и CLI используются три внешних формата.
Hex-формат
Строка из 64 строчных символов шестнадцатеричной системы. RPC-эндпоинты принимают только строчный hex и отклоняют прописной.
f63052cfff6e7141bf90b7f9170a589f0674771a2d44173549fe60ba6aebf251
Bech32m-формат
Строка bech32m (BIP-350) с контрольной суммой для защиты от опечаток.
tnxy17cc99nlldec5r0usklu3wzjcnur8gac694zpwd2flest56ht7fgscpxscj
Префиксы (HRP):
noxy— основная сеть (mainnet).tnxy— тестовая сеть (testnet).
Трёхсловный верификатор (Verifier words)
Для визуальной сверки без чтения 64 hex-символов генерируются 3 английских слова BIP-39 и контрольное число:
Verify: general · leisure · vote · 97
Формула генерации:
VerifierDigest = BLAKE3("NOXY-L0/v0.1/account-verifier/v1\0" || account_id)
Word1Index = u16_le(VerifierDigest[0..2]) & 0x07FF
Word2Index = u16_le(VerifierDigest[2..4]) & 0x07FF
Word3Index = u16_le(VerifierDigest[4..6]) & 0x07FF
ChecksumNumber = u16_le(VerifierDigest[6..8]) % 100
Человекочитаемые имена (Account Names)
Имена аккаунтов связывают домен и AccountId в рамках одной сети. Формат записи:
alice@noxy-localnet-0
quanta://alice.noxy-localnet-0/
Записи хранятся в on-chain реестре:
AccountNameRecord {
labels: Vec<String> // Части имени до '@' (макс. account_name_max_labels)
owner_account_id: AccountId // Аккаунт, оплачивающий аренду и ротации
target_account_id: AccountId // Адресат резолва
target_account_type: u16
version: u32 // CAS-версия для оптимистичных блокировок
registered_at_epoch: u64
expires_at_epoch: u64
grace_until_epoch: u64
status: u16 // Active (0) | Grace (1) | Released (2)
}
Резолв работает через состояние: SDK нормализует метки, выводит хеш имени и читает запись из StateNamespace::AccountNameRecord. Кошелёк резолвит имена так же и отказывается резолвить против чужой сети. Отдельный публичный HTTP-эндпоинт резолва запланирован, но пока не открыт.