Back to Blog

Solana Ekosistemini Güvence Altına Alın (5) — Çoklu İmza

April 10, 2022
5 min read

0. İnceleme

1. Genel Bakış

Önceki blog yazısında, Solana programlarında erişim kontrolü açısından önemli olan hesap doğrulamayı ele aldık. Ancak merkeziyetsiz bir DApp için ve olası özel anahtar sızıntısına karşı koruma sağlamak amacıyla çoklu imza (multi-sig) son derece önemlidir. Bu yazıda, Multi-Sig'in uygulanmasını tanıtacağız.

2. Çoklu İmzanın (Multi-Sig) Kavramı

Multi-Sig, bir grup kullanıcının tek bir işlemi imzalamasına olanak tanıyan dijital bir imza şemasıdır. İşlem; bir ayrıcalıklı fonksiyona yapılan çağrı (örn. mint), bir fon transferi talimatı vb. olabilir. Multi-sig mekanizması şu şekilde çalışır: kendi özel anahtarlarına sahip n taraf göz önüne alındığında, işlemi gerçekleştirmek için bu özel anahtarlardan en az m tanesinin imzalaması gerekir. Bu durum, DeFi'deki fonları çok daha güvenli hale getirir ve özel anahtar sızıntısı ile rug pull gibi potansiyel risklere karşı koruma sağlar.

3. Multi-Sig Kullanımı

Solana'da, OpenZeppelin tarafından geliştirilen multi-sig mantığına oldukça benzer olan Serum'dan bir multi-sig programı bulunmaktadır. Bu program, birden fazla kullanıcının bir işlemi tamamen zincir üzerinde imzalamasına olanak tanır. Ancak, gerekli tüm imzaları zincir dışında toplayabilirseniz süreç daha kolay olabilir. Bunu açıklamak için, önceki yazıdaki test koduna multi-sig işlevselliği ekliyoruz. Tüm test kodları burada bulunabilir.

3.1 Kod İncelemesi

Son tanıtılan projede, config hesabının yöneticisini bir multisig hesabıyla değiştiriyoruz. Bu durumda, Lock ve Unlock talimatlarını gerçekleştirmek için istemci, işleme geçerli sahiplerin yeterli sayıda imzasını dahil etmek zorunda kalacaktır.

Dört öznitelikten oluşan Multisig adlı bir yapı ekliyoruz. Bu öznitelikler sırasıyla şunlardır: talimatı yürütmek için gereken imza sayısı, geçerli imzalayanların toplam sayısı, hesabın durumu (başlatılmış olup olmadığı) ve geçerli imzalayanların açık anahtar dizisi.

Buna karşılık olarak, instruction.rs dosyasına da InitializeMultisig talimatını ekliyoruz. İstemci tarafından m (u8) argümanını aldığına dikkat edin. Bu değer InitializeMultisig() fonksiyonuna beslenecektir.

InitializeMultisig() fonksiyonu, oluşturulan hesapları ve m değerini alır. Hesabın kötü niyetli kullanıcılar tarafından yeniden başlatılmasını önlemek için, hesabın zaten başlatılmış olup olmadığını doğruluyoruz (satır 385-388). Ardından, m, n değerlerini ve imzalayanların açık anahtarını atayarak multi-sig hesabını başlatıyoruz.

Lock() fonksiyonunda, config hesabının yönetici hesabının bir multi-sig hesabı olup olmadığını kontrol ediyoruz. Eğer öyleyse, iletilen imzaları doğrulayıp sayıyoruz (satır 151 - 158). Geçerli imza sayısı gerekli miktara ulaştığında veya aştığında, kapılar kilitlenecektir (satır 163 - 168). Unlock() fonksiyonundaki multi-sig uygulaması, Lock() fonksiyonuna benzerdir.

Programı test ağında dağıttık ve aşağıdaki bağlantıdan erişilebilir.

https://explorer.solana.com/address/4g5ZA47pDQ1Bv93aNYdSKAXB6DvPAnnbi9cNEx7722SK?cluster=testnet

3.2 İşlem Gönderme

InitializeMultisig() fonksiyonunda, keys dört hesap içerir. Bunlar; multisig hesabı ve üç geçerli imzalayan hesabıdır. İmzalayanlardan birinin aynı zamanda işlemin ücret ödeyicisi olduğuna dikkat edin. m değerini 2 olarak ayarlıyoruz; bu, ayrıcalıklı fonksiyonları yürütmek için üç imzalayanın ikisinin imzasının gerekli olduğu anlamına gelir.

