Ethereum Oracle Sözleşmeleri: Kurulum ve Oryantasyon

Yayınlanan: 2022-03-11

Ethereum Akıllı Sözleşmeleri, sadece “yeni sıcak şey”den daha fazlasıdır. Benim inancım, onların (veya ilgili bir şeyin), internetin yaklaşmakta olan yeni çağında insanların birbirleriyle iş yapma şeklini değiştirmeye hazır olduklarına. Durumun böyle olup olmadığını zaman gösterecek.

Bu, Solidity ile Ethereum akıllı sözleşme geliştirme üzerine üç bölümden oluşan bir makalenin ilkidir ve özellikle diğer akıllı sözleşmeler tarafından kullanılmak üzere blok zincirine veri pompalayan sözleşmeler olan “oracles” ile sözleşmelerin kullanımını araştırır.

  • Bölüm 1: Truffle ile geliştirmeye giriş ve daha fazla deney için proje kurulumu
  • Bölüm 2: Daha derin bir inceleme için kodun derinlemesine incelenmesi
  • Bölüm 3: Akıllı sözleşmelerle kahinlerin kavramsal bir tartışması

Serinin 1. bölümü olan bu bölümün amacı, kehanet sözleşmeleri kavramına, arkasındaki felsefeye ve hatta ne olduklarına çok derinden girmek değil; Ethereum oracle eğitimimizin bu bölümünün amacı basitçe:

  • Truffle ile akıllı sözleşmeler oluşturmaya hazır olun.
  • 2. ve 3. bölümlerde bize hizmet edecek bir akıllı sözleşme projesi oluşturun.
  • Ethereum akıllı sözleşmeleri ve akıllı sözleşmelerin kodlanması ile ilgili birkaç kavramı tanıtın.
  • Truffle ve akıllı sözleşmelerle derleme/çalıştırma/hata ayıklama döngüsünü tanıtın.

tanım: Oracle. Akıllı sözleşmelerin blok zinciri dışındaki dünyadan verilere erişmesi için bir araç. Bir tür akıllı sözleşmenin kendisi olan kahinler, dış dünyadan veri alır ve diğer akıllı sözleşmelerin tüketmesi için blok zincirine koyar.

Bu makalenin ilk bölümü, tüm önkoşullarla kurulumdan oluşacaktır. Ardından, tek bir Ethereum sözleşmesi oluşturacağız ve bunu Truffle ile test edeceğiz. Son olarak, Oracle'ı istemciden ayıracağız ve birlikte test edeceğiz.

yazılım gereksinimleri

  • Herhangi bir büyük işletim sistemi çalışacaktır, ancak bazı kurulum ve kurulumlar elbette farklı sistemlerde farklı olacaktır. Bunların hepsini Ubuntu Linux'ta (16.04) yaptım. Ayrıca Windows'ta ortamı kurarken sorun yaşamadım. Mac'i denemedim, ancak bunu Mac'te de yapmanın yaygın olduğunun farkındayım.
  • Tam bir eth düğümü çalıştırmak gerekli değildir; kendi testnet'i ile gelen Truffle'ı kullanacağız. Ne yaptığınız hakkında biraz bilginiz varsa, seçtiğiniz herhangi bir başka test ağını kullanabilirsiniz; Truffle'ın yerel geliştirme test ağı, bu eğitimin amaçları için en kolay ve en erişilebilir olanıdır.

Bilgi Gereksinimleri

  • Blockchain'in nasıl çalıştığına dair temel bilgiler
  • Blockchain tabanlı akıllı sözleşmenin ne olduğunu anlamak
  • Akıllı sözleşme geliştirme ile ilgili bazı temel merhaba-dünya deneyimi yardımcı olacaktır, ancak akıllı ve hırslıysanız gerekli değildir. (Ve senin olduğunu biliyorum!)

Bu makale dizisi, akıllı sözleşmelere ilk giriş olarak hizmet edebilir , ancak çok hızlı bir şekilde daha gelişmiş kavramlara dönüşür. Bu sizin ilk akıllı sözleşme eğitiminizse, hızla irtifaya tırmanmaya hazır olun. Kendinize güveniyorsanız, harika; Değilse, önce kemerinizin altına daha basit bir "merhaba dünya" türü eğitim almaktan çekinmeyin. Yeni başlayanlar için bir veya önceki Ethereum makalelerine ve Cryptozombies'e göz atın.

