ORACLE KAVRAMI VE CHAINLINK
Oracle Kavramı Ve Akıllı Sözleşmelerin Durumu
Ethereum veya başka bir blokzincirde akıllı sözleşmeler ile herhangi bir iş akış modeli tasarlarken modelimizin bağımsız ve otonom şekilde karar alıp hareket etmesini sağlayabilme esnekliğine sahip oluyoruz. Bu yaklaşım bize daha önce hiçbir yazılımsal mimari içerisinde sunulmayan bir yenilik ve yaklaşım getiriyor. Ancak bazı durumlarda (hatta çoğu zaman) akıllı sözleşmeler karar verebilmek için zincir dışı gerçek verilere ihtiyaç duymaktadır. Akıllı sözleşmeler, dışarıdan, zincir dışı gelen veriler sayesinde event ve fonksiyonlarının tetiklenmesi ile karar mekanizmalarını tam bir otonomluk içerisinde gerçekleştirebilmektedir. Bu yapı olmadan değişen şartlara göre karar vericilik ve otonomluk maalesef mümkün olmamaktadır.
Zincir dışı verileri (gerçek dünya verileri) zincir içerisine bir blokzincir ara katmanı olarak sağlayan bu yapılara oracle denilmektedir. Bu yapıların ilk Chainlink sistemidir. Bilindiği üzere veriler, akıllı sözleşmelere dış bir katmandan gelmektedir (backend servis ve web3 bağlantısı ile). Chainlink ise bunu farklı bir noktaya taşıyıp akıllı sözleşmelerin akıllı sözleşmeler ile entegre olmasına ve birbirini çağırıp veri alışverişini sağlamasına olanak tanımıştır.
Chainlink bir api görevi üstlenmektedir. Dış dünya verilerini (borsa verileri, büyük veri, zaman vb…) merkezi olmayan bir sistem ile talep eden akıllı sözleşmelere belli bir talep (request) ücreti ile sağlamaktadır. Bu yapının mümkün olması için chainlink node yapılarının çalıştırılması gerekmektedir.
Chainlink çalışma prensibi şu şekildedir; dış dünya verisine ihtiyaç duyan akıllı sözleşmeler chainlink sözleşmeleri üzerinden istek (req), iş (job) oluşturarak chainlink node yapılarının ilgili yerlerden web api çağrılarını yapmalarını sağlar, gelen cevaplar (response) tekrar akıllı sözleşmelere yani zincire gönderilir. Merkezi olmama durumu, dış dünyadan gelen bireysel cevapların mevcut bir fikir birliği mekanizması ile birleştirilerek talep eden akıllı sözleşmeye döndürülmesi sürecini ifade eder.
Chainlink ve merkezi olmama kavramı
- Veri kaynaklarının farklılaşması : Sistem tek bir kaynak yerine birçok kaynaktan verinin toplanması esasına göre tasarlanmıştır, sonucu bulmak için farklı sistemlerden gelen yanıtlar kullanılır.
- Node dağıtık yapısı : Her bir oracle sözleşmesi, Apache Kafka mimarisindeki broker ve topic yapılarına benzer dağıtıklığı sağlamak üzere birden fazla chainlink node yapısına bağlıdır.
Chainlink ile verileri, api vasıtasıyla alabildiğimizden bahsetmiştik. Veri kümelerine erişebilmek için adaptör ve job tanımlamamız gerekmektedir.
Adaptör tanımlama
- 35. satırda chainlink akıllı sözleşmesindeki request nasıl oluşturulur görüyoruz.
- Öncelikle buildChainlinkRequestmetodu ile bir istek (request) oluşturuyoruz.
- İlk parametre: Jobid
- İkinci parametre: Callback adresi
- Üçüncü parametre: Callback metodur.
- 37. satırda “https://min-api.cryptocompare.com/dataprice?fsym=ETH&tsyms=USD”
- adresinden veri çekim işlemi istediğimizi belirtiyoruz. Bu işlem Ethereum’ un usd karşılığı nedir sorusuna cevaptır.
- 39. satırda “USD” yani dolar bilgilerinin ayracımız olduğunu belirtiyoruz.
- 41. satırda bize api sonrası gelen değer küsuratlı olacağı ve solidity decimal değerler
- taşımadığı için bu değeri 100 ile çarpıyoruz. Sonuç 401.32 ise bize 40132 değeri ulaşacaktır.
- 43. satırda bu istek için bir oracle adresine yeterli miktarda link token ödemesi yapıyoruz.
Callback tanımlama
Bu metodun api çağrısı yapmasından sonra gelen verinin akıllı sözleşmeye işlenebilmesi için tanımlanan son parametre olan callback yürütülür (fulfill). Ethereum fiyatı artık usd cinsinden akıllı sözleşmemizin içindedir.
Chainlink market
Zincirin ihtiyaç duyduğu verilerin sağlanabilmesi ve dokümantasyonun standartlaşması için Chainlink epey mesafe yol almış görünüyor. Birçok farklı proje hali hazırda Chainlink node yapıları ile çalışıyor; büyük veri, nesnelerin interneti, anlık hava tahmin verileri, borsa verileri gibi sorgulama tipleri link market üzerinden job ve adaptör olarak hazır sunulmuştur. Aşağıdaki bu market içerisinde get verb ile uint256 değeri getiren job listesi görülmektedir. Sorgulama fiyatları da link token cinsinden yer almaktadır.
Şimdi ise job tabına geçelim. Buradan bizimle ilgili olabilecek job id nedir onu öğrenelim. Aşağıda görüldüğü gibi Node Job Id bize job id bilgisini vermektedir.
Şimdi bu job id bilgisini yukarıdaki solidity kodu esnasında gösterdiğimiz (35. satırda chainlink akıllı sözleşmesindeki request nasıl oluşturulur) jobid parametresine koymamız gerekir.
- Chainlink.Request memory req = buildChainlinkRequest(JOBID, address(this), this.fulfill.selector);
- (2044aab730844d8c811c7a5fcfde57c9, adress, callback) gibi