Blokzincir Dünyasının Görünmez Anahtarı: Approve (Onay) Mekanizması Nedir ve Nasıl Kullanılır?

 Merkeziyetsiz finans (DeFi) ekosistemine veya Web3 dünyasına adım atan her kullanıcının karşısına çıkan en temel işlemlerden biri Approve (Onay) işlemidir. Bir Merkeziyetsiz Borsada (DEX) token takası yaparken veya bir platformda staking başlatırken sistem sizden önce bir "Onay / Approve" imzası ister, ardından asıl işlemi gerçekleştirir.

Peki, arkasındaki teknik mantık nedir? Neden her defasında bu onay süreciyle karşılaşırız ve doğru kullanım teknikleri nelerdir? Bu makalede Web3 mimarisinin bu kritik güvenlik ve yetkilendirme mekanizmasını tüm detaylarıyla inceliyoruz.

1. Approve (Onay) Nedir?

Merkeziyetsiz ağlarda (Ethereum, Avalanche, BNB Chain vb.) kullandığımız ERC-20 / BEP-20 standartlarındaki token’lar, cüzdanınızda şifrelenmiş halde duran dijital varlıklardır.

Standart protokol kuralları gereği, hiçbir akıllı sözleşme (Smart Contract), sizin açık izniniz ve imzanız olmadan cüzdanınızdan 1 birim dahi token çekemez.

İşte Approve, cüzdan sahibinin (sizin) belirli bir akıllı sözleşmeye (örneğin Uniswap veya Trader Joe Router kontratına) “Benim cüzdanımdan belirlediğim miktara kadar X token’ını çekip işlem yapmana izin veriyorum” deme şeklidir.

2. Approve Mekanizması Nasıl Çalışır? (Teknik Mantık)

Akıllı sözleşmeler dünyasında bu mekanizma ERC-20 Token Standardı içerisinde yer alan iki temel fonksiyon ile yönetilir:

  1. approve(address spender, uint256 amount)

  2. allowance(address owner, address spender)

[Cüzdan Sahibi (Owner)] ──(1. approve() ile Yetki Verir)──> [Token Kontratı (Allowance Değişkeni)]
                                                                    │
                                                                    ▼
[Akıllı Sözleşme (Spender)] <──(2. transferFrom() ile Çeker)────────┘

İşlem Adımları:

  • Adım 1 (Approve): Kullanıcı, token kontratının approve fonksiyonunu çağırarak aracı sözleşmeye (spender) harcama limiti haritasında (allowance) izin tanımlar.

  • Adım 2 (Allowance Kontrolü): Aracı sözleşme, cüzdandan token çekmeden önce allowance fonksiyonunu sorgulayarak ne kadar limiti olduğunu doğrular.

  • Adım 3 (TransferFrom): Limit uygunsa, sözleşme transferFrom fonksiyonunu çalıştırır ve izin verilen miktardaki token'ı kullanıcının cüzdanından alıp takas/staking işlemine sokar.

Önemli Ayrım: Cüzdanınızdan doğrudan ağın yerel kripto parasını (AVAX, ETH, BNB) gönderirken Approve gerekmez; çünkü yerel varlıklar msg.value ile fonksiyona doğrudan aktarılır. Ancak ERC-20 standart token'ları (USDT, GSX, PNG vb.) harcarken Approve yapılması zorunludur.

3. Approve İşlemi Nasıl Kullanılır?

Bir Web3 geliştiricisi veya kullanıcısı olarak Approve mekanizması iki farklı katmanda karşımıza çıkar:

A) Kullanıcı Arayüzü (Frontend / JavaScript) Katmanında Kullanım

Web3 projesi geliştirirken (Ethers.js veya Viem kullanarak), kullanıcının takas butonuna basması durumunda izlenecek standart akış şu şekildedir:


import { ethers } from "ethers";

