Ajută la actualizarea acestei pagini

🌏

Există o nouă versiune a acestei pagini, dar acum este doar în engleză. Ajută-ne să traducem cea mai recentă versiune.

Această pagină este incompletă. Dacă ești expert în acest subiect, te rugăm să editezi această pagină și s-o presari cu înțelepciune.

Oracole

Ultima editare: , Invalid DateTime
Edit page

Oracolele sunt fluxuri de date care conectează Ethereum la informații din lumea reală, în afara lanțului, astfel încât să poți interoga datele în contractele tale inteligente. De exemplu, aplicațiile dapp de predicție de piață utilizează oracole pentru a deconta plăți pe baza evenimentelor. O piață de predicție îți poate cere să pariezi ETH pe următorul președinte al Statelor Unite. Vor folosi un oracol pentru a confirma rezultatul și pentru a plăti câștigătorilor.

Condiții prealabile

Asigură-te că ești familiar cu nodurile, mecanismele de consens și anatomia contractelor inteligente, evenimente speciale.

Ce este un oracol

Un oracol este o punte între blockchain și lumea reală. Acestea acționează ca API-uri pe lanț pe care le poți interoga pentru a obține informații în contractele inteligente. Acest lucru ar putea fi orice, de la informații de preț, la rapoarte meteorologice.

De ce este nevoie de oracole?

Cu un blockchain ca Ethereum ai nevoie de fiecare nod din rețea pentru a putea reda fiecare tranzacție și a termina cu același rezultat, garantat. API-urile introduc date potențial variabile. Dacă ai trimite cuiva o sumă de ETH în baza unei valori $USD convenită utilizând un API de preț, interogarea va returna un rezultat diferit de la o zi la alta. Ca să nu mai vorbim, API-ul ar putea fi piratat sau perimat. Dacă se întâmplă acest lucru, nodurile din rețea nu ar fi în măsură să se pună de acord asupra stării actuale a Ethereum, încălcând în mod efectiv consensul.

Oracolele rezolvă această problemă postând datele pe blockchain. De aceea, orice nod care redă tranzacția va utiliza aceleași date imuabile care sunt postate pentru ca toți să le vadă. Pentru a face acest lucru, un oracol este format de obicei dintr-un contract inteligent și unele componente din lanț care pot interoga API-urile, apoi trimit periodic tranzacții pentru a actualiza datele contractului inteligent.

Securitate

Un oracol este la fel de sigur ca sursele sale de date. Dacă o aplicație dapp folosește Uniswap ca oracol pentru fluxul său de preț ETH/DAI, un atacator ar putea să mute prețul pe Uniswap pentru a manipula înțelegerea de către dapp a prețului curent. Un exemplu al modului de combatere a acestui lucru este un sistem de alimentare precum cel folosit de MakerDAO, care strânge date despre prețuri dintr-o serie de fluxuri de prețuri în loc să se bazeze doar pe o singură sursă.

Utilizare

Oracolele ca serviciu

Servicii precum Chainlink oferă oracole-ca-serviciu pe care le poți utiliza. Au infrastructura pusă la dispoziție pentru a face lucruri precum:

Acesta este un exemplu despre cum să obții cel mai recent preț ETH în contractul tău inteligent utilizând un flux de preț Chainlink:

1pragma solidity ^0.6.7;
2
3import "@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol";
4
5contract PriceConsumerV3 {
6
7 AggregatorV3Interface internal priceFeed;
8
9 /**
10 * Network: Kovan
11 * Aggregator: ETH/USD
12 * Address: 0x9326BFA02ADD2366b30bacB125260Af641031331
13 */
14 constructor() public {
15 priceFeed = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331);
16 }
17
18 /**
19 * Returns the latest price
20 */
21 function getLatestPrice() public view returns (int) {
22 (
23 uint80 roundID,
24 int price,
25 uint startedAt,
26 uint timeStamp,
27 uint80 answeredInRound
28 ) = priceFeed.latestRoundData();
29 return price;
30 }
31}
32
Afișează tot
📋 Copiere

Vezi documentația

Servicii Oracle

Construiește un contract inteligent oracol

Iată un exemplu de contract oracol al lui Pedro Costa. Poți găsi adnotări suplimentare în articolul său: Implementarea unui Blockchain Oracol pe Ethereum.

1pragma solidity >=0.4.21 <0.6.0;
2
3contract Oracle {
4 Request[] requests; //lista cererilor adresate contractului
5 uint currentId = 0; //creșterea ID-ului solicitării
6 uint minQuorum = 2; //numărul minim de răspunsuri de primit înainte de declararea rezultatului final
7 uint totalOracleCount = 3; // Număr de oracol codificat greu
8
9 // definește o cerere API generală
10 struct Request {
11 uint id; //cerere id
12 string urlToQuery; //API url
13 string attributeToFetch; //atribut json (cheie) pentru a prelua în răspuns string agreedValue; //valoarea din cheie
14 mapping(uint => string) anwers; //răspunsuri oferite de oracole
15 mapping(address => uint) quorum; //oracole care vor interoga răspunsul (1 = oracolul nu a votat, 2 = oracolul a votat)
16 }
17
18 //eveniment care declanșează oracolul în afara blockchain-ului
19 event NewRequest (
20 uint id,
21 string urlToQuery,
22 string attributeToFetch
23 );
24
25 //declanșat atunci când există un consens cu privire la rezultatul final
26 event UpdatedRequest (
27 uint id,
28 string urlToQuery,
29 string attributeToFetch,
30 string agreedValue
31 );
32
33 function createRequest (
34 string memory _urlToQuery,
35 string memory _attributeToFetch
36 )
37 public
38 {
39 uint lenght = requests.push(Request(currentId, _urlToQuery, _attributeToFetch, ""));
40 Request storage r = requests[lenght-1];
41
42 // adresa oracole codificată greu
43 r.quorum[address(0x6c2339b46F41a06f09CA0051ddAD54D1e582bA77)] = 1;
44 r.quorum[address(0xb5346CF224c02186606e5f89EACC21eC25398077)] = 1;
45 r.quorum[address(0xa2997F1CA363D11a0a35bB1Ac0Ff7849bc13e914)] = 1;
46
47 //lansează un eveniment care va fi detectat de oracol în afara blockchain-ului
48 emit NewRequest (
49 currentId,
50 _urlToQuery,
51 _attributeToFetch
52 );
53
54 // crește cererea id
55 currentId++;
56 }
57
58 //chemat de oracol pentru a înregistra răspunsul său
59 function updateRequest (
60 uint _id,
61 string memory _valueRetrieved
62 ) public {
63
64 Request storage currRequest = requests[_id];
65
66 //verifică dacă oracolul se află în lista oracolelor de încredere
67 //și dacă oracolul nu a votat încă
68 if(currRequest.quorum[address(msg.sender)] == 1){
69
70 //marcând că această adresă a votat
71 currRequest.quorum[msg.sender] = 2;
72
73 //iterează prin „matricea” de răspunsuri până la o poziție dacă este liberă și salvează valoarea recuperată
74 uint tmpI = 0;
75 bool found = false;
76 while(!found) {
77 //găsește primul slot gol
78 if(bytes(currRequest.anwers[tmpI]).length == 0){
79 found = true;
80 currRequest.anwers[tmpI] = _valueRetrieved;
81 }
82 tmpI++;
83 }
84
85 uint currentQuorum = 0;
86
87 //iterează prin lista oracolelor și verifică dacă sunt suficiente oracole (cvorum minim)
88 //au votat același răspuns ca și cel actual
89 for(uint i = 0; i < totalOracleCount; i++){
90 bytes memory a = bytes(currRequest.anwers[i]);
91 bytes memory b = bytes(_valueRetrieved);
92
93 if(keccak256(a) == keccak256(b)){
94 currentQuorum++;
95 if(currentQuorum >= minQuorum){
96 currRequest.agreedValue = _valueRetrieved;
97 emit UpdatedRequest (
98 currRequest.id,
99 currRequest.urlToQuery,
100 currRequest.attributeToFetch,
101 currRequest.agreedValue
102 );
103 }
104 }
105 }
106 }
107 }
108}
109
Afișează tot
📋 Copiere

Ne-ar plăcea mai multă documentație privind crearea unui contract inteligent oracol. Dacă poți ajuta, creează un PR!

Referințe suplimentare

░░░░░░░░░▄░░░░░░░░░░░░░░▄░░░░ ░░░░░░░░▌▒█░░░░░░░░░░░▄▀▒▌░░░ ░░░░░░░░▌▒▒█░░░░░░░░▄▀▒▒▒▐░░░ ░░░░░░░▐▄▀▒▒▀▀▀▀▄▄▄▀▒▒▒▒▒▐░░░ ░░░░░▄▄▀▒░▒▒▒▒▒▒▒▒▒█▒▒▄█▒▐░░░ ░░░▄▀▒▒▒░░░▒▒▒░░░▒▒▒▀██▀▒▌░░░ ░░▐▒▒▒▄▄▒▒▒▒░░░▒▒▒▒▒▒▒▀▄▒▒▌░░ ░░▌░░▌█▀▒▒▒▒▒▄▀█▄▒▒▒▒▒▒▒█▒▐░░ ░▐░░░▒▒▒▒▒▒▒▒▌██▀▒▒░░░▒▒▒▀▄▌░ ░▌░▒▄██▄▒▒▒▒▒▒▒▒▒░░░░░░▒▒▒▒▌░ ▀▒▀▐▄█▄█▌▄░▀▒▒░░░░░░░░░░▒▒▒▐░ ▐▒▒▐▀▐▀▒░▄▄▒▄▒▒▒▒▒▒░▒░▒░▒▒▒▒▌ ▐▒▒▒▀▀▄▄▒▒▒▄▒▒▒▒▒▒▒▒░▒░▒░▒▒▐░ ░▌▒▒▒▒▒▒▀▀▀▒▒▒▒▒▒░▒░▒░▒░▒▒▒▌░ ░▐▒▒▒▒▒▒▒▒▒▒▒▒▒▒░▒░▒░▒▒▄▒▒▐░░ ░░▀▄▒▒▒▒▒▒▒▒▒▒▒░▒░▒░▒▄▒▒▒▒▌░░ ░░░░▀▄▒▒▒▒▒▒▒▒▒▒▄▄▄▀▒▒▒▒▄▀░░░ ░░░░░░▀▄▄▄▄▄▄▀▀▀▒▒▒▒▒▄▄▀░░░░░ ░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▀▀░░░░░░░░

Ajută-ne cu această pagină

Dacă ești expert pe această temă și dorești să contribui, editează această pagină și presar-o cu înțelepciunea ta.

Vei fi creditat și vei ajuta comunitatea Ethereum!

Utilizează acest șablon de documentație flexibil

Întrebări? Întreabă-ne pe canalul #content de pe serverul nostru Discord

Editare pagină