Ayrıca, talimat verilerinde multisig hesabının açık anahtarını geçirerek config hesabının yöneticisini multisig hesabı olarak ayarlıyoruz.

lock() fonksiyonunda, config hesabına (satır 410) ek olarak multisig hesabını (satır 411) ve en az iki geçerli imzalayanın hesabını (satır 412 - satır 413) iletiyoruz. İmzalayanlar için isSigner özniteliğini true olarak ayarlıyoruz. Yine, unlock() fonksiyonunun mantığı buna benzerdir.

Tüm test işlemleri aşağıda listelenmiştir. Sürecin tamamı şu şekildedir: AllocatePDA() -> InitializeMultisig() -> InitializeDoor() -> InitializeConfig() -> Unlock() -> Open() -> Close() -> Lock().

https://explorer.solana.com/tx/2inXLHv34NzkmwmvQ7iimdNbEX2Hj8qWS3MVteAPtwhCAPy1yxXXdvfzMmUL7tESsd4wat4LMcPNiEQav18kQTrZ?cluster=testnet
https://explorer.solana.com/tx/4GErNusHLXpUHBsAJ55c7v1Ur1jfv5hAR88CK8nabLnzc92b1UhDnNRryKVjKmcnJDXppmyk6m5RUdpR2w7MEbrU?cluster=testnet
https://explorer.solana.com/tx/2S8h66oWfh7cn4fwFCVPtgGw1o3NgzyWwU1GyRpDjH4PEBfe8LDMZGAEBYLRJpzL3anH9ENShntjg3q5K8gcZSrN?cluster=testnet
https://explorer.solana.com/tx/nVKxPYegbpH324y57uHDZiajpNA5u4bSSJ2gHFHHRx4GJBy1DcpxnccKh1Ltkv9dah1qJNi9jWuBnXbyHWXCJyw?cluster=testnet
https://explorer.solana.com/tx/3KK5CU88oV59VfdTrNpT4LsiUsetuGdc6qW3sNyyGEWVYtKJfD6XA2Nfknrriwuka9wknHpZs3WZ1WkeduDA1pZX?cluster=testnet
https://explorer.solana.com/tx/3rFo37CrLSsMehLk4kwmMSDnbRfLfoPCWZzRDXhwwLg1uq32gu4ddxkYYB3pJX1yiMN8MofnV1Y9CSaf8bQaNJ9Y?cluster=testnet
https://explorer.solana.com/tx/5yFq4dZAMpccn96jKNkYFVcmhmtrwZYSFEQ6pkNgSMd7e1Vy1ztAM3RdFUZjEtThjFssz1TFytowePPyY59we9rX?cluster=testnet
https://explorer.solana.com/tx/3Ut4DqjCQi1MoCsjRx24DxykyDMsmyRsjJSXS7D4FBeZQwrx4UzxWt2gDe6YRiwUHzFkH3eWkFHub6FNSp2Us4Q7?cluster=testnet

3.3 Test İşlemi

Multi-sig'in gerçekten çalışıp çalışmadığını test etmek için istemcinin betiğini değiştiriyoruz.

Yukarıda gösterildiği gibi, yalnızca bir imzalayan hesabı iletiyoruz ve yalnızca bir geçerli imza sağlıyoruz.

Yetersiz imza nedeniyle kapının kilidinin açılamadığını fark ettik.

4. Özet

Bu makalede, Solana'da multi-sig'in basit uygulamasını tanıtıyoruz. Bu, imzaları birden fazla kullanıcıdan zincir dışında toplayabildiğiniz senaryo içindir. İşlemlerin tamamen zincir üzerinde imzalanmasının gerektiği senaryo ise daha sonra tanıtılacaktır. Takipte kalın, önümüzdeki yazılarda daha fazlasını paylaşacağız.

Bu serideki diğer makaleleri okuyun:


BlockSec Hakkında

BlockSec, 2021 yılında dünya genelinde tanınan güvenlik uzmanlarından oluşan bir grup tarafından kurulmuş ö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ırmaya adanmıştır. Bu doğrultuda BlockSec; akıllı sözleşme ve EVM zinciri güvenlik denetimi hizmetleri, güvenlik geliştirme ve tehditleri proaktif olarak engellemeye yönelik Phalcon platformu, fon takibi ve soruşturma için MetaSleuth platformu ve web3 geliştiricilerinin kripto dünyasında verimli gezinmesi için MetaSuites eklentisini sunmaktadır.

Şirket bugüne kadar 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ılardan iki tur finansmanda on milyonlarca ABD doları almıştır.

Resmi web sitesi: https://blocksec.com/

Resmi Twitter hesabı: https://twitter.com/BlockSecTeam