Back to Blog

Solana Ekosistemine Güvenli Bir Bakış (1) — Merhaba Solana

March 9, 2022
5 min read

1. Giriş

Solana, farklı dillerde (örneğin Rust, C++ ve C) geliştirilebilen programları (akıllı sözleşmeleri) destekleyen yüksek performanslı, izinsiz bir Katman 1 blok zinciri sistemidir. Tower BFT (Bizans Hata Toleranslı) sayesinde saniyede binlerce işlemi blok süreleriyle işleyebilir. Solana'nın temel yeniliklerinden biri, mutabakattan önce çalışan, küresel olarak erişilebilir ve izinsiz bir zaman kaynağı olan Tarih Kanıtı'dır (PoH). PoH'u ilerleyen bölümlerde daha ayrıntılı ele alacağız.

2. Misyonumuz

BlockSec, misyonu olarak "DApp Ekosistemini güvence altına almayı" benimseyen bir blok zinciri güvenlik şirketidir. Bu doğrultuda yalnızca sözleşme denetim hizmeti sunmakla kalmayıp tüm topluluk için güvenli akıllı sözleşmelerin nasıl yazılacağına dair öneriler de sunmaktayız. Solana'nın popülaritesi, yüksek performansı ve üstün tasarımı göz önünde bulundurularak bu seri, Solana üzerinde Rust ile yazılmış akıllı sözleşmelerin güvenliğine odaklanacaktır.

3. Merhaba Solana

Solana akıllı sözleşmelerini güvenlik perspektifinden ele almadan önce, Solana akıllı sözleşmelerinin nasıl yazıldığını, derleneceğini ve dağıtılacağını öğrenmemiz gerekmektedir. Burada örnek olarak Hello World kullanacağız.

3.1 Kod İncelemesi

Solana'da akıllı sözleşmeye program denir. Hello World programı, istemci tarafından çağrılan hedef hesabın (program tarafından sahip olunan) kaç kez çağrıldığını kaydeden bir sayacı yönetmeyi ve bu sayıyı çıktı olarak yazdırmayı amaçlamaktadır.

Şimdi sözleşmenin tamamını inceleyelim.

  1. satırdan 9. satıra kadar, use anahtar sözcüğü ile pek çok kütüphane açıkça kapsama dahil edilmektedir.
  1. satırda, [derive(BorshSerialize, BorshDeserialize, Debug)], 13. satırdan 16. satıra kadar tanımlanan GreetingAccount yapısına iletilen parametreleri serileştirmek ve seri dışı bırakmak için kullanılmaktadır. Yapı, u32 türünde counter adlı bir genel üye içermektedir. Ardından, yorum satırında belirtildiği üzere, 19. satır programın giriş noktasını dışa aktarmaktadır; bu giriş noktası process_instruction fonksiyonudur.

process_instruction fonksiyonu üç parametre kabul etmektedir (yani program_id, accounts ve _instruction_data). program_id'nin dağıtılmış programın açık anahtarı (yani adresi) olduğunu, accounts'ın ise merhaba denilecek hesabı içerdiğini belirtmek gerekir. _instruction_data boştur ve kullanılmamaktadır.

Solana'daki programlar ve hesaplar hakkında daha fazla bilgi için lütfen Solana belgelerine başvurunuz.

  1. satırda bir merhaba mesajı yazdırılmaktadır. 30. satırdan 33. satıra kadar hesaplar üzerinde yineleme yapılacak ve merhaba denilecek belirli hesap çıkarılacaktır. Ardından, programın hesaba yazabilmesini sağlamak amacıyla hesabın sahibi kontrol edilecek ve program_id ile eşit olması gerekecektir. Son olarak, greeting_account, try_from_slice ile çıkarılacak ve sayaç 1 artırılacaktır.

3.2 Programı Derleme

Programı derlemek için aşağıdaki komutla Solana CLI'yi yüklememiz gerekmektedir.

sh -c "$(curl -sSfL https://release.solana.com/v1.9.9/install)"

Solana CLI'nin başarıyla yüklendiğini doğrulamak için aşağıdaki komutla sürümünü kontrol edebiliriz.

solana --version

Rust ve NodeJS'in de gerekli olduğunu unutmayınız.

Programı derlemek için aşağıdaki komutu kullanabiliriz.

cargo build-bpf --manifest-path=./src/program-rust/Cargo.toml --bpf-out-dir=dist/program

Derlenen program, --bpf-out-dir ile belirtilen dizinin altında helloworld.so adıyla oluşturulacaktır.

3.3 Sözleşmeyi Dağıtma

Derlenen programı Solana üzerinde dağıtmak için önce bir küme seçmemiz gerekmektedir. Solana'da dört farklı küme bulunmaktadır: mainnet, testnet, devnet ve localnet. Bu yazıda, yalnızca gösterim amacıyla derlenen programı devnet üzerinde dağıtıyoruz.

Kümeyi belirtmek için aşağıdaki komutu kullanıyoruz.

solana config set --url https://api.devnet.solana.com

Ardından, dağıtım için cüzdan oluşturmamız gerekmektedir. solana-keygen new --force komutu cüzdanı oluşturmaya yardımcı olmaktadır. Daha fazla bilgi için lütfen Solana Belgeleri'ne bakınız.

Yeni oluşturulan hesabın işlem ücretlerini karşılayacak bakiyesi bulunmadığından, aşağıdaki komutla 1 SOL airdrop alıyoruz.

solana airdrop 1 <YourPublicKey> --url https://api.devnet.solana.com

Artık sözleşmeyi dağıtmaya hazırız.

solana program deploy dist/program/helloworld.so

Kullanıcılar, program ve işlemleri Devnet Gezgini'nde kontrol edebilir. Bu demoda, dağıtılmış programı bu bağlantı aracılığıyla bulabilirsiniz.

3.4 İşlem Gönderme

Solana'da işlem göndermek için istemci adı verilen betikler yazmak önerilmektedir. Neyse ki Solana, örnek kod sunmaktadır. İstemciyi çalıştırmak için önce istemci bağımlılıklarını yüklememiz gerekmektedir.

npm install 

Kurulum tamamlandıktan sonra, aşağıdaki komutla main.ts dosyasındaki main fonksiyonunu çalıştırıyoruz.

npm run start 

main fonksiyonunda istemci, önce establishConnection() fonksiyonuyla belirtilen kümeye (yani Devnet) bağlantı kurar, establishPayer fonksiyonuyla işlem ücretlerini ödeyen tarafı kontrol eder ve checkProgram fonksiyonuyla programın ve merhaba denilecek hesabın varlığını doğrular. Gerekli hesap mevcut değilse, bir işlem gönderilerek oluşturulacağını belirtmek gerekir. Gösterimizde, hesap bu işlemde oluşturulmuştur.

Her şey hazır olduğunda, hedef hesaba merhaba demek için sayHello fonksiyonu çağrılır. İşlem bir talimat içermektedir. Bu talimat, bir hesap içeren keys'i alır. Hesabın açık anahtarı (yani greetedPubkey), merhaba denilecek hedef hesaptır. Bu hesabın depolama amacıyla kullanıldığını ve bir imzalayan olmadığını belirtmek gerekir. Bu durumda isSigner niteliği false iken isWritable niteliği true'dur. programId, greetedPubkey'in sahibidir ve aynı zamanda dağıtılmış sözleşmenin adresidir. data'nın boş olduğunu ve bu işlemde kullanılmayacağını belirtmek gerekir. 208. satırda sendAndConfirmTransaction fonksiyonu çağrılır ve işlem kümeye gönderilir.

Ayrıntılı işlemi buradan görüntüleyebilirsiniz.

4. Sonuç

Bu makalede, Solana'nın arka planını kısaca tanıttık ve örnek projeyi (yani Hello World) inceledik. Solana üzerinde bir programın nasıl dağıtılacağını ve zincir üzerindeki programla etkileşim kurmak için istemcinin nasıl kullanılacağını öğrendik. Blogumuzu takip etmeye devam edin; bu seri için düzenli olarak daha fazla makale yayınlayacağız.

Bu serideki diğer makaleleri okuyun: