Схема определяет структуру и правила валидации для учётных данных в Системе аттестации Solana. Схемы служат шаблонами, которые указывают, какие поля должны содержать учётные данные и как они должны быть отформатированы. Каждая схема связана с типом учётных данных и может иметь версии для поддержки эволюции структуры данных.
Структура
Структура Schema представляет схему в Системе аттестации Solana. Каждая схема определяет шаблон для учётных данных, которые могут быть созданы на её основе.
Определения типов
Schema
export type Schema = {discriminator: number; // Internal discriminatorcredential: Address; // Associated credential addressname: ReadonlyUint8Array; // Schema namedescription: ReadonlyUint8Array; // Schema descriptionlayout: ReadonlyUint8Array; // Schema layout definitionfieldNames: ReadonlyUint8Array; // Names of fields in the schemaisPaused: boolean; // Pause statusversion: number; // Schema version};
Методы
Получение схем
| Метод | Описание | Параметры | Возвращает |
|---|---|---|---|
fetchSchema | Получает одну схему по её адресу | rpc: контекст RPC, address: адрес схемы, config?: конфигурация получения | Promise<Account<Schema>> |
fetchMaybeSchema | Безопасно получает схему, возвращает null, если не найдена | rpc: контекст RPC, address: адрес схемы, config?: конфигурация получения | Promise<MaybeAccount<Schema>> |
fetchAllSchema | Получает несколько схем по их адресам | rpc: контекст RPC, addresses: массив адресов схем, config?: конфигурация получения | Promise<Account<Schema>[]> |
fetchAllMaybeSchema | Безопасно получает несколько схем, пропускает ненайденные | rpc: контекст RPC, addresses: массив адресов схем, config?: конфигурация получения | Promise<MaybeAccount<Schema>[]> |
Сериализация
| Метод | Описание | Параметры | Возвращает |
|---|---|---|---|
getSchemaEncoder | Получает энкодер для данных схемы | Нет | Encoder<SchemaArgs> |
getSchemaDecoder | Получает декодер для данных схемы | Нет | Decoder<Schema> |
getSchemaCodec | Получает кодек для данных схемы | Нет | Codec<SchemaArgs, Schema> |
Примеры использования
Получение одной схемы
const schema = await fetchSchema(rpc, schemaAddress);console.log("Schema name:", schema.name);
Получение нескольких схем
const schemas = await fetchAllSchema(rpc, [schema1Address, schema2Address]);schemas.forEach((schema) => console.log("Schema:", schema.name));
Безопасное получение
const schema = await fetchMaybeSchema(rpc, schemaAddress);if (schema) {console.log("Schema found:", schema.name);} else {console.log("Schema not found");}
Типы данных структуры схемы
Поле layout использует числовые значения для указания типов данных каждого
поля в схеме:
| Значение | Тип данных | Описание |
|---|---|---|
| 0 | U8 | Беззнаковое 8-битное целое число |
| 1 | U16 | Беззнаковое 16-битное целое число |
| 2 | U32 | Беззнаковое 32-битное целое число |
| 3 | U64 | Беззнаковое 64-битное целое число |
| 4 | U128 | Беззнаковое 128-битное целое число |
| 5 | I8 | Знаковое 8-битное целое число |
| 6 | I16 | Знаковое 16-битное целое число |
| 7 | I32 | Знаковое 32-битное целое число |
| 8 | I64 | Знаковое 64-битное целое число |
| 9 | I128 | Знаковое 128-битное целое число |
| 10 | Bool | Логическое значение |
| 11 | Char | Одиночный символ |
| 12 | String | Строка переменной длины |
| 13 | VecU8 | Вектор беззнаковых 8-битных целых чисел |
| 14 | VecU16 | Вектор беззнаковых 16-битных целых чисел |
| 15 | VecU32 | Вектор беззнаковых 32-битных целых чисел |
| 16 | VecU64 | Вектор беззнаковых 64-битных целых чисел |
| 17 | VecU128 | Вектор беззнаковых 128-битных целых чисел |
| 18 | VecI8 | Вектор знаковых 8-битных целых чисел |
| 19 | VecI16 | Вектор знаковых 16-битных целых чисел |
| 20 | VecI32 | Вектор знаковых 32-битных целых чисел |
| 21 | VecI64 | Вектор знаковых 64-битных целых чисел |
| 22 | VecI128 | Вектор знаковых 128-битных целых чисел |
| 23 | VecBool | Вектор логических значений |
| 24 | VecChar | Вектор символов |
| 25 | VecString | Вектор строк |
Пример использования
Например, макет [12, 0, 12] определит три поля: строку (String), за которой
следует целое число U8, а затем еще одну строку (String). Массив fieldNames
предоставляет понятные человеку имена, которые позиционно соответствуют каждому
значению макета, поэтому при именах полей ["name", "age", "country"] первое
поле String будет называться "name", поле U8 будет называться "age", а второе
поле String будет называться "country".
Вот пример того, как они будут использоваться при создании схемы (Schema):
const createSchemaInstruction = getCreateSchemaInstruction({authority,payer,credential: credentialPda,schema: schemaPda,name: "Test Schema",description: "Just an example",fieldNames: ["name", "age", "country"],layout: Buffer.from([12, 0, 12])});
Важные примечания
- Поле
discriminatorиспользуется внутренне и не должно изменяться - Поле
credentialсвязывает схему с соответствующим типом учетных данных isPausedможно использовать для временного отключения использования схемы- Поле
versionпозволяет эволюционировать схеме с сохранением обратной совместимости layoutиfieldNamesопределяют структуру учетных данных, использующих эту схему- Все поля байтовых массивов (
name,description,layout,fieldNames) должны быть правильно закодированы/декодированы в соответствии с потребностями вашего приложения
Is this page helpful?