Token akıllı sözleşmeleri, başka bir adresin token sahibi adına token harcamasına izin veren bir approve() fonksiyonu içerir. Bu, günümüz akıllı sözleşme ekosisteminin temel bir parçasıdır; bu fonksiyon olmadan pek çok DeFi uygulaması mümkün olmazdı. Örneğin, Uniswap gibi merkezi olmayan bir borsada token takas etmek için swap gerçekleşmeden önce token onayı gerekmektedir.
Ancak token onayları önemli riskler barındırır. Bir akıllı sözleşmeye token harcama izni vermek, sözleşmenin bunu istediği zaman yapabileceği anlamına gelir. Bir sözleşme hacklenirse veya kötü amaçlı kod içeriyorsa, saldırganlar bu onayları token çalmak için kullanabilir.
Revoke.cash gibi mevcut çözümler cüzdan onaylarını takip ederek talep üzerine iptal imkânı sunar. Ancak bu çözümler, bir saldırı gerçekleşmeden önce veya sırasında yapılması gereken manuel bir sürece dayanır; bu da her zaman pratik değildir. EthGlobal '24'te geliştirilen bir hackathon projesi olan Revoke.delegate, bir saldırı sırasında onayları otomatik olarak iptal ederek sürekli izleme veya manuel müdahale ihtiyacını ortadan kaldıran daha verimli bir çözüm sunar. İşte ekibin bunu nasıl başardığı.
Zorluk: Gizlilik ve sahipliği korurken cüzdan izinlerini devretmek
Kullanıcıların, bir saldırı sırasında otomatik token onayı iptali sağlamak için Revoke.delegate'e belirli cüzdan izinlerini devretmesi gerekir. Bu bağlamda yetki devri; bir akıllı sözleşme hesabının (yetki veren), açıkça belirlenmiş kural ve koşullar çerçevesinde tanımlanmış işlemleri gerçekleştirmesi için başka bir akıllı sözleşmeye veya harici olarak sahip olunan bir hesaba (yetki alan) belirli izinler vermesi anlamına gelir.
Bu süreç, Revoke.delegate'in etkilenen token adreslerini güvenli biçimde tespit etmesine, önceden tanımlanmış koşulları doğrulamasına ve izin miktarlarını sıfıra indirmek için approve() ya da setApprovalForAll() fonksiyonlarını çağırarak onayları iptal etmesine olanak tanır.
Temel zorluk, gizlilik ve öz-sahiplik ilkelerinin korunmasını sağlamak; yani kullanıcıların özel anahtarlarını paylaşmak zorunda kalmadan veya belirsiz izinler vererek cüzdanları üzerindeki kontrolü kaybetmeden hareket edebilmesini güvence altına almaktır. Ekip aynı zamanda sorunsuz bir benimseme süreci için mevcut cüzdan ekosistemiyle uyumluluğu da öncelikli hedef olarak belirledi.
Çözüm: Delegation Toolkit (DTK) ile cüzdan izinlerini güvenli biçimde devretmek ve yönetmek
Delegation Toolkit (DTK) ile entegrasyon sayesinde Revoke.delegate, kullanıcıların tam öz-sahipliği koruyarak cüzdan izinlerini devretmesine olanak tanıdı. Bir saldırı bildirildiğinde Revoke.delegate, DTK tarafından yönetilen Delegation Storage'dan kullanıcı yetkilerini güvenli biçimde alır ve etkilenen cüzdanlar için token onaylarını iptal etmek amacıyla bunları kullanır. Sürecin genel bir özeti şu şekildedir:
Kullanıcı, mevcut tüm token onaylarını görüntülemek için cüzdanını bağlar.
Cüzdan izinlerini devretmeyi seçer. Arka planda createRootDelegation() fonksiyonu çağrılarak Revoke.delegate akıllı sözleşmesi yetki alan olarak belirlenir.
Gerekli izinler, approve() metodunu belirterek addCaveats() fonksiyonuyla tanımlanır; örneğin: .addCaveat("allowedMethods", ["approve(address,uint256)"]).build().
Kullanıcı yeni yetkiyi imzalar; bu yetki daha sonra DTK tarafından yönetilen Delegation Storage'da güvenli biçimde saklanır.
Bir saldırı gerçekleştiğinde Revoke.delegate, depolanan tüm yetkileri alır, koşulları doğrular ve kullanıcı müdahalesi gerektirmeksizin approve() ya da setApprovalForAll() fonksiyonlarını çağırarak izin miktarlarını sıfıra indirip etkilenen cüzdanlar için token onaylarını iptal eder.
Delegation Toolkit'in bu süreçleri nasıl kolaylaştırdığı hakkında daha fazla bilgi edinmek için dokümanlara göz atın.
"Delegation Toolkit, kullanıcıların sahipliklerinden ödün vermeden cüzdan izinlerini devredebildiğinden emin olmamıza yardımcı oldu." – Ayush & Aashish, Revoke.delegate Geliştiricileri ve EthGlobal '24 Hackathon Kazananları
DTK'dan yararlanan Revoke.delegate ekibi, kullanıcıların çevrimdışı olduğu veya devam eden bir saldırıdan haberdar olmadığı durumlarda bile token onayı iptallerini başarıyla otomatikleştirdi. Üstelik toolkit, ERC-7579'u yerel olarak desteklediğinden ekip; Safe, Kernel ve Biconomy Nexus dahil olmak üzere ekosistemdeki önde gelen cüzdanlarla uyumlu bir çözüm geliştirdi.