1. Anasayfa
  2. 100 Günde Solidity

🧵 100GündeSolidity 065 : Multi Delegatecall

🧵 100GündeSolidity 065 : Multi Delegatecall
Multi Delegatecall
0

Multi Delegatecall

Merhaba,

#100DaysOfSolidity serisinin 65. e-bülteninde Multi Delegatecall konusuna odaklanacağız. Solidity programlama diliyle çalışırken, smart contractlerdeki fonksiyonların çağrılmasında kullanılan Delegatecall ve Multi Delegatecall kavramlarını ele alacağız.

Delegatecall, bir smart contract içindeki fonksiyonların başka bir smart contract içindeki fonksiyonlar tarafından çağrılmasına izin veren bir yöntemdir. Multi Delegatecall ise aynı işlemi birden fazla smart contract arasında gerçekleştirmenizi sağlayan bir yöntemdir.

Bu e-bültende, Delegatecall ve Multi Delegatecall arasındaki farkları inceleyecek, Multi Delegatecall kullanım senaryolarını ve örneklerini göstereceğiz. Ayrıca Multi Delegatecall’ın avantajları ve dezavantajları hakkında bilgi vereceğiz ve bu yöntemi kullanırken dikkat edilmesi gereken güvenlik ipuçlarına değineceğiz.

Delegatecall Nedir?

Delegatecall, Solidity programlama dilinde bir smart contract içindeki fonksiyonların başka bir smart contract içindeki fonksiyonlar tarafından çağrılmasını sağlayan bir yöntemdir. Bu, bir smart contract’taki kodun başka bir smart contract içinde yeniden kullanılmasına olanak tanır ve kod tekrarını önler.

Delegatecall, çağrılan fonksiyonun veri alanını, çağıran fonksiyona ait olan veri alanıyla değiştirir. Bu, çağrılan fonksiyonun orijinal smart contract’taki değişkenlerin değerlerine erişebilmesini sağlar.

Delegatecall kullanımı, smart contractler arasındaki işlevsellik paylaşımını ve modüler bir kod tasarımını sağlar. Ancak, Delegatecall kullanımında dikkatli olunması gereken güvenlik riskleri vardır, özellikle çağrılan smart contract’in kodunun güvenli olup olmadığına dair şüpheler varsa.

Delegatecall örneği:

pragma solidity ^0.8.0;

contract ContractA {
    uint public x;

    function setX(uint _x) public {
        x = _x;
    }
}

contract ContractB {
    address public contractAAddress;
    uint public y;

    function setXviaDelegatecall(uint _x) public {
        (bool success, bytes memory returnData) = contractAAddress.delegatecall(
            abi.encodeWithSignature("setX(uint256)", _x)
        );
        require(success, "Delegatecall failed");
    }
}

Yukarıdaki örnekte, ContractB, ContractA’yı Delegatecall kullanarak çağırır. ContractA’da bulunan “setX” fonksiyonu ContractB tarafından çağrılır ve ContractB’nin veri alanlarına erişim sağlar.

Multi Delegatecall Nedir?

Multi Delegatecall, Solidity programlama dilinde bir smart contract içindeki birden fazla fonksiyonun başka bir smart contract içindeki birden fazla fonksiyon tarafından çağrılmasını sağlayan bir yöntemdir. Bu yöntem, Delegatecall’a benzer, ancak birden fazla smart contract’in fonksiyonlarını çağırmak için kullanılır.

Multi Delegatecall, bir dizi Delegatecall işlemi yaparak birden fazla smart contract arasında işlevsellik paylaşımını sağlar. Bu sayede kod tekrarını önleyerek daha modüler bir kod tasarımı sağlar.

Multi Delegatecall kullanırken, çağrılan smart contractlerin güvenli olduğundan emin olmak önemlidir. Aksi takdirde, kötü amaçlı kullanıcılar, güvenli olmayan bir smart contract’in kullanılması yoluyla smart contract’i ele geçirebilir ve istenmeyen işlemler gerçekleştirebilir.

Multi Delegatecall örneği:

pragma solidity ^0.8.0;

contract ContractA {
    uint public x;

    function setX(uint _x) public {
        x = _x;
    }
}

