Ontology ağında bir WebAssembly akıllı sözleşmesi nasıl yazılır? Bölüm 1: Pas

Ontology ağında bir WebAssembly akıllı sözleşmesi nasıl yazılır? Bölüm 1: Pas

Ontology Wasm teknolojisi, karmaşık iş mantığına sahip dApp akıllı sözleşmelerini blok zincirine taşıma maliyetini düşürür ve böylece dApp ekosistemini büyük ölçüde zenginleştirir.

Şimdi Ontoloji Aynı anda hem Rust hem de C++ geliştirmeyi destekler. Rust dili, Wasm'ı daha iyi destekler ve oluşturulan bayt kodu daha basittir, bu da sözleşme çağrılarının maliyetini daha da azaltabilir. Bu yüzden, Ontology ağında bir sözleşme geliştirmek için Rust nasıl kullanılır?

Rust ile bir WASM Sözleşmesi Geliştirme

Sözleşme oluştur

Kargo geliştiricilerin kod ve üçüncü taraf kitaplıklarının etkileşimini daha iyi organize etmelerine yardımcı olan, Rust geliştirme için iyi bir proje oluşturma ve paket yönetim aracıdır. Yeni bir Ontology Wasm sözleşmesi oluşturmak için aşağıdaki komutu çalıştırmanız yeterlidir:

Ontology ağında bir WebAssembly akıllı sözleşmesi nasıl yazılır? Bölüm 1: Pas

Oluşturduğu proje yapısı:

Ontology ağında bir WebAssembly akıllı sözleşmesi nasıl yazılır? Bölüm 1: Pas

Cargo.toml dosyası, temel proje bilgilerini ve bağımlı kitaplık bilgilerini ayarlamak için kullanılır. Dosyanın [lib] bölümü, sandık tipi = ["cdylib"] olarak ayarlanmalıdır. lib.rs dosyası, sözleşme mantık kodunu yazmak için kullanılır. Ayrıca, Cargo.toml yapılandırma dosyasının [bağımlılıklar] bölümüne bağımlılık parametreleri eklemeniz gerekir:

Ontology ağında bir WebAssembly akıllı sözleşmesi nasıl yazılır? Bölüm 1: Pas

Bu bağımlılıkla geliştiriciler, Ontology blok zinciriyle etkileşime giren arabirimleri ve serileştirme parametresi gibi araçları çağırabilir.

Sözleşme giriş işlevi

Her programın, genellikle gördüğümüz ana işlev gibi bir girdi işlevi vardır, ancak sözleşmenin bir ana işlevi yoktur. Rust kullanılarak bir Wasm sözleşmesi geliştirildiğinde, sözleşmeyi kullanmak için giriş işlevi olarak varsayılan çağırma işlevi kullanılır. Rust kaynak kodunu sanal bir makine tarafından yürütülebilen bayt koduna derlerken, Rust'ta bir işlevin adı net olmayacaktır. Derleyicinin gereksiz kod üretmesini önlemek ve sözleşmenin boyutunu azaltmak için invoke işlevi #[no_mangle] notunu ekler.

Çağırma işlevi, bir işlemi yürütmek için parametreleri nasıl alır?

ontio_std kitaplığı, bir işlemi yürütmek için parametreleri almak üzere bir runtime::input() işlevi sağlar. Geliştiriciler, ortaya çıkan bayt dizisinin serisini kaldırmak için ZeroCopySource'u kullanabilir. Okunan ilk bayt dizisi, invoke yönteminin adıdır ve ardından yöntem parametreleri gelir.

Sözleşme uygulama sonucu nasıl iade edilir?

ontio_std kitaplığı tarafından sağlanan runtime::ret işlevi, bir yöntem yürütmesinin sonucunu döndürür.

Tamamlanan çağırma işlevi şöyle görünür:

Ontology ağında bir WebAssembly akıllı sözleşmesi nasıl yazılır? Bölüm 1: Pas

Sözleşme Verilerinin Seri Hale Getirilmesi ve Seri Hallerinin Kaldırılması

Sözleşme geliştirme sürecinde, geliştiriciler, özellikle bir yapı veri türünün veritabanında nasıl saklanacağı ve bir yapı veri türü elde etmek için veritabanından okunan bir bayt dizisinin nasıl seri hale getirileceği ile ilgili olarak, her zaman seri hale getirme ve seri kaldırma ile ilgili sorunlarla karşılaşırlar.

