Giriş
2024 yılında Solana, Toplam Kilitli Değeri (TVL) yılın başındaki bir milyar USD'den neredeyse beş milyar USD'ye fırlayarak dramatik bir şekilde yükseldi ve dördüncü en büyük halka açık blok zinciri haline geldi.
Ethereum ile karşılaştırıldığında, Solana kullanıcılara daha hızlı işlem süreleri ve düşük maliyetlerle üstün bir deneyim sunar. Tarihsel Kanıt (Proof of History) tabanlı mutabakat mekanizması ve asenkron işlem işleme modeli, geliştiricilere yüksek işlem hacmi ve düşük gecikme süresi sunarak her türlü merkeziyetsiz uygulama için tercih edilen bir platform haline getirir.
BlockSec, Solana'nın temel kavramlarını, Solana işlemlerini analiz etmeye yönelik pratik kılavuzları ve Solana akıllı sözleşmeleri yazma eğitimlerini kapsayan "Solana Basitleştirildi" serisini özel olarak planladı.
Bu serinin ilk makalesi olarak, bu metin; doğru ve verimli akıllı sözleşmeler yazmanın temelini oluşturmak amacıyla Solana ağındaki çalışma mekanizmaları, hesap modeli ve işlemler dahil olmak üzere temel kavramları ayrıntılı biçimde ele alacaktır.
eBPF: Solana İşlem Yürütmenin Temel Taşı
Akıllı sözleşmeler yazmak ve yürütmek için blok zincirleri genellikle bir programlama dili ve Turing-tam bir hesaplama ortamı gerektirir.
Ethereum'daki akıllı sözleşmeler genellikle Solidity adlı üst düzey bir dilde yazılır. Derleyici bunları bayt koduna çevirir ve bu bayt kodu Ethereum Sanal Makinesi'nde (EVM) çalıştırılır. Tamamen yeni bir sanal ortam ve dil geliştirmek yerine Solana, mevcut gelişmiş teknolojilerden tam anlamıyla yararlanmayı tercih etmiştir. Başlangıçta Linux çekirdeği işlevlerini genişletmek için tasarlanan eBPF (genişletilmiş Berkeley Paket Filtresi) sanal makinesi, Solana tarafından temel yürütme ortamı olarak seçilmiştir.
Peki eBPF, EVM'ye kıyasla ne gibi avantajlar sunar?
Yalnızca yorumlamalı yürütmeyle sınırlı olan EVM'nin aksine, eBPF Tam Zamanında (JIT) derlemeyi destekler; bu sayede bayt kodunu işlemcinin doğrudan çalıştırabileceği makine talimatlarına çevirebilir. Bu yetenek, program verimliliğini önemli ölçüde artırır.
Ayrıca eBPF, verimli bir komut setine ve olgun bir altyapıya sahiptir. Geliştiriciler, Rust dili kullanarak akıllı sözleşmeler yazabilir. LLVM derleyici çerçevesinin eBPF arka ucundan yararlanılarak Rust programları doğrudan eBPF bayt koduna derlenebilir.
Solana'nın Hesap Modeli
Solana Hesap Yapısı
Veriler, Solana'da hesaplar biçiminde depolanır. Aşağıda gösterildiği gibi, Solana'daki tüm veriler büyük bir anahtar-değer veritabanı olarak kavramsallaştırılabilir. Bu veritabanındaki anahtarlar, hesap adresleridir. "Cüzdan" hesapları (yani Solana kullanıcıları tarafından açık-özel anahtar çiftleri aracılığıyla doğrudan kontrol edilen hesaplar) için bu adresler, Ed25519 imza sistemi kullanılarak oluşturulan açık anahtarlardır. Veritabanındaki değerler ise bakiye ve diğer ilgili bilgiler dahil olmak üzere her hesabın belirli ayrıntılarından oluşur.
Solana, bir hesabı tanımlamak için AccountInfo olarak bilinen aşağıdaki yapıyı kullanır.
Her hesabın AccountInfo'su dört alan içerir. Her birinin açıklaması aşağıdadır:
-
DataAlanı: Bu alan, hesapla ilgili verileri depolar. Hesap bir program ise (yani bir akıllı sözleşme), eBPF bayt kodunu depolar. Aksi takdirde, verinin formatı genellikle hesap oluşturucu tarafından tanımlanır. -
ExecutableAlanı: Bu alan, hesabın bir program olup olmadığını belirtmek için kullanılır. Ethereum'un aksine, Solana'daki programların güncellenebileceğini belirtmek önemlidir. -
LamportsAlanı: Bu alan, hesaptaki Solana token bakiyesini kaydeder. Lamport'lar aslında SOL Token'ının en küçük birimidir (1 SOL = 1 milyar Lamport). -
OwnerAlanı: Bu alan, hesabın sahibini gösterir. Solana'da her hesabın bir "Sahibi" vardır. Örneğin, tüm "cüzdan" hesaplarının sahibi, hesap oluşturma gibi işlevlerden sorumlu olan Solana ağındaki özel bir hesap olan System Program'dır. Hesap sahibi, hesap verilerini değiştirebilen ve bakiyeden Lamport düşebilen tek taraftır (ancak herkes, hesaba fon aktararak Lamport miktarını artırabilir).
Önceden Tanımlanmış Solana Hesapları
Solana'nın, Native Programs olarak bilinen ve sabit adreslerde dağıtılmış bir dizi önceden tanımlanmış yürütülebilir programı vardır. Solana ağı güncellendikçe bu önceden tanımlanmış programlar da güncellenebilir. API'ler ve kütüphane fonksiyonları olarak hizmet ederek Solana ağı içinde belirli işlevler sunarlar.
Native Programs içinde geliştiricilerin sıklıkla etkileşime girdiği program System Program'dır. System Program, geliştiricilere her biri bağımsız bir görev gerçekleştiren bir dizi talimat sunar. Örneğin, geliştiriciler yeni hesaplar oluşturmak için CreateAccount talimatını veya diğer hesaplara Lamport aktarmak için Transfer talimatını kullanabilir.
Bir diğer yaygın Native Programs ise BPF Loader programıdır. Diğer tüm program hesaplarının sahibidir ve özel programların dağıtılmasından, güncellenmesinden ve yürütülmesinden sorumludur. Bir "cüzdan" hesabının dağıttığı bir programı güncellemesi gerektiğinde, bu işlem aslında BPF Loader programına devredilerek gerçekleştirilir; çünkü yalnızca bir programın sahibi verileri doğrudan değiştirme yetkisine sahiptir.
Native Programs'a ek olarak Solana, Sysvars olarak bilinen bir dizi hesap da sunar. Bu hesaplar, Solana'daki programlara geçerli saat ve en son blok karması gibi Solana ağının mevcut durumuyla ilgili bilgi ve genel değişkenler sağlar.
Hesap Kirası
Solana blok zincirinde, her hesabın kira olarak bilinen belirli sayıda Lamport'u asgari bakiye olarak tutması gerekir. Gerçek hayattaki kiradan farklı olarak Solana'daki kira geri alınabilir. Bir hesaptaki verilerin zincir üzerinde mevcut olmasını sağlamak için, hesabın uygun miktarda Lamport bulundurması gerekir. Kira miktarı, hesabın kapladığı veri boyutuyla ilişkilidir.
Hesap bakiyesini kira miktarının altına indirmeye çalışan herhangi bir işlem, bakiyeyi tam olarak sıfıra indirmedikçe başarısız olacaktır. Bakiyenin sıfıra düşürülmesi, hesabın kirasının geri alındığını gösterir ve işlemin sonunda Solana, çöp toplama sürecinde ilgili hesabın verilerini temizler.
🧐 Solana Tarayıcılarında Solana Hesaplarını Görüntüleme
Yukarıda bahsedilen kavramları daha iyi anlamak için Solana'nın "Hello World" projesini kullanarak bir program hesabı dağıttık; bu hesap, Solana'nın blok zinciri gezgini olan Solscan kullanılarak görüntülenebilir.