contract ContractB {
    uint public y;

    function setY(uint _y) public {
        y = _y;
    }
}

contract ContractC {
    address public contractAAddress;
    address public contractBAddress;

    function setXandYviaMultiDelegatecall(uint _x, uint _y) public {
        (bool success1, ) = contractAAddress.delegatecall(
            abi.encodeWithSignature("setX(uint256)", _x)
        );
        require(success1, "Delegatecall to ContractA failed");

        (bool success2, ) = contractBAddress.delegatecall(
            abi.encodeWithSignature("setY(uint256)", _y)
        );
        require(success2, "Delegatecall to ContractB failed");
    }
}

Yukarıdaki örnekte, ContractC, ContractA ve ContractB’yi Multi Delegatecall kullanarak çağırır. ContractA’daki “setX” fonksiyonu ve ContractB’deki “setY” fonksiyonu, ContractC tarafından çağrılır ve ContractC’nin veri alanlarına erişim sağlar.

Delegatecall ve Multi Delegatecall Arasındaki Farklar Nelerdir?

Delegatecall ve Multi Delegatecall arasındaki temel fark, Delegatecall’ın bir smart contract içindeki bir fonksiyonun başka bir smart contract içindeki bir fonksiyon tarafından çağrılmasına izin verirken, Multi Delegatecall’ın bir smart contract içindeki birden fazla fonksiyonun birden fazla smart contract içindeki fonksiyonlar tarafından çağrılmasına izin vermesidir.

Delegatecall, bir smart contract içindeki kodun yeniden kullanımını sağlar ve kod tekrarını önler. Ancak, Delegatecall kullanımında güvenlik riskleri vardır, özellikle çağrılan smart contract’in güvenli olup olmadığına dair şüpheler varsa.

Multi Delegatecall, bir dizi Delegatecall işlemi yaparak birden fazla smart contract arasında işlevsellik paylaşımını sağlar. Bu sayede kod tekrarını önleyerek daha modüler bir kod tasarımı sağlar. Ancak, Multi Delegatecall kullanırken, çağrılan smart contractlerin güvenli olduğundan emin olmak önemlidir.

Özetle, Delegatecall tek bir smart contract içindeki fonksiyonların başka bir smart contract içindeki fonksiyonlar tarafından çağrılmasına izin verirken, Multi Delegatecall birden fazla smart contract içindeki fonksiyonların birden fazla smart contract içindeki fonksiyonlar tarafından çağrılmasına izin verir.

Multi Delegatecall Kullanım Senaryoları

Multi Delegatecall, Solidity programlama dilinde birden fazla smart contract arasında işlevsellik paylaşımını sağlamak için kullanılabilir. Aşağıda Multi Delegatecall kullanım senaryolarının bazıları verilmiştir:

  1. Modüler Kod Tasarımı: Multi Delegatecall, birden fazla smart contract içindeki benzer fonksiyonları birleştirmek için kullanılabilir. Bu sayede, kod tekrarını önleyerek daha modüler bir kod tasarımı sağlanabilir.
  2. Düşük Gaz Tüketimi: Multi Delegatecall, birden fazla smart contract arasındaki veri aktarımını optimize ederek düşük gaz tüketimi sağlayabilir. Bu sayede, daha verimli bir smart contract kodu yazılabilir.
  3. Kullanıcı Verilerinin Paylaşımı: Multi Delegatecall, birden fazla smart contract arasında kullanıcı verilerini paylaşmak için kullanılabilir. Örneğin, bir smart contract, kullanıcı verilerini birinci smart contract’tan alabilir ve ikinci smart contract’a gönderebilir.
  4. Sözleşme Yeniden Kullanımı: Multi Delegatecall, bir smart contract’in bir başka smart contract içindeki işlevlerini yeniden kullanmak için kullanılabilir. Bu sayede, kod tekrarını önleyerek daha verimli bir kod tasarımı sağlanabilir.
  5. Topluluk Geliştirme: Multi Delegatecall, farklı geliştiricilerin yazdığı smart contract’ları birleştirmek için kullanılabilir. Bu sayede, daha kapsamlı bir smart contract kodu yazılabilir ve topluluk geliştirme süreci kolaylaştırılabilir.

