Özet
Ethereum'da ERC20 token'ı, merkezi olmayan uygulamalar (DApp'ler) oluşturmak için şirketler veya kullanıcılar tarafından yaygın biçimde kullanılmaktadır. Pek çok ERC20 token'ı büyük bir değer kazanmış ve kripto piyasasında dolaşıma girmiştir. Üstelik DeFi ekosisteminin hızlı gelişimiyle birlikte ERC20 token'ları üzerindeki işlemler giderek daha sık hale gelmiştir. ERC20 standardına göre, DApp'lere veya diğer kullanıcılara token çekme izni vermek için approve() metodu çağrılmaktadır. Gerçek hayatta pek çok DApp, kullanıcılardan sınırsız onay talep etmekte ve bu tasarım ciddi bir soruna yol açmaktadır. Yaşanan bir dizi olay, hem kullanıcılar hem de DApp'lerin kendisi için büyük kayıplara neden olmuştur.
0xffffff. Önsöz
Uzun süredir tartışılan bir konu olan "Sınırsız Onay", DeFi'nin hızlı gelişimi ve bazı güvenlik olaylarıyla birlikte yeniden gündeme gelmiştir. Pek çok güvenlik olayından ilham alarak "Sınırsız Onay" konusunu farklı açılardan kapsamlı biçimde incelemeye çalışıyoruz. Aynı zamanda 29. Blockchain Village konferansına davet edilerek bu konuyu ele aldık.
Okuma Önerisi:
- Ethereum'a yeni başlıyorsanız, blogun tamamını okumanızı şiddetle tavsiye ederiz.
- Ethereum konusunda deneyimliyseniz ve sınırsız onay hakkında bilginiz varsa, 0x2 bölümünden itibaren okumaya başlayabilirsiniz.
0x0. Arka Plan
"Sınırsız onay nedir?" tartışmasına girmeden önce, "ERC20 token'ında onay nedir?" konusunu kısaca hatırlatmak istiyorum.
ERC20 Token'ları
Ethereum'da Ether'in yanı sıra, büyük bir değer taşıyan çeşitli token'lar kripto piyasasında dolaşmaktadır. ERC20, en popüler token standardıdır. Tamamlanmamış istatistiklerimize göre, CoinGecko'da (token fiyatlarını toplayan bir web sitesi) 5.600'den fazla, Uniswap'ta (şu anda en ünlü merkezi olmayan borsalardan biri) ise 44.000'den fazla ERC20 token'ı kaydedilmiştir.
Onay Mekanizması
Onay süreci, esas olarak üç varlıkla (gönderen, harcayan ve token sözleşmesi) ve ERC20 standardındaki iki işlev (approve, transferFrom) ile iki değişkeni (balanceOf, allowance) kapsamaktadır (aşağıdaki şekilde gösterildiği gibi).

Onay sürecini anlamak için aşağıdaki şekli sunuyor ve approve ile transferFrom işlevlerinin token sözleşmesinin durumunu nasıl değiştirdiğini açıklıyoruz.

- (Adım 1) Başlangıç durumunda, gönderen sözleşmede 100 token'a sahiptir ve harcayanın gönderen tarafından onaylanmış herhangi bir
allowance'ı yoktur. - (Adım 2) Gönderen, harcayana 100 token izni vermek için
approveişlevini çağırır. Böyleceallowance[sender][spender]0'dan 100'e yükselir ve göndereninbalanceOfdeğerinde herhangi bir değişiklik olmaz. - (Adım 3) Son olarak, harcayan gönderenden kendisine 80 token aktarmak için
transferFrom'u çağırır. Sonuç olarak, hem gönderenin hem de harcayanınbalanceOfdeğerleri güncellenir (sırasıyla 20 ve 80) ve harcayanın allowance'ı 20'ye düşer.
Gerçek Hayatta Üç Tür Onay
Gerçek dünyada tüm onayları, onay miktarına göre üç türe ayırabiliriz.
- Sıfır Onay: Onay miktarı sıfıra eşittir. Bu, kullanıcının/gönderenin belirli bir platform/harcayan üzerindeki allowance'ını iptal etmeye çalıştığı anlamına gelir.
- Sınırsız Onay: Onay miktarı,
uint256'nın maksimum değerine (0xffff...ffff) veya token'ların toplam arzına eşittir. Bu tür onay, pek çok DeFi platformu (borsalar, borç verme platformları gibi) tarafından sıklıkla kullanılmaktadır. - Diğer Onay: Bu tür, geri kalan onayları kapsar. Kullanıcılar bu onayı genellikle platformlar veya cüzdanlar tarafından desteklenen değiştirme özelliğine dayanarak başlatır.
0x1. Gerçek Dünyadan Olaylar
Daha önce bahsedilen onay sorunuyla ilgili bazı gerçek dünya olayları da mevcuttur. Konuşmamızda bu olaylardan ikisini (UniCat, Bancor Finance) ayrıntılı olarak ele aldık. Bu olaylar hakkında daha fazla bilgi edinmek isterseniz, aşağıda verilen bağlantıları takip edebilirsiniz:
- UniCat Olayı:Bağlantı
- Bancor Finance Olayı: Bağlantı
- Primitive Finance: Bağlantı1, Bağlantı2
- Furucombo: Bağlantı,Bağlantı (Çince)
- DeFi Saver: Bağlantı
- Degen Money: Twitter
0x2. Bazı Ölçümler
Bu bölümde, hem zincir dışı hem de zincir üstü açılardan yürüttüğümüz ayrıntılı araştırmamızı sunacağız. "Sınırsız onay"ın mevcut durumunu daha iyi anlamak için ön uç kullanıcısı rolünü üstlenerek ölçümümüzü gerçekleştiriyoruz.

Gerçek Dünyada Onay Süreci
Yukarıdaki şekil, ön uç kullanıcılarının bir onay işlemini tamamlamak için altı adım atabileceğini göstermektedir. Dört temel varlık vardır (ön uç kullanıcıları, cüzdanlar, platformlar, token sözleşmeleri). Şimdi akışı adım adım inceleyelim:
Adım 1,2: İlk olarak, ön uç (mobil, web sitesi) kullanıcılarının çoğu cüzdanlarını seçtikleri platforma bağlar ve hizmet taleplerini gönderir.
Adım 3: Ardından platform, kullanıcının cüzdanına gerekli verileri (en önemlisi onay miktarı) içeren onay işlemini oluşturur ve onay için kullanıcının cüzdanına gönderir.
Adım 4,5: Onay işlemini aldıktan sonra, cüzdan kullanıcıya ilgili bilgileri gösterir ve kullanıcının onayını bekler.
Adım 6: Kullanıcı işlemi onayladıktan sonra, cüzdan işlemi doğrulama için ağa gönderir. Ayrıca doğrulanan işlem, token sözleşmesinin durumunu (Allowance[User][Platform]) değiştirir.
(Gelecek bölümde önce her ölçüm türü (zincir dışı ve zincir üstü) için motivasyonumuzu tanıtacağız. Ardından ölçüm sonuçlarımızı ve bulgularımızı farklı açılardan sunacağız.)
Zincir Dışı Araştırma
Motivasyon
Gerçek dünyadaki onay sürecinde, ön uç kullanıcılarının doğrudan cüzdan ve platform kullanıcı arayüzüyle etkileşime girdiğini kolayca fark edebiliriz. Bu nedenle, 15 tanınmış cüzdan ve 24 DeFi (Merkezi Olmayan Finans) platformu seçerek zincir dışı araştırmamızı yürütüyoruz.
(Araştırma sonuçları aşağıda gösterilen iki şekilde özetlenmiştir.)


Ayrıca, onay konusundaki açıklamalarını ve esnekliklerini esas olarak değerlendiriyoruz:
- Açıklama
- Cüzdan: 1) Cüzdanın onay işlemine ilişkin sağlıklı bilgi (kullanıcı, harcayan, token ve onay miktarı dahil) gösterip göstermediği; 2) Cüzdanın "sınırsız onay" konusunda özel bir uyarı verip vermediği veya kullanıcıları bilgilendirip bilgilendirmediği
- Platform:(Kriter 1)Platformun web kullanıcı arayüzünde onay işlemleri için yeterli açıklama sunup sunmadığı;(Kriter 2)Platformun kullanıcıları onay işleminin varlığı konusunda bilgilendirip bilgilendirmediği;(Kriter 3)Platformun kullanıcıları iki işlemin sırayla gerçekleştirildiği konusunda uyarıp uyarmadığı
- Esneklik: Cüzdan veya platformlarda, kullanıcı arayüzünün onay miktarı üzerinde değiştirme özelliği sunup sunmadığı
(Gelecek bölümde, yukarıdaki iki konunun hem cüzdanlar hem de platformlarda nasıl uygulandığına ilişkin sonuçları göstereceğiz. Her ikisi için de birer cüzdan ve platform örneği seçiyoruz.)
0x222. Cüzdanlar: Metamask ve Coinbase
Coinbase cüzdanı ve Metamask (chrome eklentisi) cüzdanı üzerindeki araştırma sonuçlarımızı sunacağız. Google Play Store'daki bilgilere göre (aşağıdaki şekilde gösterilmiştir), Coinbase ve Metamask'ın her ikisi de 1 milyonun üzerinde kuruluma sahiptir. Bununla birlikte, Coinbase müşterilerden daha fazla yorum almakta ve daha yüksek bir puana sahip bulunmaktadır.

İki cüzdanın araştırması için, bunları Compound platformundaki takas işlevini test etmek amacıyla kullanıyoruz. Compound platformunun kullanıcılar için varsayılan olarak sınırsız onay uyguladığını unutmayın.
Cüzdan 1: Metamask
Aşağıdaki şekilde gösterildiği gibi, kullanıcılar Compound tarafından oluşturulan onay işlemini incelerken harcayan adresi, onay imzası ve onay miktarı (Adım 2) dahil olmak üzere eksiksiz bilgileri görebilmektedir. Üstelik Metamask, kullanıcıların "Düzenle" düğmesiyle onay miktarını değiştirmesine bile olanak tanımaktadır (Adım 2, 3, 4).

Cüzdan 2: Coinbase
Metamask cüzdanıyla karşılaştırıldığında, Coinbase cüzdanı hiçbir önemli bilgi sunmamaktadır. Kullanıcılar, onay işlemini onayladıktan sonra daha fazla ayrıntıya yalnızca bakabilmektedir (aşağıdaki şekil). Adım 2, 3 ve 4'ün yalnızca onay işlemi beklemede veya tamamlanmış modunda iken sırasında veya sonrasında gösterildiğine dikkat edin. Bu nedenle, Coinbase cüzdanı onay işlemine ilişkin gerekli bilgileri gizlemekte ve onaylanan miktar için herhangi bir değiştirme özelliği sunmamaktadır.

0x223. Platformlar: Bancor ve Curve Finance
Bu bölümde Bancor ile Curve Finance'i karşılaştıracağız. Aşağıdaki şekilde gösterildiği üzere, defipulse'ün en güncel istatistiklerine göre (7 Ağustos 2021), Curve Finance ve Bancor, toplam kilitli değer açısından sırasıyla birinci ve beşinci DEX (merkezi olmayan borsa) konumundadır.
Her iki platformdaki araştırmamızın kurulumu için, her iki platform tarafından sağlanan takas özelliğini test etmek amacıyla Metamask cüzdanını kullanacağız.

Platform 1: Bancor
Bancor üzerinde takas özelliğini test ederken, onay işlemine duyulan ihtiyacı açıklamakta (aşağıdaki şekil) ve hatta kullanıcılara iki seçenek (sınırsız/sınırlı onay) sunmaktadır. Sınırsız onayın yanı sıra, Bancor'daki sınırlı onay yalnızca kullanıcıların takas için kullanmak istediği allowance miktarını gerektirmektedir.

Platform 2: Curve Finance
Ancak Curve Finance'te 'ilginç' bir durum yaşanmaktadır. Aşağıdaki şekilde gösterildiği üzere, takas talebinde bulunduğumuzda Curve Finance'in kullanıcı arayüzü "Lütfen takas için 10 USDT onaylayın" görüntülemektedir (aşağıdaki şekil); ancak Metamask sınırsız bir onay işlemi almaktadır. Bu, kullanıcılar açısından kesinlikle yanıltıcı bir bilgidir.

Daha sonra Curve Finance ile sorunu teyit etmeye çalışırken, endişemizi kabul ettiler ve bunun "kullanıcıların her seferinde onay vermekten hoşlanmadığı" için olduğunu söylediler (aşağıdaki şekil).

Curve Finance'e benzer şekilde, Yearn Finance'in kullanıcı arayüzü de aynı sorunu taşımaktadır. (Bunu konuşmamızda da belirtip kanıtlarını gösterdik.)
0x23. Zincir Üstü Araştırma
0x231. Motivasyon
Zincir üzerindeki "sınırsız onay" durumunu daha iyi anlamak için, araştırmamızı sürdürmek amacıyla tüm işlemleri (30 Nisan 2021'e kadar) topladık. Aşağıdaki şekilde gösterildiği üzere, "sınırsız onay" sayısı günümüzde gerçekten hızlı bir şekilde artmaktadır. Araştırmamızda, UniswapV2'nin kullanıma sunulmasının "sınırsız onay"ın büyümesini tetikleyen ana etken olduğu görülmektedir. Bunu, ölçüm sonuçlarımıza dayanarak daha ayrıntılı açıklayacağız.

Aynı zamanda, "sınırsız onay"ı hem token hem de platform açısından incelemek için (kullanıcıların kendisi yerine en ilgili terimler bunlar olduğundan) araştırmamızı iki açıdan ele alacağız:
- "Sınırsız Onay"ın Dağılımı
- Risk Analizi
0x232. "Sınırsız Onay"ın Dağılımı
Aşağıdaki grafikleri daha iyi anlamak için, şekillerde geçen her terimi önce açıklayacağız:
- Y ekseni (Maksimum Onay Oranı): Daha Büyük Değer -> Tüm onay işlemleri arasında "Sınırsız Onay"ın daha yüksek yüzdesi
- X ekseni (Canlılık): Daha Büyük Değer -> Platformlar veya token'lar daha aktif. Canlılık değeri, onay işlemlerinin sayısına ve ilk ile son onay işlemi arasındaki zaman farkına bağlıdır
- Nokta Boyutu: Daha Büyük Boyut -> Token veya platform tarafından daha fazla onay işlemi dahil edilmiştir
(Aşağıdaki iki şekil yalnızca onay işlemlerinde en sık yer alan ilk 1000 token/platformu göstermektedir)
(Platform)

(Token)

Platform: Platform grafiğine bakıldığında, UniswapV2'nin üç kriter açısından diğer tüm platformları açıkça geride bıraktığı görülmektedir. Bu nedenle "UniswapV2'nin kullanıma sunulması, 'sınırsız onay'ın büyümesini tetikleyen ana etken gibi görünmektedir" diyoruz.
Token: Dağılım açısından, USDC, USDT ve DAI, yukarıda tanımlanan üç kriter bakımından en iyi performansı sergilemektedir. Bu token'ların tamamı stabil coindir; stabil coinlerin kripto piyasasında işlem yapmak için yaygın biçimde kullanıldığı düşünüldüğünde bu durum mantıklıdır. Diğer öne çıkan token'lar (İlk 10 token) ise Maksimum Onay Oranı açısından birbirine oldukça benzemektedir.
0x233. Risk Analizi
Önceki sonuçlara dayanarak, risk analizimizi yürütmek için USDC, USDT, DAI (ilk 3 token) ve iki platform (Bancor, UniCat) seçiyoruz. Bu arada, onaylanan token'ların riskini aydınlatmaya yardımcı olmak için iki terim de tanımlıyoruz (aşağıdaki şekilde gösterildiği gibi).

Risk Miktarı
- Token için Risk Miktarı,
transferFromişlevi çağrılarak aktarılabilecek toplam token miktarına eşittir - Platform için Risk Miktarı,
transferFromişlevi çağrılarak aktarılabilecek tek bir token'ın toplam miktarına eşittir
Risk Oranı
- Belirli bir token için Risk Oranı, Risk Miktarının bu sabit token'ın toplam arzı içindeki yüzdesini temsil eder
Token: Aşağıdaki şekilde gösterildiği üzere, USDC ve USDT bir buçuk yıl boyunca oldukça istikrarlı kalmaktadır (risk oranları yaklaşık %10 civarındadır). DAI, yılın ortasında dramatik bir düşüş yaşamakta ve sonunda istikrar kazanmaktadır (yine yaklaşık %10, ancak daha fazla iniş çıkış ile). Bu durum, belirli olayları veya DAI'nin çalışma mekanizmasını işaret ediyor olabilir. Dolayısıyla, nedenini araştırmak için hâlâ yapılması gereken çalışmalar bulunmaktadır.

Platform: Platformlar üzerindeki risk analizine gelince, hem Bancor (BNT token ile) hem de UniCat (UNI token ile) için risk miktarının trend grafiğini (aşağıdaki şekil) sunacağız.
Bancor'un trend grafiği, anlık bir büyüme ve düşüşü göstermektedir. Bu, ekibin açıklardan etkilenebilir token'ları hatalı sözleşmeden güvenli bir yere ne kadar hızlı aktardığının mükemmel bir açıklamasıdır.
UniCat'in trend grafiğine gelince, belirgin düşüşlerin aslında UniCat'in arka kapı saldırılarından kaynaklandığını doğruluyoruz.

0x3. Mevcut Çözümler
Daha önce de belirtildiği gibi, "Sınırsız Onay" ekosistemde uzun süredir var olan bir konudur. Çeşitli tartışmalar sonucunda, onay sürecini iyileştirmeye yönelik bazı çözümler önerilmiştir:
- ERC777
- EIP2612
Çözümlere geçmeden önce, "sınırsız onay"ın temel motivasyonunu bir kez daha hatırlatmak istiyoruz:
- Hem approve hem de transferFrom için iki işlem gerekmektedir
- Özelleştirilmiş onay, kullanıcıları her işlem veya yatırımdan önce onay vermek zorunda bırakmaktadır (bu da daha fazla işlem ücreti anlamına gelir)
- Platformlar, bir kez sınırsız onay talep ederek kullanıcı deneyimini en üst düzeye çıkarmak istemektedir
0x31. ERC777
2017 yılında önerilen bir token standardı olan ERC777, ERC20 token'ının onay sürecini iyileştirmek için aşağıdaki özelliklere sahiptir:
- Kullanıcılar, token'larını istenen miktarda aktarması için bir operatörü (borsa gibi) "yetkilendirebilir"
- Kullanıcıların onaylar için tekrar tekrar işlem göndermesi gerekmez
- Kullanıcılar "sınırsız onay" riskiyle ilgilenmek zorunda kalmaz
Sonuç olarak, ERC777 ile kullanıcılar herhangi bir yetkili operatörle atomik satın alma işlemi gerçekleştirebilir.
Ancak ERC777'nin dezavantajları da göz ardı edilemez:
Standartta uygulanan kancalar nedeniyle yüksek işlem ücreti (daha fazla ayrıntı için). Kullanıcılar güvenilir bir operatör seçmek zorundadır (Bu, soruyu yeniden kullanıcılara bırakmaktadır).
0x32. EIP2612
EIP2612 hakkında, bu teklifte yazar, kullanıcıların işlem doğrulaması için imzalı mesajlar kullanabileceğini ve bu sayede allowance'larını değiştirmek için herhangi bir işlem ücreti ödemek zorunda kalmayacaklarını belirtmektedir. Daha doğrudan bir ifadeyle, EIP2612 ile onay işlemleri ücretsiz hale gelmektedir. Ayrıca bu teklif, şu anda UniswapV3 tarafından borç verme sağlayıcısı token'ları için kullanılmaktadır.
0x4. Sonuç
Sonuç olarak, "Sınırsız Onay" kullanıcıların birden fazla onay işlemi gerçekleştirme maliyetini gerçekten azaltmaktadır. Ancak araştırmamız, bazı platform ve cüzdanların kolaylık ile güvenlik arasındaki bu savaşta zararsız görünmeye devam ettiğini ortaya koymaktadır. Daha da kötüsü, bazıları yanlış bilgi göstererek kullanıcıları yanıltmaya bile çalışmaktadır. Bu nedenle, "Sınırsız Onay" kullanmak yerine, platform ve cüzdanların kullanıcıları en başından korumak için daha güvenli bir kullanıcı arayüzü veya protokol geliştirmeyi gerçekten değerlendirmelerini öneriyoruz. DeFi kullanıcısı olarak güvenlik bilincinin oluşması, saldırıların bir sonucu olmamalı; aksine en başından farkındalık taşınmalıdır. Ethereum'da güvenli ve gelişen bir ortam inşa etmenin yalnızca topluluğun değil, her birimizin sorumluluğu olduğuna inanıyoruz.
Hakkımızda
Twitter: https://twitter.com/BlockSecTeam
Medium: https://blocksecteam.medium.com/