Uyarı: Akıllı sözleşme alanı, çok yeni olduğu için hızla değişiyor. Bu makale yazıldığında yeni olan Solidity sözdizimi özellikleri, siz bu yazıyı okurken kullanımdan kaldırılmış veya eskimiş olabilir. Geth sürümleri gelip gitmiş olabilir. Solidity her zaman yeni dil özellikleri ekliyor ve eskilerini kullanımdan kaldırıyor. Şu anda birçok yeni özellik çalışıyor. Bu nedenle, gerekirse bu makaledeki bilgileri geleceğin yeni manzarasına uyarlamaya hazır olun; Akıllı sözleşme geliştirmeyi öğrenmek konusunda ciddiysen, sana güveniyorum.

Örnek Uygulamanın Açıklaması

Kullanım durumu: Kullanıcılar boks maçlarına bahis oynar.

  • Kullanıcı, bahis yapılabilir boks maçlarının bir listesini çıkarabilir.
  • Kullanıcı bir maç seçebilir ve kazanana bahis yapabilir.
  • Kullanıcı, belirli bir minimumun üzerinde herhangi bir miktarda bahis oynayabilir.
  • Kullanıcının seçimi kaybederse, kullanıcı bahsin tamamını kaybeder.
  • Kullanıcının seçimi kazanırsa, kasa (sözleşme sahibi) kazancın küçük bir yüzdesini aldıktan sonra, kullanıcı, bahsinin büyüklüğüne ve maçın kaybedenine yapılan toplam bahis miktarına göre potun bir kısmını alır. .

Ethereum Oracle Nedir?

Akıllı sözleşmeler hala yeni bir şey; henüz ana akım haline gelmediler ve nasıl çalışacaklarına dair pek çok yön henüz dövülmedi ve standartlaştırılmadı. “Kâhin” fikrinin arkasındaki itici gücü kısaca açıklayacağım ve sabırlı olun; ilerleyen bölümlerde daha derinlemesine ele alacağız.

Bir blok zinciri sözleşmesi tasarlamak, bir istemci-sunucu uygulamasını programlamak gibi değildir. Önemli bir fark, sözleşmenin etkileşimde bulunduğu verilerin zaten blok zincirinde olması gerektiğidir. Blok zincirinden arama yok . Sadece dil tarafından desteklenmiyor, blok zinciri paradigması tarafından da desteklenmiyor. Sözleşme, Ethereum tabanlı para birimi biçimindeki bahisleri alabilir, sözleşmede saklayabilir ve bir maçın galibi açıklandığında bir formüle göre doğru cüzdan adreslerine bırakabilir. Ama sözleşme kazananı nasıl biliyor? Bir REST API'sini veya bunun gibi bir şeyi sorgulayamaz. Yalnızca blok zincirinde bulunan verileri kullanabilir! Akıllı sözleşmelerin birçok kullanım durumu benzer bir sorunla karşılaşır - blok zincirinin dışındaki dünyayla etkileşime giremedikleri sürece ciddi şekilde sınırlıdırlar.

Sözleşme yalnızca blok zincirindeki verilerle etkileşime girebiliyorsa, bariz bir çözüm gerekli verileri blok zincirine enjekte etmektir. Ve bir kehanet budur. Oracle, blok zincirine veri enjekte eden ve diğer sözleşmelerin onu tüketmesine izin veren başka bir sözleşmedir. Bu, güven ve güvensizlik hakkında soruları gündeme getirse de, şimdilik bir kehanetin bu olduğunu kabul edin. Bu serinin 3. bölümünde, bu nüansları tartışacağız. Örnek kullanım durumumuzda, Oracle, (a) hangi eşleşmelerin mevcut olduğu ve (b) karar verildikten sonra bu maçları kimin kazandığı ile ilgili verileri blok zincirine enjekte eden sözleşme olacaktır.

Ethereum Geliştirme Ortamını Ayarlama

Temel kurulum için şunları kuracağız:

  • Geth (şimdilik isteğe bağlı)
  • yer mantarı
  • Ganache CLI (isteğe bağlı)
  • Bir geliştirme ortamı (isteğe bağlı)