ontio_std kitaplığı, veri serileştirme ve seri kaldırma için kod çözücü ve kodlayıcı arabirimleri sağlar. Yapının alanları ayrıca kod çözücü ve kodlayıcı arabirimlerini uygular, böylece yapı serileştirilebilir ve seri durumdan çıkarılabilir. Çeşitli veri türleri serileştirildiğinde, Sink sınıfının örnekleri gerekir. Sink sınıfının bir örneğinin, bayt tipi verileri depolayan bir set tipi alan veri yolu vardır ve tüm seri hale getirilmiş veriler tamponda depolanır.

Sabit uzunluktaki veriler için (örneğin: bayt, u16, u32, u64, vb.), veriler doğrudan bir bayt dizisine dönüştürülür ve ardından buf'ta saklanır; sabit olmayan uzunluktaki veriler için önce uzunluk, ardından Ddata serileştirilmelidir (örneğin, u16, u32 veya u64 vb. dahil olmak üzere boyutu bilinmeyen işaretsiz tamsayılar).

Seri kaldırma tam tersidir. Her seri hale getirme yöntemi için karşılık gelen bir seri hale getirme yöntemi vardır. Seri durumdan çıkarma, Source sınıfının örneklerinin kullanılmasını gerektirir. Bu sınıf örneğinin buf ve pos olmak üzere iki alanı vardır. Buf, seriden çıkarılacak verileri saklamak için kullanılır ve pos, mevcut okuma konumunu saklamak için kullanılır. Belirli bir veri türü okunurken, uzunluğunu biliyorsanız, uzunluğu bilinmeyen veriler için doğrudan okuyabilirsiniz—önce uzunluğu okuyun, sonra içeriğini okuyun.

Zincirdeki verilere erişin ve bunları güncelleyin

ontoloji-wasm-cdt-rust - zincirdeki verilerle çalışmak için, geliştiricilerin zincirdeki verileri aşağıdaki gibi ekleme, silme, değiştirme ve sorgulama gibi işlemleri gerçekleştirmesi için uygun olan operasyonel bir yöntemi kapsülledi:

  • veritabanı::get(anahtar) - zincirden veri talep etmek için kullanılır ve anahtar, AsRef arayüzünün uygulanmasını talep eder;
  • database::put(anahtar, değer) - ağda veri depolamak için kullanılır. Anahtar, AsRef arayüzünün uygulanmasını ister ve değer, Kodlayıcı arayüzünün uygulanmasını ister;
  • veritabanı::delete(anahtar) - zincirden veri kaldırmak için kullanılır ve anahtar, AsRef arabiriminin uygulanmasını ister.

Sözleşme testi

Bir sözleşmenin yöntemleri uygulandığında, zincirdeki verilere erişmemiz ve sözleşmenin bayt kodunu yürütmek için uygun bir sanal makineye ihtiyacımız var, bu nedenle genellikle test için sözleşmeyi zincirde dağıtmak gerekir. Ancak bu test yöntemi sorunludur. Geliştiricilerin sözleşmeleri test etmesini kolaylaştırmak için ontio_std kitaplığı, test için sahte bir modül sağlar. Bu modül, devredeki verilerin bir simülasyonunu sağlayarak, geliştiricilerin sözleşmedeki yöntemleri birim test etmesini kolaylaştırır. Spesifik örnekler bulunabilir burada.

Sözleşme Hata Ayıklama

console::debug(msg), bir sözleşmede hata ayıklanırken hata ayıklama bilgilerini görüntüler. İleti bilgileri, düğüm günlük dosyasına eklenecektir. Önkoşul, yerel Ontology test düğümü çalışırken günlük dosyası düzeyini hata ayıklama moduna ayarlamaktır.

runtime::notify(msg), sözleşmede hata ayıklanırken uygun hata ayıklama bilgilerini verir. Bu yöntem, zincire girilen bilgileri depolar ve getSmartCodeEvent yöntemi kullanılarak zincirden sorgulanabilir.

Makale Hashrate&Shares editörleri tarafından özellikle OntologyRussia için tercüme edilmiştir. tıklayın

Bir geliştirici misiniz? adresindeki teknoloji topluluğumuza katılın Discord. Şuna da bakın: Geliştirici Merkezi geliştirici araçlarını, belgeleri ve daha fazlasını bulabileceğiniz web sitemizde.

Ontoloji

Kaynak: habr.com

Yorum ekle