Orákulumok
A orákulumok olyan adatcsatornák, amelyek összekapcsolják az Ethereumot az off-chain, valós információkkal, így le tudod kérdezni az adatokat az okosszerződéseidben. Például a hírpiac dappok orákulumokat használnak, hogy az események alapján elszámolják a kifizetéseket. Egy hírpiacon lehetőséged van ETH-ben fogadni, hogy például ki lesz az Egyesül Államok elnöke. Egy orákulumot fognak használni, hogy megerősítsék a kimenetelt és kifizessék a nyerteseket.
Előfeltételek
Érdemes tisztában lenned a csomópontok, konszenzus mechanizmusok, és a okosszerződés anatómia témakörökkel, különösen az eseményekkel.
Mi az az orákulum
Az orákulum egy áthidalás a blokklánc és külvilág között. On-chain API-ként viselkednek, melyekről lekérdezhetsz információkat az okosszerződéseidbe. Ez lehet bármi az árfolyam információktól egészen az időjárási adatokig.
Miért van rájuk szükség?
Az Ethereumhoz hasonló blokkláncoknál fontos, hogy a hálózat összes csomópontja minden tranzakciót visszajátszhasson, és ugyanazzal az eredménnyel járjon, garantáltan. Az API-ok potenciálisan változó adatokat adnak. Ha valakinek egy ETH összeget küldenél egy előre leegyeztetett $USD árfolyam alapján egy árfolyam API segítségével, a lekérdezés más eredményt adna vissza különböző napokon. Nem is beszélve arról, hogy az API-t meg lehet hackelni vagy elavulttá válhat. Ha ez megtörténik, akkor a hálózat csomópontjai nem tudnának egyetérteni az Ethereum jelenlegi állapota felett, tehát lényegében szétbomlana a konszenzus..
Az orákulumok megoldják ezt a problémát úgy, hogy az adatot a blokkláncra juttatják. Tehát minden, a tranzakciót visszajátszó csomópont ugyanazokat a megváltoztathatatlan adatokat fogja használni, amelyeket mindenki láthat. Ehhez az orákulum általában egy okosszerződésből és néhány olyan off-chain komponensből áll, amelyek lekérdezhetik az API-okat, majd időszakonként tranzakciókat küldenek az okosszerződés adatainak frissítésére.
Biztonság
Egy orákulum annyira biztonságos, mint az adatforrása(i). Ha egy dapp a Uniswap-et használja orákulumként az ETH/DAI árfolyam adathoz, egy támadónak lehetősége van az árfolyamot manipulálni a Uniswap-en, hogy módosítsa a dapp értelmezését a jelenlegi árfolyamról. Egy példa ennek megakadályozására egy feed rendszer, mint amit a MakerDAO is használ, amely számos külső árfolyam feed adatait gyűjti össze ahelyett, hogy csak egyetlen forrásra támaszkodna.
Használat
Orákulum, mint szolgáltatás
A Chainlinkhez hasonló szolgáltatások orákulum mint szolgáltatás jellegű megoldásokat kínálnak. Megvan az infrastruktúrájuk, hogy olyan dolgokat csinálj, mint:
- kripto árfolyamot bevitele az okosszerződésedbe
- hitelesíthetően véletlen szám generálása (hasznos a játékoknál)
- külső API-ok meghívása – az egyik új használati minta ehhez a wBTC tartalékok ellenőrzése
Itt egy példa arról hogy, hogy lehet a legfrissebb ETH árfolyam adatot bevinni az okosszerződésedbe egy Chainlink árfolyam feed segítségével:
1pragma solidity ^0.6.7;23import "@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol";45contract PriceConsumerV3 {67 AggregatorV3Interface internal priceFeed;89 /**10 * Network: Kovan11 * Aggregator: ETH/USD12 * Address: 0x9326BFA02ADD2366b30bacB125260Af64103133113 */14 constructor() public {15 priceFeed = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331);16 }1718 /**19 * Returns the latest price20 */21 function getLatestPrice() public view returns (int) {22 (23 uint80 roundID,24 int price,25 uint startedAt,26 uint timeStamp,27 uint80 answeredInRound28 ) = priceFeed.latestRoundData();29 return price;30 }31}32Összes megjelenítéseMásolás
Orákulum szolgáltatások
Orákulum okosszerződés építése
Itt egy példa Pedro Costától egy orákulum szerződésre. További megjegyzéseket találhatsz ebben a cikkben: Blokklánc orákulum implementálása Ethereumon.
1pragma solidity >=0.4.21 <0.6.0;23contract Oracle {4 Request[] requests; //lekérdezések listája a szerződésnek5 uint currentId = 0; //lekérdezési id növelése6 uint minQuorum = 2; //minimum válasz, amit meg kell kapni a végeredmény meghatározása előtt7 uint totalOracleCount = 3; //hardkódolt orákulum szám89 // általános orákulum lekérdezés definiálása10 struct Request {11 uint id; //lekérdezés id12 string urlToQuery; //API url13 string attributeToFetch; //json attribútum (kulcs) a válasz visszaadására14 string agreedValue; //érték a kulcsból15 mapping(uint => string) anwers; //orákulumok válaszai16 mapping(address => uint) quorum; //orákulumok, melyek lekérdezik a választ (1=még nem szavazott, 2=szavazott)17 }1819 //esemény, mely beindítja az orákulumot a blokkláncon kívül20 event NewRequest (21 uint id,22 string urlToQuery,23 string attributeToFetch24 );2526 //beindul, ha konszenzus van a végső eredményen27 event UpdatedRequest (28 uint id,29 string urlToQuery,30 string attributeToFetch,31 string agreedValue32 );3334 function createRequest (35 string memory _urlToQuery,36 string memory _attributeToFetch37 )38 public39 {40 uint lenght = requests.push(Request(currentId, _urlToQuery, _attributeToFetch, ""));41 Request storage r = requests[lenght-1];4243 // hardkódolt orákulum címek44 r.quorum[address(0x6c2339b46F41a06f09CA0051ddAD54D1e582bA77)] = 1;45 r.quorum[address(0xb5346CF224c02186606e5f89EACC21eC25398077)] = 1;46 r.quorum[address(0xa2997F1CA363D11a0a35bB1Ac0Ff7849bc13e914)] = 1;4748 // egy esemény elindítása, melyet egy blokkláncon kívüli orákulum észlel49 emit NewRequest (50 currentId,51 _urlToQuery,52 _attributeToFetch53 );5455 // lekérdezési id növelése56 currentId++;57 }5859 //az orákulum hívja meg, hogy feljegyezze a választ60 function updateRequest (61 uint _id,62 string memory _valueRetrieved63 ) public {6465 Request storage currRequest = requests[_id];6667 //ellenőrizzük, hogy az orákulum benne van-e a megbízhatók listájában68 //és hogy nem szavazott-e már69 if(currRequest.quorum[address(msg.sender)] == 1){7071 //megjelöli, hogy ez a cím már szavazott72 currRequest.quorum[msg.sender] = 2;7374 //iterálás a válaszok "tömbjében", ameddig nincs üres pozició és a visszaadott érték elmentése75 uint tmpI = 0;76 bool found = false;77 while(!found) {78 //első üres hely megtalálása79 if(bytes(currRequest.anwers[tmpI]).length == 0){80 found = true;81 currRequest.anwers[tmpI] = _valueRetrieved;82 }83 tmpI++;84 }8586 uint currentQuorum = 0;8788 //iterálás az orákulum listában és ellenőrizni, hogy elég orákulum (minimum kvórum)89 //szavazott-e ugyanarra a válaszra, mint a jelenlegi90 for(uint i = 0; i < totalOracleCount; i++){91 bytes memory a = bytes(currRequest.anwers[i]);92 bytes memory b = bytes(_valueRetrieved);9394 if(keccak256(a) == keccak256(b)){95 currentQuorum++;96 if(currentQuorum >= minQuorum){97 currRequest.agreedValue = _valueRetrieved;98 emit UpdatedRequest (99 currRequest.id,100 currRequest.urlToQuery,101 currRequest.attributeToFetch,102 currRequest.agreedValue103 );104 }105 }106 }107 }108 }109}110Összes megjelenítéseMásolás
Nagyon örülnénk még több orákulum okosszerződésekről szóló dokumentációnak. Ha tudsz segíteni, készíts egy PR-t!
További olvasnivaló
- Decentralised Oracles: a comprehensive overview –Julien Thevenard
- Implementing a Blockchain Oracle on Ethereum –Pedro Costa
- Oracles –EthHub
Segíts nekünk ezzel a lappal
Ha a témának a szakértője vagy és szeretnél hozzájárulni, akkor szerkeszd ezt az oldalt és szórd meg a tudásoddal.
Jóváírást kapsz, és segítesz az Ethereum közösségnek!
Használd rugalmasan dokumentáció sablon
Kérdésed van? Tedd fel a #content csatornán Discord szerver
Oldal szerkesztése