![](/img/bg-single.png)
ChatGPT ile Kendi Kendini Denetleyen Akıllı Sözleşmeler
![](https://lotusmarket.io/storage/files/self-auditing-smart-contracts-with-chat-gpt/cover.png)
Akıllı sözleşmeleri denetlerken, kodun güvenli olduğundan emin olmak için çok çeşitli konuların ele alınması gerekir. Bu sorular erişim kontrolü, varlık yönetimi, veri yönetimi, varsayımlar, bağımlılıklar ve güvenlik kontrol listeleri gibi çeşitli hususları kapsamaktadır. Aşağıda, akıllı sözleşme denetim sürecinde size rehberlik edecek ChatGPT sorguları için ayrıntılı bir kontrol listesi ve talimatlar sunuyoruz.
Bir akıllı sözleşmeyi güvenlik açıkları ve gizli dolandırıcılık teknikleri açısından kendiniz araştırmak istiyorsanız, ilk adım doğru hazırlanmış bir ChatGPT istemidir.
ChatGPT için yararlı bir sorgu aşağıdaki komut olacaktır:
Aşağıdaki akıllı sözleşmedeki tüm sorunların ve güvenlik açıklarının kapsamlı bir listesini sağlayın. Sorunları ve olası güvenlik açıklarını ayrıntılı olarak açıklayın. Her güvenlik açığı için bir istismar senaryosu sağlayın. Her biri 'açıklama', 'eylem', 'önem derecesi', 'aktörler', 'senaryo', 'tür' ve 'satır' sütunlarına sahip nesnelerin bir listesini içeren markdown biçiminde geçerli bir tablo olarak çıktı alın. 'tip', 'kullanılabilirlik', 'güvenlik açığı', 'optimizasyon' veya 'öneri' olabilir. 'aktörler' ilgili aktörlerin bir listesidir. 'önem derecesi' 'düşük', 'orta' veya 'yüksek' olabilir. 'row' sorunun satır numarasıdır. Tablodaki tüm alanların doldurulduğundan emin olun.
Daha sonra akıllı sözleşmeyi daha derinlemesine keşfetmek için aşağıdaki soruları kullanın.
Kullanım Senaryoları:
- Sistemdeki aktörler kimlerdir?
- Sistem hangi eylemlere sahiptir?
- Sistemin sınırlamaları nelerdir?
- Sistemi kırmanın bazı potansiyel yolları nelerdir?
- Saldırılara karşı koymak için hangi savunmalar kullanılır?
- Kısıtlamalara dayanarak, her bir işlevin durum değişikliklerini açıklayın.
- Kullanılan Solidity ve DeFi şablonları hakkında bilgi verin.
- Sistem hakkındaki bilgilere dayanarak olumlu ve olumsuz aksiyomlar yazın.
- Kodu daha güvenilir hale getirmek için optimize etmenin ve değiştirmenin yollarını listeleyin (kod parçacıklarıyla).
- Kodda kullanılan gizli aldatmaca yöntemlerini listeleyin (kod parçacıklarıyla).
İpucu: Verilerin görsel temsili genellikle sistemin işleyişinin daha net anlaşılmasını sağlar. ChatGPT ile çalışırken, ASCII karakter diyagramları biçimindeki durum değişiklikleri gibi çıktı verilerinin görselleştirmelerini talep etmeniz önerilir. Tüm görselleştirmeler anlamlı olmasa da, bazıları akıllı bir sözleşmenin işleyişi hakkında çok değerli bilgiler sağlayabilir.
Aslında, ChatGPT bir insan denetçinin yerini alamazken, protokol durum geçişlerinin, kısıtlamaların, değişmezlerin ve uyumluluğun daha net bir şekilde anlaşılmasını sağlayarak denetim sürecini önemli ölçüde tamamlar. Bu araç özellikle protokol durum geçişlerini ve kısıtlamalarını anlamak için etkilidir.
İpucu: Bir denetime başlamadan önce, sohbet robotuna denetlenen protokolle ilgili belgeler sağlamak, yanıtların doğruluğunu ve alaka düzeyini büyük ölçüde artırabilir. "Bu, denetlediğim 'protokol_adı' için en iyi bağlamı sağlayan belgedir" demeniz ve belgeyi eklemeniz yeterlidir.
ChatGPT'nin denetçiler için güçlü bir yardımcı olduğu ve akıllı sözleşmeleri denetlemek için yapılandırılmış ve derinlemesine bir yaklaşım sağladığı söylenebilir. Bununla birlikte, ChatGTP'nin (ve benzer hizmetlerin) olasılıklarla çalışan makine analizinin karmaşık yorumlarından ibaret olduğu, bu nedenle genellikle hatalar ve yanlışlıklar ürettiği unutulmamalıdır. Buna göre, ChatGPT sonucuna tam olarak güvenilemez - yalnızca doğru ellerde iyi bir araç ve akıllı sözleşme araştırmalarında bir "başlangıç noktasıdır".
Bu nedenle, kendinizi olası risklerden korumak için akıllı sözleşmeler olası güvenlik açıkları ve dolandırıcılık planları açısından daha dikkatli incelenmelidir.
Derinlemesine bir akıllı sözleşme denetimi nasıl yapılır? ChatGPT'ye gelen en iyi 100 talep
Yukarıda ChatGPT'ye gelen ve bir akıllı sözleşmeyi analiz etmeye başlayabileceğiniz genel bir sorguyu (istem) ele aldık. Ancak, elbette, ayrıntılı analiz giriş istemiyle sınırlı değildir.
Dolandırıcılar sürekli olarak taktiklerini geliştiriyorlar, bu nedenle birçok açıdan bilgili ve dikkatli olmanız gerekiyor - bunlar token yatırımınızı korumak için temel stratejilerdir.
Akıllı bir sözleşme denetimine profesyonel bir yaklaşım sağlayacak en iyi 100 sorgu listesine bir göz atalım:
- Kod başarıyla derleniyor mu?
- Kodda hangi Solidity sürümü kullanılıyor? Bu, mevcut kararlı sürüm mü?
- Fonksiyonların ve değişkenlerin amacını açıklayan açık yorumlar mevcut mu?
- Sözleşme bir "Ownable" şeması kullanıyor mu? Eğer evet ise, hangi fonksiyonlar için?
- Durum değişkenleri doğru bir şekilde görünürlük belirteçleri kullanılarak tahsis edilmiş mi?
- Doğru loglama için olaylar kullanılıyor mu?
- Kullanıcı dostu hata mesajları sağlanıyor mu?
- Düşük seviyeli çağrıların dönüş değeri kontrol ediliyor mu?
- Sahibin yetkilendirebileceği senaryolar var mı ve bu, rug-pull'a yol açabilir mi?
- Ayrıcalıklı hesaplar üzerinde kim kontrol sahibi ve kontrol mekanizmaları nedir?
- Sözleşmede hangi yönetim mekanizmaları mevcut ve yönetim tamamen açık mı yoksa sınırlı mı?
- Sistemde başka sözleşmeler kullanılıyor mu ve hangi rolleri üstleniyorlar (örneğin, proxy sözleşmesi)?
- Bir zaman kilitleme mekanizması var mı ve atlatılabilir mi?
- Yeterli dokümantasyon mevcut mu?
- Kodda DoS veya reentrancy saldırılarına karşı potansiyel güvenlik açıkları var mı?
- Tüm fonksiyonlar, açıkça public/external olarak belirtilmesi gerekenler haricinde internal mı?
- Matematik işlemlerinde aritmetik taşmalar/yetersizlikler yok mu?
- Güvenli OpenZeppelin kütüphanesi kullanılıyor mu?
- Ether veya tokenlar yanlışlıkla null adrese (0x0) gönderilemez mi?
- İşlemler ve durum değişikliklerinden önce şartlar require ile kontrol ediliyor mu?
- Durum, eylemlerin yürütülmesinden önce ve sırasında ayarlanıyor mu?
- Reentry (yeniden giriş) saldırılarına karşı koruma kullanılıyor mu (A, B'yi çağırır, B, A'yı çağırır)?
- ERC20 arayüzü düzgün şekilde uygulanmış mı?
- Bir modifier birden fazla yerde sadece gerçekten gerekli olduğunda mı kullanılıyor?
- Tüm türler açıkça tanımlanmış mı (örneğin, uint yerine uint256 kullanılıyor mu)?
- Tüm yöntemler ve döngüler maksimum izin verilen gaz limitine uygun mu?
- Yapıcıda gereksiz başlatmalar yok (varsayılan değerlerin ayarlandığını unutmayın)?
- Eksiksiz test kapsamı var mı: her akıllı sözleşme yöntemi ve tüm olası giriş veri türleri test edildi mi?
- Rastgele girdiler kullanılarak fuzz testi yapıldı mı?
- Sözleşmenin olası tüm durumları test edildi mi?
- Varsayılan ether ve token miktarları wei birimlerinde belirtilmiş mi?
- Kalabalık satış bitiş bloğu/zamanı, başlangıç bloğu/zamanından sonra mı (başlangıç / ticaretin etkinleştirilmesi)?
- Kalabalık satış tokenlerinin dönüşüm oranı doğru ayarlanmış mı?
- Kalabalık satış için yumuşak/sert limit belirlenmiş mi?
- Kalabalık satışa izin verilen minimum/maksimum katkı ayarlanmış ve test edilmiş mi?
- Kalabalık satış beyaz liste işlevselliği test edildi mi?
- Kalabalık satış iade mantığı doğrulandı mı?
- Kalabalık satış katılımcıları orantılı sayıda token alıyor mu veya katkılarını talep edebilirler mi?
- Kalabalık satışın her aşamasının süresi (örneğin, ön satış, genel satış) düzgün şekilde yapılandırılmış mı?
- Kalabalık satışın duraklatılması, başka bir aşamaya geçilmesi, token dağıtımının etkinleştirilmesi gibi işlevlerin yalnızca sahibi tarafından kontrol edilmesi gerektiği belirtilmiş mi?
- Kalabalık satışın vesting (hakediş) mantığı kontrol edildi mi?
- Kalabalık satış, sahibin etkinleştirdiğinde özellik çağrılarını sınırlayan ve bir geri ödeme özelliğini içeren bir güvenli mod içeriyor mu?
- Kalabalık satış makul olduğu sürece bir yedekleme özelliği içeriyor mu?
- İthal edilen kütüphaneler önceden kontrol edildi mi ve gelecekteki sürümlerde değiştirilip kötü amaçlar için kullanılabilecek istenmeyen kısımlar içermiyor mu?
- Token transfer yöntemleri (transfer) require ile sarılmış mı?
- Require ve assert doğru şekilde kullanılıyor mu? Assert yöntemi, değişikliklerden sonra durumu kontrol etmek için genellikle hiç olmaması gereken şeyler için kullanılır.
- Yeniden giriş saldırılarına karşı bir savunma var mı?
- Girdideki keyfi dizelerin uzunluğu sınırlanmış mı?
- Mümkün olduğunda dizileri kullanmaktan kaçınılıp bunun yerine eşlemeler mi kullanılıyor?
- Rastgele değerleri yönetmek için blok hashleri kullanılmıyor mu (madenciler bunu etkileyebilir)?
- Hiçbir yerde tx.origin kullanılmıyor mu?
- Dizinin elemanları silindiğinde boşluk bırakmamak için aşağı doğru kaydırılıyor mu?
- Throw yerine revert kullanılıyor mu?
- Koşullar karşılanmazsa fonksiyonlar hemen sona erdiriliyor mu?
- Derleyici uyarıları çözülmüş mü?
- Hesaplamalarda SafeMath kütüphanesi kullanılıyor mu?
- Herhangi bir bellek yuvası (depolama yuvası) birden fazla okunuyor mu?
- DoS'a neden olabilecek sınırsız döngüler/diziler kullanılıyor mu?
- Blok zaman damgası sadece uzun aralıklar için mi kullanılıyor?
- Geçen zamanı hesaplamak için blok numarası kullanılmıyor mu?
- Delegatecall çağrısı özellikle harici (güvenilir bile olsa) sözleşmeler için kaçınılıyor mu?
- Dizinin uzunluğu üzerinde yinelenirken güncellenmiyor mu?
- İmzalar nonce ve block.chainid ile tekrar kullanım saldırılarından korunmuş mu?
- Tüm imzaların EIP-712 kullanarak yapıldığından emin olun?
- abi.encodePacked() çıktısı, iki veya daha fazla dinamik tür kullanılıyorsa hashlenmemelidir. Genel olarak, abi.encode() kullanmak tercih edilir.
- Montaj kodu eklemeleri dikkatlice kontrol edilmelidir.
- Yetersiz gaz tüketiminden (gas griefing) kaçınılmalıdır.
- Tüm özel veriler gerçekten özel mi?
- Bellekteki bir yapı/dizi güncellenmesi, depolamada (stage) değiştirmeyecek mi?
- Stage değişkenleri gölgelenmiş mi?
- Bir değişkenin değeri uçuşta hesaplamak, onu depolamaktan daha ucuz mu?
- Tüm durum değişkenleri doğru sözleşmeden (ana vs. klon) mi okunuyor?
- Kıyaslama operatörleri (>, <, >=, <=) doğru şekilde kullanılıyor mu, özellikle off-by-one hatalarını önlemek için?
- Mantıksal operatörler (==, !=, &&, ||, !) doğru şekilde kullanılıyor mu, özellikle off-by-one hatalarını önlemek için?
- Çarpma her zaman bölme işleminden önce mi yapılıyor (çarpma taşabilir olmadığı sürece)?
- Sihirli numaralar, anlamlı bir isimle bir sabit ile mi değiştirilmiş?
- Bir ETH alıcısının geri çevrilebilecek bir yedekleme fonksiyonu (fallback) varsa, bu bir DoS'a yol açabilir mi?
- SafeERC20 standardı kullanılıyor mu ve dönüş değerleri güvenli bir şekilde kontrol ediliyor mu?
- Msg.sender'in her zaman ilgili bir kullanıcı olduğu varsayılıyor mu?
- Yetkilendirme için tx.origin kullanılmıyor mu?
- Address.transfer() veya address.send() yerine .call.value() kullanılmıyor mu?
- Düşük seviyeli çağrılar kullanıldığında, çağrıdan önce bir sözleşmenin var olduğundan emin olun.
- Chainid veya sözleşme kodu/boyutu/hash erişimi için montaj kodu, Solidity sözdizimi yerine kullanılıyor mu?
- Bir değişkeni null değere (0, false, "", vb.) ayarlarken delete anahtar kelimesi kullanılıyor mu?
- Mantıksal operatörlere/kıyaslamalara (&&/||/>=/==/vb.) iletilen ifadelerin yan etkileri olmamalıdır.
- Birden fazla adresle çalışırken, bu adreslerin aynı olması durumunda ne olacağını kendinize sorun.
- Kod ne kadar iyi belgelenmiş? Standart olmayan kod kullanıldığında yorumlar ve örnekler sağlanmış mı?
- Harici Çağrı kullanılıyorsa, bir harici sözleşme çağrısının gerçekten gerekli olduğundan emin olun.
- Harici Çağrı'nın sonucu kontrol ediliyor mu ve hatalar ele alınıyor mu?
- Harici Çağrı tüm sağlanan gazı kullanırsa ne olur?
- Harici Çağrı belirli bir fonksiyonu çağırıyorsa, fonksiyonun gerçekten mevcut olduğundan emin olun (hayalet fonksiyonlar).
- Hiçbir harici çağrının değiştiricilerde (modifiers) kullanılmadığından emin olun.
- Depolamayı değiştiren her fonksiyon için olaylar (events) yayınlanıyor mu?
- Ana sözleşmede kullanılan harici sözleşmelerin ne yaptığını ve ne döndürdüğünü kontrol edin.
- Çok fazla veya çok az ondalık kullanan tokenlara dikkat edin. Desteklenen maksimum ve minimum değerlerin belgelenmiş olduğundan emin olun.
- Rollerle ilişkilendirilen yetki belgelenmiş mi?
- Erişim hakları ihlal edildiğinde riskler nelerdir ve bu, sistemin çeşitli bileşenlerini nasıl etkileyebilir?
- Sahip, sözleşme içindeki tokenları ve ETH'yi manipüle edebilir mi?
- Oracle adresi nasıl ayarlanır ve arkasındaki süreç nedir? Yedek oracle'lar mevcut mu?
- Benzer fonksiyonlar diğer projelerde nasıl uygulanmış, en iyi uygulamalar dikkate alınmış mı?
Bu kontrol listesi, Solidity akıllı sözleşmelerinin kapsamlı bir güvenlik denetimini gerçekleştirmenize yardımcı olacaktır. Koddaki ve ilgili sistemlerdeki olası güvenlik açıklarını ve riskleri belirlemek ve azaltmak için çok çeşitli kritik yönleri kapsar.
Umarız bu örnekler akıllı sözleşme denetim metodolojisini daha iyi anlamanıza yardımcı olmuştur.
Blok zincirindeki tüm bilgiler açık olduğundan (elbette sözleşmenin kaynak kodunun doğrulanması şartıyla), bu bilgiyle donanmış olarak akıllı sözleşmeleri bağımsız olarak inceleyebilir ve çeşitli dolandırıcılık planlarını belirleyebilirsiniz.
Ancak, biz zaten sizin için her şeyi yaptık! Premium abonelik için kaydolun ve akıllı sözleşmelerin özellikleri ve yeni analizler hakkında özel filtrelere erişin. Karlı tokenlara başarılı bir şekilde yatırım yapma şansınızı artırın.
Saygılar, Lotus Market ekibi.