Back to Blog

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

April 24, 2022
5 min read

0. İnceleme

1. Genel Bakış

Önceki yazıda, Çoklu İmza'nın uygulamasını ele almıştık. Ancak bu uygulama, birden fazla kullanıcıdan gelen imzaların zincir dışında aynı anda toplanabileceğini varsaymaktadır. Bu yazıda, kullanıcıların imzaları tamamen zincir üzerinde atmasına olanak tanıyan daha genel bir Çoklu İmza programı sunuyoruz.

2. Test Programının Tasarımı

Çoklu imza programı, geçerli imzacıların öneriyi ayrı ayrı imzalamasına olanak tanır ve yeterli imza toplandığında (onaylandığında) herkes öneriyi yürütebilir. Tüm test kodları burada bulunabilir.

3. Kod İncelemesi

Bu program iki yeni yapı tanıtmaktadır: TransactionAccount ve Transaction. TransactionAccount yapısı, önerilen işlem için kullanılan hesap bilgilerini kaydetmek amacıyla tasarlanmıştır. Transaction yapısı ise bir önerinin bilgilerini kaydetmek için kullanılır. signers özelliğinin geçerli imza sayısını kaydetmek için kullanıldığına dikkat edin. did_execute ve is_initialized, yürütme ve başlatma işlemlerinin yalnızca bir kez yapılabilmesini sağlar.

Program beş farklı talimat sunmaktadır. AllocatePDA talimatı, benzersiz bir PDA hesabı oluşturmayı amaçlar ve bunu multisig hesabı olarak kullanır. Tüm geçerli imzacıların bilgilerini kaydeder. InitializeMultisig talimatında, talimatın yürütülmesi için gereken imza sayısını ve geçerli imzacıların açık anahtarlarından oluşan diziyi ayarlarız. CreateTransaction talimatı bir öneri oluşturmak için kullanılırken, imzacılar approve talimatı aracılığıyla öneriyi onaylayabilir. Onay sayısı multisig'de belirlenen eşiğe ulaştığında, işlemi yürütmek için ExecuteTransaction talimatı çağrılabilir.

Bir öneri göndermek için kullanıcılar createTransaction() talimatını çağırabilir. Bu talimat üç hesap alır: oluşturulan transaction hesabı ve ardından gelen iki hesap hedef işlem tarafından kullanılır. Hesabın kötü niyetli kullanıcılar tarafından yeniden başlatılmasını önlemek amacıyla is_initialized özelliğini kontrol ederiz (satır 161-163). Bunun ardından, TransactionAccount yapısını belirtilen verilerle başlatır ve veri hesabına serileştiririz (satır 188).

Approve() fonksiyonunda, önce Transaction hesabının ve multisig hesabının programa ait olup olmadığını kontrol ederiz. Herhangi bir kontrol yapılmazsa, diğer programlardan oluşturulan hesapların burada kötü niyetli kullanıcılar tarafından kullanılabileceğine dikkat edin. Ardından, imzacının açık anahtarını multisig hesabında saklanan anahtarlarla eşleştiririz. Eşleşme sağlanırsa imzanızı doğrular ve değeri buna karşılık gelen şekilde true olarak değiştirir.

ExecuteTransaction() talimatında, geçerli imza sayısını sayarız. Sayı eşiğe ulaşmazsa program geri döner.

Bunun ardından, hedef Instruction'ı belirtilen özelliklerle başlatırız ve invoke_signed() fonksiyonu aracılığıyla hedef programın talimatını çağırırız. Son olarak, önerinin tekrar tekrar yürütülmesini önlemek için did_execute özelliğini true olarak ayarlarız.

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

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

4. İşlem Gönderme

Dağıtımın ardından önce multisig hesabını oluşturuyoruz ve config hesabını başlatırken multisig hesabını config hesabının yöneticisi olarak ayarlıyoruz. İlgili işlemler aşağıda gösterilmekte olup sıralama şöyledir: createMultisig() (General-Multisig'de) -> PriviligeOwner programını Dağıt -> Allocate() (PrivligeOwner'da) -> InitializeConfig() (PrivligeOwner'da).

https://explorer.solana.com/tx/2vXHmwbCsARstx8wi4eLACbrb6PuZZMktsqU8VnJLp64fvrpaE62QSTn5QLczzxnTvxRLWMSR3dKLGYXZasGMn69?cluster=testnet
https://explorer.solana.com/tx/2EMq9y6HNnXq1n2XsqrBkJd8RGL27PCj5T4JyJ71ZoA3ipUggT6dF6S6uDv4TtxGGKk8BmiAJHS7BFRgZqWjkWVb?cluster=testnet
https://explorer.solana.com/tx/3UhXKsTubUiPqRtLyNYskxvbyrTKHsbeptxuAfJQ348AU4b8gQET2HAMaqxwud6Wo3MKTYHWBneqa9z2WhCpwV6t?cluster=testnet
https://explorer.solana.com/tx/5NA7Yw23uRf48Q3BYM21dtS7gD9YMECij43ZaRLMPe7svt3bsv2TPWwbCRP5akDmttjLEHWZtpqrZrVLNr9QLyJY?cluster=testnet

Ardından InitializeMultisig() talimatını çağırıyoruz. Dört hesap iletiyoruz: multisig hesabı ve üç geçerli imzacının hesapları. m değerini 2 olarak ayarladık; bu, ayrıcalıklı fonksiyonları yürütmek için üç imzacıdan ikisinin imzasının gerekli olduğu anlamına gelir.

CreateTransaction() fonksiyonunda, oluşturulan Transaction hesabını, hedef programın açık anahtarını (PrivilegeOwner) ve config hesabının açık anahtarını iletiyoruz (satır 306 - satır 307). Bunun yanı sıra, _data değerini 3 olarak ayarlamalıyız; bu değer PrivilegeOwner programındaki unlock() talimatına karşılık gelir.

İlk testte, yalnızca bir imzacı oluşturulan öneriyi onaylar. Bu durumda, yeterli imza toplanamadığından ExecuteTransaction() başarısız olur. Konsol aşağıdaki çıktıyı yazdırır.

Başka bir imzacı oluşturulan öneriyi onaylar ve ExecuteTransaction()'ı çağırır. Toplam imza sayısı eşiğe ulaştığından öneri başarıyla yürütülür.

https://explorer.solana.com/tx/55Qy93RxybsT7c5v9AFgN8Dt1h3AVJfbsosLbstYVB6paY1wmau5sdtLfGpfryXnZTsBNRauvwLSmAu2nABFxVCe?cluster=testnet
https://explorer.solana.com/tx/4XF4MUhL4oftkDt4sn7NoREmGqcDMVP6HGypvJQMtiAbBKiCuy4B98vhQKtvm4mPv7SprrDDVsiwgb6pNwgJcTwz?cluster=testnet

4. Özet

Bu makalede, Solana'da çoklu imzanın genel uygulamasını tanıtıyoruz. Uygulama, PDA'nın özelliğinden yararlanmakta olup geçerli imza sayısı gereksinimi karşıladığında programın işlemi PDA aracılığıyla otomatik olarak imzalamasına olanak tanı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, geniş kitlelerce 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 amacıyla Phalcon platformu, fon takibi ve araştırma için MetaSleuth platformu ve web3 geliştiricilerinin kripto dünyasında verimli şekilde gezinmesi için MetaSuites eklentisi sunmaktadır.

Bugüne kadar şirket, MetaMask, Uniswap Foundation, Compound, Forta ve PancakeSwap gibi 300'den fazla seçkin müşteriye hizmet vermiş; Matrix Partners, Vitalbridge Capital ve Fenbushi Capital dahil önde gelen yatırımcılardan iki finansman turunda on milyonlarca ABD doları almıştır.

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

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