
0. İnceleme
- Solana Ekosistemini Güvence Altına Alma (1) — Merhaba Solana
- Solana Ekosistemini Güvence Altına Alma (2) — Programlar Arası Çağrı
1. Genel Bakış
Önceki blog yazısında, invoke fonksiyonu ve invoke_signed fonksiyonu aracılığıyla programlar arası çağrının nasıl gerçekleştirileceğini tanıttık. Bu yazıda, bir diğer temel konuyu ele alacağız: Program Yükseltme.
2. Yükseltilebilir Bir Program Dağıtma
Varsayılan olarak, dağıtılan tüm programlar Solana'da BPFLoaderUpgradeable yükleyicisiyle dağıtılır; bu da yükseltilebilecekleri anlamına gelir. Bunun yanı sıra Solana, dağıtılan programın değiştirilemez olmasını sağlamak için --final seçeneğini sunar. Bu durumda programı dağıtmak için BPFLoader2 yükleyicisi kullanılır. Bir kez dağıtıldığında program yükseltilemez.
BPFLoaderUpgradeable yükleyici programı üç tür hesabı yönetir: program hesapları, program veri hesapları ve arabellek hesapları. Dağıtım sürecinde önce bir arabellek hesabı oluşturulur. Ardından Solana CLI, hedef programın bayt kodlarını yükler ve bunları arabellek hesabına yazar. Son olarak, arabellek hesabında depolanan bayt kodları program veri hesabına kopyalanır.
Dolayısıyla arabellek hesapları, Yükseltilebilir BPF yükleyicisi tarafından dağıtım sürecinde bayt kodlarını geçici olarak depolamak için kullanılır; program veri hesapları bir programın gerçek verilerini depolar; program hesapları ise ilgili program veri hesaplarına işaret eden birer vekil görevi görür.
Aşağıda, programınızı nasıl yükselteceğinize dair birkaç örneği inceleyelim. Bu yazıda kullanılan tüm kodlar burada bulunabilir.
2.1 Kod İncelemesi (Rectangle_Area)

Bu örnek sözleşmede, 13. satırdan 17. satıra kadar width, height ve area olmak üzere üç özellik içeren Rectangle adlı bir yapı tanımlıyoruz. Ayrıca Rectangle için bir area() fonksiyonu tanımlıyoruz. area() fonksiyonu, dikdörtgenin alanını width ve height kullanarak hesaplar.

process_instruction() fonksiyonunda, önce unpack_u32() fonksiyonunu kullanarak dikdörtgenin width ve height değerlerini komut verilerinden çıkarıyoruz (45. satır - 46. satır). 51. satırda, dikdörtgenin verilerini depolamak için kullanılan hesap çıkarılır. 59. satırda, try_from_slice_unchecked() fonksiyonu hesabın verilerini Rectangle yapısı türüyle seri dışı bırakır. Ardından verileri yapının ilgili alanlarına atayarak alan değerini hesaplıyoruz (61. satır - 63. satır). Son adım, verileri seri hale getirip veri hesabına geri yazmaktır.
Dağıtılan program aşağıdaki bağlantıda bulunabilir.
https://explorer.solana.com/address/84mMqHRTQT6b2vfsD7XRxVKA3XMd7xoEXFdF6pLNw8y?cluster=testnet
2.2 İşlem Gönderme

İstemci tarafında, önce veri depolamak için bir hesap oluşturmak amacıyla bir işlem gönderiyoruz. Yeterli olmasını sağlamak için alan boyutunu 1.024 bayt olarak belirliyoruz.

Ardından dikdörtgenin alanını hesaplamak ve bunu veri hesabına depolamak için başka bir işlem gönderiyoruz.
İşlem aşağıdaki bağlantıda bulunabilir.
https://explorer.solana.com/tx/4PybjXGRpuPKpak7FAz4BKMbcQCWmway69zAxtTnpFRuTTg7onyxW7agSe6ETx44iAGexbgnBUa8WdzdTTQSawJ3?cluster=testnet
3. Yükseltme
Şimdi, dikdörtgenin çevresini hesaplamak için programa yeni bir fonksiyon eklemek istiyoruz.