Bu makale, ortam kurulumu için tam bir kılavuz olacak alana sahip değildir, ancak yalnızca kaba bir kılavuz görevi görür. Yine de sorun değil, çünkü kendi işletim sisteminiz için zaten çok sayıda eksiksiz kurulum kılavuzu var ve internetin gerçekten yenisine ihtiyacı yok. Bu yüzden sizi hızla yoldan aşağı indireceğim ve gerektiğinde daha fazla ayrıntı almak için bazı kaynaklara yönlendireceğim. Sisteminizin gerektirdiği ve Google'ın sizi yönlendirdiği şekilde gereksinimleri ve ön koşulları yüklemeye hazır olun.

Oracle sözleşmeleri süreç çizimi

Geth'i yükleyin (isteğe bağlı)

Geth kurulumunun ekran görüntüsü Resmi tam boy görmek için tıklayın.

Geth, Ethereum çekirdek yazılımı olan Go-ethereum'dur; Bu alıştırma için hiç gerekli olmasa da, herhangi bir Ethereum geliştiricisinin buna sahip olması ve aşina olması gerekir. Akıllı sözleşmenizi canlı Ethereum ağına dağıtacaksanız bu gerekli olacaktır.

  • http://www.talkcrypto.org/blog/2018/01/23/what-is-geth/
  • https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Ubuntu
  • https://github.com/ethereum/go-ethereum/wiki/Installation-instructions-for-Windows

Truffle yükleyin

Truffle kurulumunun ekran görüntüsü Resmi tam boy görmek için tıklayın.

Trüf, geliştirme için kullanacağımız ana şeydir ve kesinlikle bu kılavuz için bir gerekliliktir. Truffle'ı yüklemek için işletim sisteminize özel talimatları bulun ve uygulayın. Aşağıda size yardımcı olacağını umduğumuz bazı bağlantılar bulunmaktadır.

  • https://truffleframework.com/docs/truffle/getting-started/installation
  • https://github.com/trufflesuite/truffle
  • https://truffleframework.com/tutorials/how-to-install-truffle-and-testrpc-on-windows-for-blockchain-development

Ganache CLI'yi yükleyin (isteğe bağlı)

Ganache CLI kurulumunun ekran görüntüsü Resmi tam boy görmek için tıklayın.

Başka bir test aracı olarak kullanmak için Ganache CLI'yi yüklemenizi öneririm, ancak aslında onu eğitimimiz için kullanmayacağız. İsteğe bağlı.

https://github.com/trufflesuite/ganache-cli

Ethereum Geliştirme Ortamı

Bu öğreticinin tamamını Notepad++, gedit, vi gibi herhangi bir basit metin düzenleyici veya seçtiğiniz herhangi bir metin düzenleyici veya IDE ile yapmak mümkün olduğundan çok daha fazla olacaktır. Şahsen aşağıdaki uzantılarla Visual Studio Code kullanıyorum:

  • sağlamlık
  • sağlamlık genişletilmiş
  • Malzeme simgesi teması

Not: Uzantılar gerekli değildir; yalnızca daha iyi bir kodlama ortamı sağlarlar.

Kodu Ayarlama

Proje Kurulumu

Truffle, akıllı sözleşmeleri derlemek, bunları bir blok zincirine taşımak için çok uygun bir araçtır ve ayrıca geliştirme ve hata ayıklama yardımcı programları sağlar. Truffle ile entegrasyon için bazı proje kurulumları gerekli olacaktır. Şimdi hem Truffle'da hem de dizin yapısında projemiz için kabuğu ayarlayacağız. Şimdilik arkanıza yaslanın, adımları robotik olarak takip edin ve keyfini çıkarın.

Tüm kodu barındıracak bir dizin oluşturun; oracle-örnek olarak adlandırın.

Kök dizinin içinde iki alt dizin oluşturun, çünkü sonunda proje iki alt projeden oluşacaktır. Dizinleri oluşturun:

  • /oracle-örnek/istemci
  • /oracle-örnek/oracle

İstemci klasörüne gidin, çünkü geliştireceğimiz ilk proje bu. /Oracle-example/client klasöründe bir terminal (komut satırı) penceresi açın.

truffle init komutunu çalıştırın.

Oluşturulan birçok dosya arasında truffle-config.js ve truffle.js olduğunu unutmayın. Her ikisine de ihtiyacımız yok, bu yüzden truffle-config.js dosyasını silin (sadece karışıklığı ve dağınıklığı önlemek için).

Truffle'ı test için doğru yöne yönlendirmek için truffle.js dosyasını düzenlememiz gerekiyor. truffle.js'nin içeriğini aşağıdakiyle değiştirin:

 module.exports = { networks: { development: { host: "localhost", port: 8545, network_id: "*" // Match any network id } } };

https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/truffle.js

Truffle init'in geçişler ( oracle-example/client/migrations ) adlı bir dizin oluşturduğunu unutmayın. Bu klasörün içinde 1_initial_migration.js adlı bir dosya olmalıdır.

Taşıma dizinine başka bir dosya ekleyin ve aşağıdaki içerikle 2_deploy_contracts.js olarak adlandırın:

 var BoxingBets = artifacts.require("BoxingBets"); module.exports = function(deployer) { deployer.deploy(BoxingBets); };

https://github.com/jrkosinski/oracle-example/tree/part1-step1

Kodu Ekleme

Artık basit kurulum yoldan çıktığına göre, kodlamaya başlamaya hazırız. Unutmayın, makalenin bu kısmı hala giriş ve kurulum aşamasındadır, bu yüzden kodu oldukça hızlı bir şekilde inceleyeceğiz. 2. bölümde kodun daha derinlemesine açıklamalarına ve 3. bölümde mimari ve konsepte ilişkin daha derinlemesine tartışmaya gireceğiz. Bununla birlikte, kodda belirgin olan bazı temel kavramlara hızlıca değineceğiz. Devam etmek için dikkatlice takip edin.

İşlemdeki bu adımın tam kodu GitHub'da mevcuttur: https://github.com/jrkosinski/Oracle-example/tree/part1-step1

Solidity'deki Sözleşmeler

Solidity'deki bir "sözleşme", diğer nesne yönelimli dillerdeki bir sınıfa kabaca benzer. Dilin kendisi, diğerleri arasında Golang ve JavaScript ile karşılaştırıldı. Solidity'deki diğer bazı dil yapıları (daha sonra örneklerine sahip olacağız) değiştiriciler, kitaplıklar ve arayüzlerdir. Devralma (birden çok devralma dahil) sözleşmeler için desteklenir. Solidity sözleşme dosyalarının bir .sol uzantısı vardır.

Oracle Arayüzü

Bu dosyayı projenize ekleyin: /oracle-example/client/contracts/OracleInterface.sol

https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/contracts/OracleInterface.sol

Oracle arayüzünün ekran görüntüsü Resmi tam boy görmek için tıklayın.

Normalde, Oracle arayüzü tam da bu olurdu - bir arayüz. Bu ilk yineleme için, sadece şimdilik bir yer tutucu olarak, Solidity projesinde yer alan basit bir sınıftır. Truffle'da sözleşmeyi başarıyla derleyip çalıştırdıktan sonraki adımda bunu kaldıracağız. Bunu daha sonra gerçek bir arayüze dönüştürdükten sonra, fonksiyon uygulamaları boş olacaktır.

Müşteri Sözleşmesi

Bu dosyayı projenize ekleyin: /oracle-example/client/contracts/BoxingBets.sol

https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/contracts/BoxingBets.sol

Bu, boks maçı verilerini tüketen, kullanıcıların mevcut maçları sorgulamasına ve bunlara bahis oynamasına izin veren sözleşmedir. Daha sonraki iterasyonlarda, kazançları hesaplayacak ve ödeyecektir.

Derleme ve Çalıştırma

Şimdi her şeyi ilk seferde doğru yapıp yapmadığımızı göreceğimiz zaman!

Sözleşmeyi Derleyin ve Taşıyın

/Oracle-example/client/ klasöründe bir terminal açın

Kodu şu komutla derleyin:

 truffle compile 
Sözleşmeyi derleme ve taşımanın ekran görüntüsü Resmi tam boy görmek için tıklayın.
Sözleşmenin derlenmesine ve taşınmasına ilişkin ikinci ekran görüntüsü Resmi tam boy görmek için tıklayın.

Alternatif: recompile.sh Shell betiğimi kullanın (https://github.com/jrkosinski/Oracle-example/tree/part1-step1/client/recompile.sh).

Bir çok uyarı göreceğinizi unutmayın, çünkü kodumuz henüz son halinde değil!

Truffle geliştirme konsolunu açın:

 truffle develop

Şimdi, Truffle geliştirici konsolunda test ağına geçiş yapın:

 truffle(develop)> migrate

Sözleşmeyi Çalıştır

Geliştirme konsolu isteminde aşağıdaki kod satırını girin:

 truffle(develop)> BoxingBets.deployed().then(inst => { instance = inst })

Şimdi, "örnek", BoxingBets sözleşmesine atıfta bulunan ve genel yöntemlerini çağırmak için kullanılabilen değişkendir.

Aşağıdaki komutu kullanarak test edin:

 truffle(develop)> instance.test(3, 4)

BoxingBets.sol'e genel bir "test" işlevi eklediğimizi unutmayın. Ona ilettiğiniz iki sayıyı bir araya getirir, sadece sözleşmenin kodu yürüttüğünü ve onu Truffle geliştirme konsolundan çağırabileceğimizi göstermek için. Aklı başında bir yanıt alırsak (aşağıya bakın), buradaki işimiz bitti (en azından şimdilik).

Ethereum Oracle'ı ayırın

Şimdiye kadar her şey başarılı olduysa, o zaman kamburun üzerindeyiz. Bir sonraki yapacağımız şey, oracle sözleşmesini BoxingBets sözleşmesinden ayırmaktır. Gerçek kullanımda, Oracle sözleşmesi blok zincirindeki müşteri sözleşmesinden ayrı olarak var olacaktır, bu nedenle şunları yapabilmemiz gerekir:

Ethereum oracle sözleşme süreçlerinin şeması

  • Blockchain adresi ile somutlaştırın.
  • İstemci sözleşmesinin Oracle'a başvurmak için kullandığı Oracle adresini dinamik olarak değiştirin.

Kısacası, şimdi yapacağımız şey, kahin ve müşteriyi iki ayrı blok zinciri sözleşme varlığına ayırmak ve birbirleriyle konuşmalarını sağlamak. İstemci, oracle'ı adrese göre başlatacak ve arayacaktır.

Müşteri Sözleşmesi

İlk olarak, istemci sözleşmesini (istemci), somut bir sınıf yerine bir oracle'a dinamik bir arayüze atıfta bulunacak şekilde değiştireceğiz. Ardından, bir dış sözleşmeden kahin örneğini oluşturduğundan emin olacağız.

/Oracle-example/client/contracts/OracleInterface.sol dizinine gidin . Daha önce de belirttiğimiz gibi, bu şu anda bir arayüz değil, ama onu yapmak üzereyiz. İçindekileri içeriğiyle değiştirin:

https://github.com/jrkosinski/oracle-example/tree/part1-step2/client/contracts/OracleInterface.sol

 pragma solidity ^0.4.17; contract OracleInterface { enum MatchOutcome { Pending, //match has not been fought to decision Underway, //match has started & is underway Draw, //anything other than a clear winner (eg cancelled) Decided //index of participant who is the winner } function getPendingMatches() public view returns (bytes32[]); function getAllMatches() public view returns (bytes32[]); function matchExists(bytes32 _matchId) public view returns (bool); function getMatch(bytes32 _matchId) public view returns ( bytes32 id, string name, string participants, uint8 participantCount, uint date, MatchOutcome outcome, int8 winner); function getMostRecentMatch(bool _pending) public view returns ( bytes32 id, string name, string participants, uint participantCount, uint date, MatchOutcome outcome, int8 winner); function testConnection() public pure returns (bool); function addTestData() public; }

BoxingBets.sol'de bu satırı değiştireceğiz:

 OracleInterface internal boxingOracle = new OracleInterface();

Bu iki satırla:

 address internal boxingOracleAddr = 0; OracleInterface internal boxingOracle = OracleInterface(boxingOracleAddr);

Şimdi istediğimiz şey, Oracle'ın adresini dinamik olarak ayarlamanın bir yolu ve mevcut oracle adresini bulmak için arayabileceğimiz bir fonksiyon. Bu iki işlevi BoxingBets.sol'e ekleyin :

 /// @notice sets the address of the boxing oracle contract to use /// @dev setting a wrong address may result in false return value, or error /// @param _oracleAddress the address of the boxing oracle /// @return true if connection to the new oracle address was successful function setOracleAddress(address _oracleAddress) external onlyOwner returns (bool) { boxingOracleAddr = _oracleAddress; boxingOracle = OracleInterface(boxingOracleAddr); return boxingOracle.testConnection(); } /// @notice gets the address of the boxing oracle being used /// @return the address of the currently set oracle function getOracleAddress() external view returns (address) { return boxingOracleAddr; }

Ve son olarak, müşteri ile oracle arasındaki bağlantıyı test etmek için, BoxingBets'teki test fonksiyonunu oracle bağlantısını test etmek için bir fonksiyonla değiştirebiliriz:

 /// @notice for testing; tests that the boxing oracle is callable /// @return true if connection successful function testOracleConnection() public view returns (bool) { return boxingOracle.testConnection(); }

sahip olunan

setOracleAddress tanımının onu izleyen bir onlyOwner değiştiricisi olduğuna dikkat edin. Bu, işlev herkese açık olsa bile, bu işlevin sözleşmenin sahibi dışında herhangi biri tarafından çağrılmasını kısıtlar. Bu bir dil özelliği değildir. Bu, bize OpenZeppelin'in genel hizmet Solidity sözleşmeleri kitaplığından kaldırılan Ownable sözleşmesi tarafından sağlanmaktadır. Bunun ayrıntılarına Bölüm 2'de gireceğiz, ancak bu onlyOwner değiştiricisinin kullanımını kolaylaştırmak için birkaç değişiklik yapmamız gerekiyor:

Ownable.sol'ü https://github.com/jrkosinski/oracle-example/tree/part1-step2/client/contracts/Ownable.sol adresinden /oracle-example/client/contracts/ içine kopyalayın.

BoxingBets.sol dosyasının en üstüne şu şekilde bir referans ekleyin:

 import "./Ownable.sol";

( OracleInterface.sol dosyasını içe aktaran satırın hemen altına ekleyebilirsiniz.)

BoxingBets'in sözleşme beyanını Ownable'dan devralacak şekilde değiştirin:

 contract BoxingBets {

Buna:

 contract BoxingBets is Ownable {

Ve hazır olmalıyız. Kaybolmanız durumunda tam kod burada: https://github.com/jrkosinski/oracle-example/tree/part1-step2/client/contracts

Oracle Sözleşmeleri

Kurmak

Artık BoxingBets sözleşmesi, adrese göre tamamen ayrı bir sözleşmeye (yani oracle) atıfta bulunmaya çalıştığına göre, sıradaki işimiz bu kehanet sözleşmesini oluşturmaktır. Şimdi, Oracle sözleşmesini içerecek tamamen ayrı bir proje oluşturacağız. Esasen, müşteri sözleşmesi projesi için halihazırda yapmış olduğumuz kurulumla aynıdır; yani, derleme ve geliştirme için Truffle'ı kurmak.

Bir önceki adımda oluşturduğumuz /oracle-example/oracle/ adlı bir klasörünüz zaten olmalıdır (veya değilse, devam edin ve o boş dizini şimdi oluşturun). Bu dizinde bir terminal açın.

  • truffle init komutunu çalıştırın.
  • /oracle-example/oracle/truffle-config.js dosyasını silin.
  • /Oracle-example/oracle/truffle.js dosyasını şu şekilde düzenleyin:
 module.exports = { networks: { development: { host: "localhost", port: 8545, network_id: "*" // Match any network id } } };

Buradaki örneğe bakın: https://github.com/jrkosinski/oracle-example/tree/part1-step2/oracle/truffle.js

/Oracle-example/oracle/migrations/ içinde, aşağıdaki içeriğe sahip 2_deploy_contracts.js adlı bir dosya oluşturun:

 var BoxingOracle = artifacts.require("BoxingOracle"); module.exports = function(deployer) { deployer.deploy(BoxingOracle); };

Buradaki örneğe bakın: https://github.com/jrkosinski/oracle-example/tree/part1-step2/oracle/migrations/2_deploy_contracts.js

Oracle Kodu

Bu adım için, https://github.com/jrkosinski/Oracle-example/tree/part1-step2/oracle/contracts/ adresinden aşağıdaki üç dosyayı /oracle-example/oracle/contracts/ klasörünüze kopyalamanız yeterlidir:

  • BoxingOracle.sol: Ana kehanet sözleşmesi.
  • Ownable.sol: Zaten müşteri sözleşmesinde kullandığımız gibi, yalnızca sahip işlevleri için.
  • DateLib.sol: Bir tarih kitaplığı. Bu serinin 2. Kısmında buna daha derinlemesine bakacağız.

Oracle'ı test etme

Şimdi, projenin mevcut yinelemesinde, akıllı sözleşme kehanetimizi gerçekten kapsamlı bir şekilde test etmemiz gerekiyor, çünkü bu, projenin geri kalanını inşa edeceğimiz temelimiz olacak. Artık Oracle projesini kurup kodu kopyaladığımıza göre, şunları yapmak isteyeceğiz:

  • Oracle'ı derleyin.
  • Oracle'ın çalıştığından emin olun.
  • Oracle'ın beklendiği gibi çalıştığından emin olmak için Truffle konsolunda birkaç işlevi çalıştırın.

Oracle'ı Derleyin ve Taşıyın

Hala /oracle-example/oracle/ 'a açık bir terminalde, aşağıdaki komutları çalıştırın. Yine, bu adımlar, istemci sözleşmesini derlemek ve taşımak için daha önce yaptığımızla aynıdır.

 truffle compile

Alternatif: recompile.sh Shell betiğimi kullanın (https://github.com/jrkosinski/oracle-example/tree/part1-step2/oracle/recompile.sh).

Truffle geliştirme konsolunu açın:

 truffle develop

Test ağına geçiş yapın:

 truffle(develop)> migrate

Oracle'ı Çalıştırın ve Test Edin

Hala Truffle geliştirme konsolunda, Oracle sözleşmesine yönelik kullanılabilir bir işaretçi yakalamak için bunu girin:

 truffle(develop)> BoxingOracle.deployed().then(inst => { instance = inst })

Şimdi, bunu test etmek için Oracle sözleşmemizde bir dizi test çalıştırabiliriz (ve yapmalıyız). Aşağıdaki komutları sırayla çalıştırmayı deneyin ve sonuçları inceleyin.

 truffle(develop)> instance.testConnection() ... truffle(develop)> instance.getAllMatches() ... truffle(develop)> instance.addTestData() ... truffle(develop)> instance.getAllMatches() ...

Bu noktada, Oracle koduna bir göz atmanız, hangi genel yöntemlerin mevcut olduğunu görmeniz, koddaki yorumları okumanız ve çalıştırmak için kendi testlerinizden bazılarını bulmanız (ve bunları burada konsolda çalıştırmanız) önerilir. Yukarıda verilen).

Test ve Hata Ayıklama

Şimdi son teste hazırız: müşteri sözleşmesinin zaten blok zincirinde bulunan Oracle sözleşmesini çağırabileceğini ve verilerini çekip kullanabileceğini test etmek için. Tüm bunlar işe yararsa, daha fazla deney için kullanabileceğimiz bir istemci-kahin çiftimiz olur. Uçtan uca testi çalıştırma adımlarımız:

  • Oracle sözleşmesini derleyin ve çalıştırın
  • İstemci sözleşmesini derleyin ve çalıştırın
  • Oracle sözleşmesinin adresini alın
  • Müşteri sözleşmesinde oracle adresini ayarlayın
  • Oracle sözleşmesine test verileri ekleyin
  • Müşteri sözleşmesinde bu verileri alabileceğimizi test edin

İki terminal penceresi açın:

  • /Oracle-example/client/ içinde bir
  • Ve diğeri /oracle-example/oracle/ içindeki

/Oracle-example/client/ birini solda ve /oracle-example/oracle/ birini sağda açık tutmanızı ve karışıklığı önlemek için yakından takip etmenizi öneririm.

Oracle Sözleşmesini Derleyin ve Çalıştırın

/Oracle-example/oracle/ terminalinde aşağıdaki komutları yürütün:

 bash recompile.sh truffle develop truffle(develop)> migrate truffle(develop)> BoxingOracle.deployed().then(inst => { instance = inst })

İstemci Sözleşmesini Derleyin ve Çalıştırın

/Oracle-example/client/ terminalinde aşağıdaki komutları yürütün:

 bash recompile.sh truffle develop truffle(develop)> migrate truffle(develop)> BoxingBets.deployed().then(inst => { instance = inst })

Oracle Sözleşmesinin Adresini Alın

/Oracle-example/oracle/ terminalinde Truffle için aşağıdaki komutu yürütün:

 truffle(develop)> instance.getAddress()

Bu çağrının çıktısı olan adresi kopyalayın; ve bir sonraki adımda kullanın.

İstemci Sözleşmesinde Oracle Adresini Ayarlayın

/Oracle-example/client/ terminalinde truffle yapmak için aşağıdaki komutu yürütün:

 truffle(develop)> instance.setOracleAddress('<insert address here, single quotes included>')

Ve test edin:

 truffle(develop)> instance.testOracleConnection()

Çıktı true , gitmeye hazırız.

Müşteri Sözleşmesindeki Verileri Alabileceğimizi Test Edin

/Oracle-example/client/ terminalinde truffle yapmak için aşağıdaki komutu yürütün:

 truffle(develop)> instance.getBettableMatches()

Oracle tarafına henüz hiçbir test verisi eklenmediğinden boş bir dizi döndürmelidir.

/Oracle-example/oracle/ terminalinde test verilerini eklemek için aşağıdaki komutu yürütün:

 truffle(develop)> instance.addTestData()

İstemciden yeni eklenen test verilerini alıp alamayacağımızı görmek için /oracle-example/client/ terminalinde truffle yapmak için aşağıdaki komutu yürütün:

 truffle(develop)> instance.getBettableMatches()

Şimdi, getBettableMatches() tarafından döndürülen diziden tek tek adresleri alırsanız ve bunları getMatch() içine eklerseniz.

Bu noktada, istemci koduna bir göz atmanız, hangi genel yöntemlerin mevcut olduğunu görmeniz, koddaki yorumları okumanız ve çalıştırmak için kendi testlerinizden bazılarını bulmanız (ve bunları burada konsolda çalıştırmanız) önerilir. üstünde).

Birinci Bölümün Sonucu

Bu alıştırmadan elde ettiğimiz sonuçlar sınırlıdır, ancak gerçekçi bir tempoyu sürdürmek için hedeflerimiz de öyleydi. Müşterimiz henüz bahis alma, fonları işleme, kazançları bölüşme vb. gibi becerilere sahip değil. Sahip olduğumuz bilgi ve edinilen deneyimin yanı sıra:

  • Çoğunlukla işlevsel bir akıllı sözleşme kehaneti
  • Oracle'a bağlanabilen ve onunla etkileşime girebilen bir istemci
  • Daha fazla gelişme ve öğrenme için bir çerçeve

Ve bu kısa bir makale için çok da kötü değil.

Bu dizinin ikinci bölümünde , kodu daha derinlemesine inceleyeceğiz ve akıllı sözleşme geliştirmeye özgü bazı özelliklerin yanı sıra Solidity'ye özgü bazı dil özelliklerine bakacağız. Bu bölümde üzerinde durulan pek çok şey bir sonraki bölümde açıklanacaktır.

Bu dizinin üçüncü bölümünde , özellikle oracle'larla kullanımlarıyla ilgili olarak, akıllı sözleşmelerin felsefesi ve tasarımı hakkında biraz tartışacağız.

Diğer Opsiyonel Adımlar

Tek başına deney, öğrenmenin iyi bir yoludur. Daha fazla bilgi için bu öğreticiyi genişletmenin yollarını düşünüyorsanız, burada birkaç basit öneri bulunmaktadır (aşağıdakilerin hiçbiri Bölüm 2 ve 3'te ele alınmayacaktır):

  • Sözleşmeleri Ganache'ye (eski adıyla testrpc) dağıtın ve işlevi doğrulamak için aynı testleri çalıştırın.
  • Sözleşmeleri ropsten veya rinkeby test ağlarına dağıtın ve işlevi doğrulamak için aynı testleri çalıştırın.
  • Oracle veya istemci (veya her ikisi) için bir web3js ön ucu oluşturun.

İyi şanslar ve lütfen herhangi bir sorunuz varsa benimle iletişime geçmekten çekinmeyin. Mutlaka hızlı bir yanıtı garanti edemem, ancak elimden gelenin en iyisini yapacağım.