Chainlink VRF ile Blokzincirinde Rastgele Sayı Oluşturma
Bu yazımızda Chainlink VRF yapısını anlayıp, bu yapı ile akıllı kontratta nasıl rastgele sayı üretildiğini örnek üzerinden inceleyeceğiz.
Blokzincirinde Oracle Nedir?
Chainlink VRF'e geçmeden önce, kısaca merkeziyetsiz uygulamalarda (dApp) oracle kullanımı ve öneminden bahsetmek gerekiyor. Blokzinciri bize güvenli ve merkeziyetsiz uygulamalar sağlarken diğer taraftan blokzincirinin yapısı gereği, uygulamaların dışarıdan bilgi akışı sağlaması doğrudan mümkün olmuyor. İşte burada boşluğu Oracle yapısı dolduruyor ve blokzinciri dışında bulunan (off-chain) verilerin blokzinciri içine aktarılması görevini üstleniyor. Yani Oracle, blokzinciri ile dış dünya arasında bir köprü vazifesi görüyor da diyebiliriz. Blokzincirinde oracle’lar hakkında daha detaylı bilgi için Roq4’ün “Blockchain Oracles” başlıklı yazısına bakabilirsiniz.
Chainlink VRF (Verifiable Random Function) Nedir?
Blokzincirinde rastgelelik, deterministik yapısı ve her düğümün aynı sonucu çıkartması gerektiği gibi sebeplerden dolayı ulaşılması zor ve verimsizdir. Bu nedenlerden dolayı blokzincirinde güvenilir ve verimli bir şekilde rastgele bir değer üretmek için oracle’lar iyi bir çözüm olarak karşımıza çıkıyorlar.
Bu yazıdaki odağımız Chainlink VRF, bize blokzincirinde ihtiyacımız olan rastgele bir sayı üretimini, güvenli bir biçimde sağlayan yapılardan biridir ve hâlihazırda birçok oyun, piyango vb. merkeziyetsiz uygulamalarda rastgele sayı üretiminde kullanılmaktadır.
Özetle Chainlink VRF;
Rastgele sayı üretmek için kullanılan bir oracle'dır.
Üretilen sayılar şifrelenmiş kanıtlar ile doğrulanır.
Bu kanıtlar sayesinde, sonuçların oracle operatörleri, kullanıcılar veya madenciler tarafından manipüle edilmediği ispat edilir.
Kanıtlar blokzincirinde (on-chain) yayınlandığından doğrulanabilirlerdir.
Doğrulama başarılı olduktan sonra akıllı kontratlar tarafından rastgele değer üretimi için kullanılırlar.
Çalışma Mantığı:
Rastgele sayı üretmek için öncelikle kullanılacağı akıllı kontrat, Chainlink’in VRFConsumerBase.sol kontratını miras alır.
VRFConsumerBase, rastgele sayı üretiminden sorumlu VRFCoordinator kontratını çağırır.
VRFCoordinator off-chain olarak üretilen sayıyı doğrulatmak üzere geri gönderir.
Rastgele sayı üretimi için miras alınan kontrattaki şu iki fonksiyon kullanılır:
requestRandomness: Rastgelelik için ilk talep bu fonksiyon ile yapılır.
fulfillRandomness: Oluşturulan sayının doğruluğunu kontrol eder ve kullanıma sunar.
Chainlink VRF çalışma diyagramı:
Akıllı sözleşme ile basit bir Chainlink VRF kullanım örneği
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@chainlink/contracts/src/v0.8/VRFConsumerBase.sol";
// VRFConsumerBase kontratı miras alınıyor
contract MyContract is VRFConsumerBase {
bytes32 internal keyHash;
uint256 internal fee;
uint256 public randomResult;
// VRFCoordinator ve LINK adresi ile keyHash ile fee tanımlanıyor
// kaynak: docs.chain.link/vrf/v1/supported-networks/
constructor()
VRFConsumerBase(
// Mumbai Testnet Chainlink VRF Coordinator Adresi
0x8C7382F9D8f56b33781fE506E897a4F1e2d17255,
// Mumbai Testnet Chainlink LINK Token Adresi
0x326C977E6efc84E512bB9C30f76E30c160eD06FB
)
{
keyHash = bytes32("0x6e75b569a01ef56d18cab6a8e71e6600d6ce853834d4a5748b720d06f878b3a4");
fee = 0.1 * 10 ** 18; // 0.1 LINK
}
// Chainlink VRFe rastgele sayı için istek gönderiliyor
function getRandomNumber() public returns (bytes32 requestId) {
require(
LINK.balanceOf(address(this)) >= fee,
"Not enough LINK - fill contract with faucet"
);
return requestRandomness(keyHash, fee);
}
// Chainlink VRF ten dönen rastgele sayıyı getiyor
function fulfillRandomness(
bytes32 requestId,
uint256 randomness
) internal override {
randomResult = randomness;
}
}
Yukarıdaki örnekte basitçe bir akıllı sözleşme ile Chainlink VRF kullanarak rastgele sayının nasıl üretildiğini görüyoruz. Hadi adım adım inceleyelim:
Öncelikle
VRFConsumerBase
kontratı miras alınmış.Ardından Constructor içinde
VRFCoordinator
veLINK
kontrat adresleri ilekeyHash
vefee
tanımlanmış.getRandomNumber
fonksiyonu ile Chainlink VRF'ekeyHash
vefee
için gerekli link token ile istek gönderiliyor.Buradan sonra arka planda chainlink VRF off-chain rastgele sayı oluşturup kontrattan gelen kanıt ile bu işlemi doğrular.
Tüm bu işlemlerin ardından
fulfillRandomness
fonksiyonu ile, oluşturulan ve doğrulanmış rastgele sayı istek gönderen kontrata geri gönderilir ve rastgele sayı başarıyla oluşturulmuş olur.
Sonuç
Blokzincirinde güvenli bir şekilde rastgele sayılar üretmek için oluşturulan çözümlerden biri olan Chainlink VRF, bu yapısı ile oyunlar, çekilişler ve diğer rastgelelik gereken merkeziyetsiz uygulamalarda kullanılmak üzere (dApp) iyi bir alternatif olarak öne çıkıyor.
Kaynaklar:
https://docs.chain.link/getting-started/intermediates-tutorial/
İletişim için bana Twitter'dan ulaşabilirsiniz.