Güncellenen projeyi derledikten sonra, aşağıdaki komutla zincirdeki dağıtılmış programı yükseltiyoruz.
solana program deploy /path/to/program.so --program-id <PROGRAM_ID>
Sözleşme doğrudan yükseltilebilir ve ilgili işlemi aşağıda görüntüleyebilirsiniz.
https://explorer.solana.com/tx/4Dm9v4zMiijKjQBhatx1D9xbV9PvMLdaonUWLaC2VwzkFvzdgorzbX5vsy4VQ7VxSUmqadftjiDzbyUmXgQchYmk?cluster=testnet
Yükseltmenin başarılı olduğunu doğrulamak için programa bir işlem daha gönderiyoruz. Sonuç, fonksiyonun düzgün çalıştığını gösteriyor.
İlgili işlem aşağıda bulunabilir.
https://explorer.solana.com/tx/21c2G7kPVktAtdUFkH3QwGVi7orajRmy5PJo1UxX1mmAMU68eUkNuLzWYJRBaTzwGi5DxeocYjHfpWiU4hcSFtpQ?cluster=testnet
4. Tekrar Yükseltme

Bu sefer hesaplanan çevreyi veri hesabında depolamak istiyoruz. Bu durumda, Rectangle yapısına bir perimeter özelliği daha ekliyoruz (18. satır).

Veri hesabının yapısı bir öncekinden farklı olduğundan, önce veri hesabından verileri okumamız gerekiyor. Depolanan verileri orijinal yapıyı kullanarak (yani OldRectangle) seri dışı bırakıyoruz. Ardından ilgili öznitelikleri yeni yapıya (yani CurrentRectangle) atayarak yeni özniteliği (yani perimeter) başlatıyoruz.

Son olarak, çevre değerini hesaplıyor ve account_data'ya seri hale getirmeden önce bunu update_account'a geri atıyoruz.
Yükseltme işlemi aşağıda bulunabilir.
https://explorer.solana.com/tx/5J3oKxZXtCi755gD7pMnVh48AFvmeVzRLPgJiyNn8JFeCKx1xpAfJtsi34zjyYKJmnMk8LtC3bcwfFSP7H2gtj5o?cluster=testnet
Yükseltmenin ardından, solana account <DataAccount> komutuyla hesapta depolanan verileri kontrol edebilirsiniz. Özniteliklerin ilk 32 bayta depolandığını görebilirsiniz. Tüm yükseltme süreci tamamlanmıştır.

5. Sonuç
Bu makalede, Solana'da bir programın nasıl yükseltilebileceğini tanıttık. Ayrıntılı süreci açıklamak için farklı örnekler kullandık. Bizi takip etmeye devam edin; Solana hakkında daha fazla makale yayınlanacak.
Bu serideki diğer makaleleri okuyun:
- Solana Ekosistemini Güvence Altına Alma (1) — Merhaba Solana
- Solana Ekosistemini Güvence Altına Alma (2) — Programlar Arası Çağrı
- Solana Ekosistemini Güvence Altına Alma (4) — Hesap Doğrulama
- Solana Ekosistemini Güvence Altına Alma (5) — Çoklu İmza
- Solana Ekosistemini Güvence Altına Alma (6) — Çoklu İmza 2
- Solana Ekosistemini Güvence Altına Alma (7) — Tür Karışıklığı
BlockSec Hakkında
BlockSec, 2021 yılında küresel alanda tanınmış güvenlik uzmanlarından oluşan bir grup tarafından kurulan öncü bir blok zinciri güvenlik şirketidir. Şirket, kitlesel benimsenmesini kolaylaştırmak amacıyla gelişmekte olan Web3 dünyasının güvenliğini ve kullanılabilirliğini artırmayı taahhüt etmektedir. Bu doğrultuda BlockSec, akıllı sözleşme ve EVM zinciri güvenlik denetimi hizmetleri, güvenlik geliştirme ve tehditleri proaktif olarak engelleme için Phalcon platformu, fon takibi ve soruşturma için MetaSleuth platformu ve web3 geliştiricilerinin kripto dünyasında verimli gezinmesi için MetaSuites eklentisi sunmaktadır.
Bugüne kadar şirket, MetaMask, Uniswap Foundation, Compound, Forta ve PancakeSwap gibi 300'den fazla saygın müşteriye hizmet vermiş; Matrix Partners, Vitalbridge Capital ve Fenbushi Capital gibi önde gelen yatırımcıların katıldığı iki finansman turunda on milyonlarca ABD doları yatırım almıştır.
Resmi web sitesi: https://blocksec.com/
Resmi Twitter hesabı: https://twitter.com/BlockSecTeam