async function executeSwapWithApprove(tokenAddress, routerAddress, amountToSwap) {
    const provider = new ethers.providers.Web3Provider(window.ethereum);
    const signer = provider.getSigner();
    
    // ERC-20 Token Kontratı
    const tokenContract = new ethers.Contract(tokenAddress, ERC20_ABI, signer);
    const userAddress = await signer.getAddress();

    // 1. Mevcut Yetki (Allowance) Kontrol Edilir
    const currentAllowance = await tokenContract.allowance(userAddress, routerAddress);

    // 2. Eğer Mevcut İzin Harcanacak Miktardan Azsa Approve Çağrılır
    if (currentAllowance.lt(amountToSwap)) {
        console.log("Yetki yetersiz, Approve işlemi başlatılıyor...");
        
        // Limitsiz izin için MaxUint256 veya sadece harcanacak miktar verilebilir
        const txApprove = await tokenContract.approve(routerAddress, ethers.constants.MaxUint256);
        await txApprove.wait(); // Blokzincir onayı beklenir
        console.log("Approve işlemi başarılı!");
    }

    // 3. Artık Takas (Swap) Fonksiyonu Güvenle Çağrılabilir
    console.log("Takas işlemi başlatılıyor...");
    // swapExactTokensForAVAX(...);
}

B) Akıllı Sözleşme (Solidity) Katmanında Kullanım

Sizin yazdığınız bir akıllı sözleşme, başka bir protokolün sözleşmesine (örneğin kendi Router'ınız Trader Joe'ya) token aktaracaksa, sözleşme içinden de approve verilmelidir:


// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;


import "@openzeppelin/contracts/token/ERC20/IERC20.sol";


contract MyDexWrapper {

    address public immutable traderJoeRouter;


    constructor(address _router) {

        traderJoeRouter = _router;

    }


    function processToken(address token, uint256 amount) external {

        // 1. Kullanıcıdan bu kontrata token çekilir (Kullanıcı bu kontrata önceden approve vermiş olmalı)

        IERC20(token).transferFrom(msg.sender, address(this), amount);


        // 2. Bu kontrat, elindeki token'ı Trader Joe'ya aktarabilmek için Trader Joe'ya yetki verir

        IERC20(token).approve(traderJoeRouter, amount);


        // 3. Trader Joe üzerinden işlem tamamlanır

        // ITraderJoe(traderJoeRouter).swap(...);

    }

}


4. Güvenlik ve "Sonsuz Onay" (Infinite Approval) Riski

Approve mekanizmasında en sık karşılaşılan güvenlik uyarısı Sonsuz Onay (Infinite Approval) konusudur.

  • Sonsuz Onay Nedir? Her defasında gaz ücreti (Gas Fee) ödememek ve kullanıcıya tekrar tekrar imza attırmamak için uygulamalar genelde maksimum sayı olan 2^256 - 1 (MaxUint256) tutarında yetki ister.

  • Risk Nedir? Eğer yetki verdiğiniz dApp (Merkeziyetsiz Uygulama) veya Akıllı Sözleşme gelecekte hacklenirse ya da kötü niyetli bir yazılıma dönüşürse (Malicious Contract), cüzdanınızda ilgili token’dan ne kadar varsa tamamını çekebilir.

Güvenlik İçin En İyi Uygulamalar (Best Practices):

  1. Gerektiği Kadar İzin Verin: Mümkünse arayüzde sadece harcayacağınız miktar kadar (Exact Amount) onay verin.

  2. Onayları Düzenli Temizleyin: Kullanmadığınız protokollerdeki harcama yetkilerini Revoke.cash veya ağın kendi blok tarayıcılarındaki (Etherscan/Snowtrace Token Approval) araçlarla iptal edin (Revoke).

  3. Güvenilir Kontratlarla Etkileşime Geçin: Kaynak kodları doğrulanmamış (Unverified) ve denetimden (Audit) geçmemiş sözleşmelere asla onay imzası atmayın.

Özet

Approve (Onay) mekanizması, Web3 ekosisteminde kullanıcı mülkiyetini koruyan en temel güvenlik bariyeridir. Cüzdanınızdaki varlıkların sizden habersiz kontrol edilmesini engeller. Yazılımcılar için akıllı sözleşmeler arası etkileşimin köprüsü, kullanıcılar içinse bilinçli kullanılması gereken bir dijital imza yetkisidir.

Yorumlar

Bu blogdaki popüler yayınlar

"Kör bir adama ışığın güzelliğini anlatamazsın; ona önce gözlerini açacak bir merhem gerekir."

Dörtyol’un Asi Oğlu Deliçay’ı Sakinleştirme ve Afetten Korunma Duası

Veri Güvenliğinin Kilit Taşları: MySQL Veritabanını Güvende Tutmanın Kurumsal ve Teknik Yolları