Özetle, Multi Delegatecall, birden fazla smart contract arasında işlevsellik paylaşımını sağlamak için kullanılabilir ve daha modüler, verimli ve kapsamlı bir kod tasarımı sağlayabilir. Ancak, güvenlik risklerini azaltmak için çağrılan smart contractlerin güvenli olduğundan emin olmak önemlidir.

Multi Delegatecall Örnekleri

Aşağıda, Multi Delegatecall kullanım örnekleri verilmiştir:

Fonksiyonların Çağrılması: İki farklı smart contract içindeki fonksiyonlar arasında Multi Delegatecall kullanarak fonksiyonlar arasında veri aktarımı yapılabilir. Örneğin, aşağıdaki örnek, ilk smart contract içindeki “setVal” fonksiyonunu çağırır ve ikinci smart contract içindeki “getVal” fonksiyonunu çağırarak veriyi geri döndürür:

pragma solidity ^0.8.0;

contract ContractA {
    uint public value;

    function setVal(uint _value) public {
        value = _value;
    }
}

contract ContractB {
    uint public value;

    function getVal() public returns (uint) {
        return value;
    }

    function setVal(address _contract, uint _value) public {
        (bool success, bytes memory returnData) = _contract.delegatecall(abi.encodeWithSignature("setVal(uint256)", _value));
        require(success);
    }
}

Birden Fazla Smart Contract Arasında Veri Aktarımı: Birden fazla smart contract arasında veri aktarımı yapmak için Multi Delegatecall kullanılabilir. Örneğin, aşağıdaki örnek, ilk smart contract içindeki “setVal” fonksiyonunu çağırarak veriyi kaydeder ve ikinci smart contract içindeki “getVal” fonksiyonunu çağırarak kaydedilen veriyi geri döndürür:

pragma solidity ^0.8.0;

contract ContractA {
    uint public value;

    function setVal(uint _value) public {
        value = _value;
    }
}

contract ContractB {
    uint public value;

    function getVal() public returns (uint) {
        return value;
    }

    function setVal(address _contractA, address _contractB, uint _value) public {
        (bool successA, bytes memory returnDataA) = _contractA.delegatecall(abi.encodeWithSignature("setVal(uint256)", _value));
        require(successA);
        (bool successB, bytes memory returnDataB) = _contractB.delegatecall(abi.encodeWithSignature("getVal()"));
        require(successB);
        value = abi.decode(returnDataB, (uint));
    }
}

Bu örnekler, Multi Delegatecall kullanarak birden fazla smart contract arasında veri aktarımı yapmanın nasıl yapılabileceğini göstermektedir. Ancak, güvenlik risklerini azaltmak için çağrılan smart contractlerin güvenli olduğundan emin olmak önemlidir.

Akıllı Sözleşme Örneği İNCELEME

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract MultiDelegatecall {
    error DelegatecallFailed();

    function multiDelegatecall(
        bytes[] memory data
    ) external payable returns (bytes[] memory results) {
        results = new bytes[](data.length);

        for (uint i; i < data.length; i++) {
            (bool ok, bytes memory res) = address(this).delegatecall(data[i]);
            if (!ok) {
                revert DelegatecallFailed();
            }
            results[i] = res;
        }
    }
}

// Why use multi delegatecall? Why not multi call?
// alice -> multi call --- call ---> test (msg.sender = multi call)
// alice -> test --- delegatecall ---> test (msg.sender = alice)
contract TestMultiDelegatecall is MultiDelegatecall {
    event Log(address caller, string func, uint i);

    function func1(uint x, uint y) external {
        // msg.sender = alice
        emit Log(msg.sender, "func1", x + y);
    }

    function func2() external returns (uint) {
        // msg.sender = alice
        emit Log(msg.sender, "func2", 2);
        return 111;
    }

    mapping(address => uint) public balanceOf;

    // WARNING: unsafe code when used in combination with multi-delegatecall
    // user can mint multiple times for the price of msg.value
    function mint() external payable {
        balanceOf[msg.sender] += msg.value;
    }
}

