Skip to content

Şema Tanımı

Şemalar, zincir üstü Anchor hesaplarının düzenini tanımlar. Curvhex ORM bunları iki amaçla kullanır: zincir üstü filtreleme için memcmp bayt ofsetlerini hesaplamak ve ham hesap verisini tipli TypeScript nesnelerine dönüştürmek.

defineModel

typescript
import { defineModel, anchor } from '@curvhex/orm'

const UserAccount = defineModel({
  discriminator: anchor('UserAccount'),
  fields: {
    authority: { type: 'publicKey' },
    balance:   { type: 'u64' },
    tier:      { type: 'u8' },
    isActive:  { type: 'bool' },
    name:      { type: 'string' },
  },
})

discriminator

Anchor'ın her hesabın başına türünü tanımlamak için yazdığı 8 baytlık önek.

Anchor programları: anchor() yardımcısını kullan — hesap adından discriminator'ı Anchor'ın kullandığı aynı hash ile hesaplar:

typescript
import { anchor } from '@curvhex/orm'

anchor('UserAccount') // → [149, 88, 201, 24, 166, 41, 99, 218]

Native programlar: ham baytları doğrudan ver:

typescript
discriminator: [1, 2, 3, 4, 5, 6, 7, 8]

Discriminator yok: boş dizi ilet:

typescript
discriminator: []

fields

Alan adlarından tanımlarına sıralı bir eşleme. Sıra önemlidir — alanlar Anchor'ın bunları serileştirdiği sırayla bildirilmelidir, çünkü ofsetler sıralı olarak hesaplanır.

Alan Türleri

TürBoyutTypeScriptNotlar
u81 baytnumber
u162 baytnumberlittle-endian
u324 baytnumberlittle-endian
u648 baytbigintlittle-endian
u12816 baytbigintlittle-endian
i81 baytnumber
i162 baytnumberlittle-endian
i324 baytnumberlittle-endian
i648 baytbigintlittle-endian
i12816 baytbigintlittle-endian
bool1 baytboolean
publicKey32 baytstringbase58 kodlu
string4 + N baytstringBorsh: u32 uzunluk öneki + UTF-8
bytes4 + N baytstringBorsh: u32 uzunluk öneki + ham baytlar → hex

Değişken Uzunluklu Alanlar

string ve bytes alanları değişken uzunluklara sahiptir. Bunları sabit boyutlu alanlardan önce yerleştirmek, sonraki alanlar için ofsetlerin statik olarak hesaplanamamasına yol açar. Önceki tüm alanlarda zincir üstü memcmp filtrelemesini etkinleştirmek için değişken uzunluklu alanları en sona koy.

Tip Çıkarımı

defineModel tamamen tiplenmiş bir model döndürür. Bir sonucun TypeScript tipini çıkarmak için InferModel kullan:

typescript
import type { InferModel } from '@curvhex/orm'

type User = InferModel<typeof UserAccount>
// {
//   address:   string
//   authority: string
//   balance:   bigint
//   tier:      number
//   isActive:  boolean
//   name:      string
// }

Released under the Apache 2.0 License.