Yukarıdaki görselde göründüğü gibi, hesabın "Program" olarak etiketlendiğini ilk olarak görebiliriz. Bu hesap için kira olarak gönderenin bakiyesinden bir miktar Lamport düşülmüştür; dolayısıyla SOL Balance alanı boş değildir. Ayrıca oluşturduğumuz hesap bir program olduğundan, Executable alanı Evet olarak ayarlanmıştır.
Executable Data alanının bir eBPF programı yerine bir adres depoladığını görünce kafanız karışabilir. Daha önce belirtildiği gibi, Solana program güncellemelerine izin verir ve bu durum aslında bir "proxy" deseni aracılığıyla uygulanır. Program hesabında doğrudan değişiklik yapılmasına başlangıçta izin verilmediğinden, Solana eBPF programını depolamak için ayrı bir veri hesabı oluşturur; program hesabındaki Data alanı ise yalnızca bu veri hesabının adresini depolar.
Programın güncellenmesi gerektiğinde, yalnızca veri hesabının Data alanının değiştirilmesi yeterlidir. Veri hesabını Solscan ile görüntülediğimizde, "Program Executable Data Account" olarak işaretlendiğini ve Data alanının gerçek programı depoladığını görebiliriz.

"More Info" bölümündeki Owner alanı, daha önce belirtildiğiyle tutarlı biçimde BPF Loader'dır.
Bazıları "Overview"ın son alanının AccountInfo'da bulunmayan Upgrade Authority olduğunu fark edebilir. Bu ne anlama gelir?
Daha önce belirtildiği gibi, "cüzdan" hesabı program güncellemelerini BPF Loader'a devreder. Güncelleme öncesinde BPF Loader, devredenin programı ilk dağıtan hesap olup olmadığını doğrular. Program hesabının Owner'ı zaten BPF Loader olarak ayarlandığından, bu bilgiyi depolamak için alan kalmaz. Bu nedenle Solana, bu bilgiyi veri hesabının Data alanına yerleştirir. "Overview"da bir Upgrade Authority alanının bulunmasının nedeni budur ve bu alan aslında programı dağıtan cüzdan adresidir.
Aşağıdaki görsel, program hesabı ile veri hesabı arasındaki ilişkiyi göstermektedir. Veri hesabının Data alanının hem cüzdan adresinden hem de eBPF kodundan oluştuğuna dikkat edin.

Solana'da İşlemler ve Talimatlar
Solana'da kullanıcılar, işlem göndererek programları çalıştırır. Solana'nın kendine özgü bir yönü, bu işlemleri paralel olarak yürütebilmesidir; bu durum, son derece hızlı işlem hızlarının arkasındaki temel nedenlerden biridir. Şimdi Solana'da işlemlerin nasıl tasarlandığına daha yakından bakalım.
Bir Solana işlemi; imzalardan ve bir mesajdan oluşur. Bir işlem birden fazla imza içerebilir. Bir işlemin mesajı, aşağıda gösterildiği gibi dört bölümden oluşur.

Header ve Compact Array of Account Addresses, bir işlemde yer alan tüm hesapları ve bu hesapların işlem sırasındaki özelliklerini belirtir; bunlar arasında hesabın imzalayan olup olmadığı ve yürütme sırasında yazılabilir olup olmadığı yer alır. Bu bilgilerle Solana, imzalayan hesaplar tarafından sağlanan imzaları doğrulayabilir ve aynı duruma yazan herhangi bir hesap içermedikleri sürece işlemleri paralel olarak işleyebilir.
Recent Blockhash, işlem için bir zaman damgası işlevi görür. Bir işlemin blok karması, en son blok karmasından 150 blok daha eskiyse, işlem süresi dolmuş sayılır ve yürütülmez.
Compact Array of Instructions, işlemin en önemli bölümüdür ve bir veya daha fazla talimat içerir. Bir talimat, özünde bir program hesabı tarafından sağlanan bir rutinin yürütülmesini tetikler. Her talimat, aşağıda gösterildiği gibi üç alandan oluşur.

İlk alan olan Program ID Index, talimatın alıcısını belirtir; bu, talimatı işlemesi gereken zincir üzerindeki programdır. 32 baytlık bir adres depolamak yerine, bu adres işlem mesajının Compact Array of Account Addresses içine yerleştirilir ve alan yalnızca dizideki adrese işaret eden bir u8 indeks depolar.
İlk alana benzer şekilde, ikinci alan Compact Array of Account Address Indexes olarak bilinen hesap adres indekslerini depolar. Bu dizi, bu talimatta yer alan tüm hesapları belirtir.
Son alan, programın talimatı işlemesi için gereken ek verileri (fonksiyon argümanları gibi) içeren bir bayt dizisidir.
Solana'nın bir işlem içindeki tüm talimatları sırayla işlediğini ve işlemin atomik yürütülmesini garanti ettiğini belirtmek önemlidir. Bu, işlemin ya tüm talimatlar başarıyla işlenerek tamamen tamamlandığı ya da tamamen başarısız olduğu anlamına gelir. Bazı talimatların işlenip diğerlerinin işlenmediği bir durum söz konusu olmayacaktır.
🧐 Solana Tarayıcılarında Solana İşlemlerini Görüntüleme
Daha önce program hesabını oluşturan işlemi görüntülemek için başka bir Solana gezgini kullanıyoruz. Overview bölümünde Solana işlem imzasını, son blok karmasını ve diğer bilgileri görebilirsiniz:

Account Input bölümünde, mevcut işlemde yer alan tüm hesaplar ve işlemdeki özellikleriyle birlikte listelenmektedir. Gönderici ve program hesabı adreslerine ek olarak, iki adet Native Programs ve Sysvar hesabının da dahil edildiğini görebiliriz.

Basit bir program oluşturma işlemi olduğundan yalnızca iki talimat içermektedir. İlk talimatın alıcısı, program hesabını oluşturmaktan sorumlu olan System Program'dır. İkinci talimatın alıcısı ise dağıtılan eBPF kodunu depolamak için bir veri hesabı oluşturan ve adresini program hesabının Data alanına yazan BPF Loader'dır.

Sonuç
Solana'daki akıllı sözleşmeler Rust ile geliştirilir ve eBPF sanal makinesinde çalışır. Solana, zincir üzerindeki hesapların verilerin kaldırılmasını önlemek için yeterli kira tutması gereken hesap modelini benimser. Bir işlem, gerekli tüm hesapları tanımlayan bir veya daha fazla talimatdan oluşur; bu durum paralel işlemeyi mümkün kılarak iş hacmini artırır ve yanıt gecikmesini azaltır. Bu özellikler bir arada Solana'nın hızlı gelişimine katkıda bulunmuş ve onu tercih edilen blok zincirlerinden biri haline getirmiştir.



