Схема визначає структуру та правила валідації для облікових даних у Системі атестації 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?