contract Helper {
    function getFunc1Data(uint x, uint y) external pure returns (bytes memory) {
        return abi.encodeWithSelector(TestMultiDelegatecall.func1.selector, x, y);
    }

    function getFunc2Data() external pure returns (bytes memory) {
        return abi.encodeWithSelector(TestMultiDelegatecall.func2.selector);
    }

    function getMintData() external pure returns (bytes memory) {
        return abi.encodeWithSelector(TestMultiDelegatecall.mint.selector);
    }
}

Bu örnek akıllı sözleşme, tek bir işlemle birden fazla işlevi çağırmak için delegatecall kullanımını göstermektedir. Akıllı sözleşme, “multiDelegatecall” adı verilen bir işlev içermektedir. Bu işlev, bir dizi veri (byte dizileri) içeren parametreleri almakta ve bu verileri kullanarak farklı işlevleri çağırmaktadır.

“multiDelegatecall” işlevi, belirtilen her bir işlev çağrısı için delegatecall yapar ve sonuçları bir byte dizisi içinde toplar. Delegatecall, başka bir sözleşmenin işlevini, sözleşme çağrısı yapan akıllı sözleşmenin adresinde çalıştıran bir işlemdir. Bu nedenle, bu örnekteki “multiDelegatecall” işlevi, bu sözleşmede bulunan işlevleri çağırmak için kullanılır.

Bu örnekte, “TestMultiDelegatecall” adlı bir sözleşme de tanımlanmıştır. Bu sözleşme, “func1”, “func2” ve “mint” adlı işlevleri içermektedir. “Helper” adlı bir diğer sözleşme de tanımlanmıştır ve bu sözleşme, “getFunc1Data”, “getFunc2Data” ve “getMintData” adlı işlevleri içermektedir. Bu işlevler, “TestMultiDelegatecall” sözleşmesindeki işlevlere veri parametreleri iletilmesi için kullanılır.

“func1” ve “func2” işlevleri, yalnızca olay kaydı yapar veya geri dönüş değeri döndürürler. Ancak, “mint” işlevi, kullanıcının belirli bir miktar ödeme yaparak jeton alabileceği bir işlevdir.

Ancak, bu sözleşmede “WARNING” uyarısı verilir. Bu uyarı, sözleşmenin güvenliği ile ilgilidir ve “mint” işlevinin, birden fazla kez kullanılarak kullanıcının bir kez ödeme yaparak birden fazla jeton almasına neden olabileceğini gösterir. Bu, sözleşmenin tasarımından kaynaklanan bir hatadır ve bu nedenle dikkatli bir şekilde kullanılmalıdır.

Sonuç olarak, bu örnek, tek bir işlemle birden fazla işlevin çağrılmasına olanak sağlayan “multiDelegatecall” kullanımının örneklerini göstermektedir. Bu yöntem, özellikle birden fazla işlev çağırmak istendiğinde, gas maliyetleri ve işlem süresi açısından avantajlıdır. Ancak, güvenlik nedenleriyle dikkatli bir şekilde kullanılması önemlidir.

Multi Delegatecall’ın Avantajları ve Dezavantajları

Multi Delegatecall’ın avantajları şunlar olabilir:

  • Tek bir işlemde birden fazla işlev çağrılabilir, böylece gas tasarrufu sağlanabilir.
  • Kod tekrarını önler ve kod karmaşıklığını azaltır.
  • Daha az gas kullanımı nedeniyle, işlem ücretleri daha düşük olabilir.

Ancak, Multi Delegatecall’ın dezavantajları da vardır:

  • Fonksiyonların dikkatsizce bir araya getirilmesi, beklenmedik sonuçlara neden olabilir ve hataların tespiti ve giderilmesi zor olabilir.
  • Kötü niyetli kullanıcılar, bu yöntemi kötüye kullanarak zararlı kodları işletebilirler. Bu nedenle, Multi Delegatecall kullanırken dikkatli olunması gerekir.
  • Multi Delegatecall’ın kullanımı, kodun daha fazla anlaşılmasını gerektirebilir ve geliştiricilerin daha fazla dikkat etmeleri gereken karmaşık bir işlemdir.

Multi Delegatecall ile İlgili Güvenlik İpuçları

Multi Delegatecall kullanırken, güvenliği sağlamak için aşağıdaki ipuçlarına dikkat etmek önemlidir:

  1. Gerekli işlevlerin doğru bir şekilde sıralandığından emin olun: Delegatecall ile çağrılan işlevler, doğru sırayla çağrılmalıdır. Yanlış bir sıralama, beklenmedik sonuçlara neden olabilir.
  2. Doğru parametrelerin kullanıldığından emin olun: Delegatecall ile çağrılan işlevlere, doğru parametrelerin aktarılması önemlidir. Yanlış parametreler, beklenmedik sonuçlara neden olabilir.
  3. Verilerin doğru bir şekilde işlendiğinden emin olun: Delegatecall ile çağrılan işlevler, verileri doğru bir şekilde işlemelidir. Eksik ya da yanlış işlenen veriler, beklenmedik sonuçlara neden olabilir.
  4. Kullanıcı girdilerini doğrulayın: Kötü amaçlı kullanıcılar, Multi Delegatecall kullanarak birçok fonksiyonu aynı anda çağırarak zararlı işlemler gerçekleştirebilirler. Bu nedenle, kullanıcı girdilerinin doğrulanması önemlidir.
  5. Doğru kullanım senaryolarını belirleyin: Multi Delegatecall, belirli kullanım senaryoları için uygun olabilir, ancak diğer durumlarda kullanılmaması gerekebilir. Doğru kullanım senaryolarının belirlenmesi ve uygulanması, güvenlik açığı riskini azaltabilir.
  6. Kodunuzu ve diğer akıllı sözleşmeleri güncelleyin: Güvenlik açıklarının tespit edilmesi durumunda, Multi Delegatecall’ı kullanan kodunuz ve diğer akıllı sözleşmelerinizi güncelleyin.
  7. Kodunuzu denetleyin: Multi Delegatecall’ı kullanırken, kodunuzu ve diğer akıllı sözleşmelerinizi düzenli olarak denetleyin. Bu, olası hataları ve güvenlik açıklarını önceden tespit etmenize yardımcı olabilir.

Sonuç Bağlamı

Multi Delegatecall, bir veya daha fazla fonksiyonu tek bir işlemle çağırmayı sağlayan bir Solidity fonksiyonudur. Bu yöntem, akıllı sözleşmelerin daha verimli ve kullanışlı olmasını sağlayabilir. Ancak, doğru kullanılmadığında güvenlik riskleri oluşturabilir. Bu nedenle, Multi Delegatecall kullanırken bazı güvenlik önlemlerinin alınması gerekmektedir.

Bu makalede, Multi Delegatecall’ın ne olduğu, nasıl kullanıldığı, avantajları ve dezavantajları ile ilgili bilgileri detaylı bir şekilde inceledik. Ayrıca, güvenli bir şekilde kullanmak için bazı ipuçlarına da değindik.

Sonuç olarak, Multi Delegatecall, Solidity programlamada oldukça kullanışlı bir tekniktir, ancak dikkatli kullanım gerektirir. Bu nedenle, geliştiricilerin Multi Delegatecall’ı kullanmadan önce, iyi bir şekilde araştırma yapmaları, güvenlik risklerini anlamaları ve uygun güvenlik önlemlerini alarak kodlamaları önerilir.

Solidity Programlama Dili Öğrenme yolculuğunuz hakkında daha iyi rehberlik almak için Solidity nedir? Ethereum Akıllı Sözleşmelerinin Dili Rehberi içeriğimize göz atın. Dilerseniz Yeni Başlayanlar için Solidity – Akıllı Sözleşme Geliştirme Hızlandırılmış Kursuna katılın.

Çalışmaya nereden başlayacağım diyenler için Blockchain ​​Developer Olmak İçin Yol Haritası içeriğine de muhakkak bakın.

Gelin aklınızdaki soruları SUPERPEER sohbetinde cevaplayalım.

Bu makaleyi okuduğunuz için teşekkürler! Bana destek olmak isterseniz;

Beni TwitterLinkedin ve YouTube‘da takip edin.

Kısa bir yorum bırakmayı UNUTMAYIN!

solidity101 - Solidity, 2015 yılında Christian Reitwiessner liderliğinde piyasaya sürülen, büyük harf kullanımına göre ikinci en büyük kripto para piyasası olan Ethereum tarafından oluşturulan yepyeni bir programlama dilidir.

Yazarın Profili
İlginizi Çekebilir

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir