Blokkjede-smartkontrakter med Solidity · leksjon

Integrasjon med Chainlink-orakler

Lær å bruke Chainlink til å koble smartkontraktene dine sikkert til data, hendelser og beregninger fra den virkelige verden.

Leksjon 2 av 411 trinn

Integrasjon med Chainlink-orakler er en gratis leksjon i Blokkjede-smartkontrakter med Solidity på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Blokkjede-smartkontrakter med Solidity, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Blokkjede-smartkontrakter med Solidity inneholder totalt 4 leksjoner.

Velkommen til Chainlink-orakler!

I den forrige leksjonen lærte vi om «oracle-problemet» – at smartkontrakter ikke kan få direkte tilgang til data fra den virkelige verden.

Chainlink løser dette ved å fungere som en bro som på en sikker måte fører data utenfor kjeden inn på blokkjeden. I denne leksjonen skal De lære hvordan Chainlink integreres i Solidity-kontraktene Deres.

Å bygge bro mellom kjeden og omverdenen

Chainlink er et desentralisert oracle-nettverk. Det gjør det mulig for smartkontraktene Deres å koble seg på en pålitelig måte til eksterne datakilder, API-er og til og med tradisjonelle betalingssystemer.

  • Desentralisert: Flere uavhengige noder verifiserer dataene.
  • Sikkert: Kryptografiske bevis sikrer dataintegriteten.
  • Pålitelig: Data aggregeres fra mange kilder.

Kraften i datastrømmer

En av Chainlinks mest populære funksjoner er Data Feeds. Disse leverer kontinuerlig oppdaterte prisdata for kryptovalutaer, råvarer og mer.

I stedet for å be om data ved behov, noe som kan være komplisert, tilbyr Data Feeds en enklere måte å få tilgang til hyppig oppdatert informasjon direkte i kontrakten Deres.

Kom i gang: Grensesnittet

For å samhandle med Chainlink Data Feeds må smartkontrakten Deres vite hvordan den skal «snakke» med dem. Chainlink tilbyr et grensesnitt kalt AggregatorV3Interface.

Dette grensesnittet definerer funksjonene kontrakten Deres kan kalle for å hente data. Vanligvis importerer De det i Solidity-filen slik:

interface AggregatorV3Interface {
  function decimals() external view returns (uint8);
  function description() external view returns (string memory);
  function version() external view returns (uint256);

  function latestRoundData()
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );
}

Initialisere oraklet

Kontrakten Deres må kjenne den spesifikke adressen til Chainlink Data Feed-en den skal bruke. Dette angis vanligvis i kontraktens konstruktør.

For eksempel må De oppgi den tilsvarende Data Feed-adressen for å hente ETH/USD-prisen på et testnett og initialisere priceFeed-variabelen Deres.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface AggregatorV3Interface {
  function latestRoundData()
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );
}

contract PriceConsumer {
  AggregatorV3Interface internal priceFeed;

  constructor(address _priceFeedAddress) {
    priceFeed = AggregatorV3Interface(_priceFeedAddress);
  }
}

Hente prisdata

Når tilkoblingen er opprettet, kan De kalle funksjonen latestRoundData() på variabelen priceFeed. Denne funksjonen returnerer flere informasjonsbiter.

Den viktigste er answer, som er selve prisdataene. De andre verdiene gir kontekst, for eksempel når dataene sist ble oppdatert.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface AggregatorV3Interface {
  function latestRoundData()
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );
  function decimals() external view returns (uint8);
}

contract PriceConsumer {
  AggregatorV3Interface internal priceFeed;

  constructor(address _priceFeedAddress) {
    priceFeed = AggregatorV3Interface(_priceFeedAddress);
  }

  function getLatestPrice() public view returns (int256) {
    // We only care about the 'answer' here, so other return values are ignored.
    (, int256 price, , , ) = priceFeed.latestRoundData();
    return price;
  }
}

Tolke dataene

answer fra latestRoundData() er en int256. Hvis ETH/USD for eksempel er 2000 dollar, kan svaret være 200000000000.

De må dele dette på 10 ** priceFeed.decimals() for å få den lesbare verdien. Funksjonen decimals() fra grensesnittet forteller Dem skaleringsfaktoren.

Fullstendig eksempel: ETH/USD-pris

Her er et komplett, kjørbart eksempel på en kontrakt som henter den nyeste ETH/USD-prisen ved hjelp av Chainlink. De kan bruke en vanlig Sepolia-testnettadresse som demonstrasjon.

Kopier og lim dette inn i Remix, kompiler det og distribuer det med riktig Chainlink Data Feed-adresse for nettverket Deres.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// Import Chainlink's AggregatorV3Interface
interface AggregatorV3Interface {
  function decimals() external view returns (uint8);
  function description() external view returns (string memory);
  function version() external view returns (uint256);
  function latestRoundData()
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );
}

contract EthPriceConsumer {
  AggregatorV3Interface internal priceFeed;

  // Constructor takes the address of the Chainlink Data Feed
  // Example for Sepolia ETH/USD:
  // 0x694AA1769357215Ee4f0fFf93d2d05d454eBEaB8
  constructor(address _priceFeedAddress) {
    priceFeed = AggregatorV3Interface(_priceFeedAddress);
  }

  // Function to get the latest ETH/USD price
  function getLatestEthUsdPrice() public view returns (int256) {
    // latestRoundData returns (roundId, answer, startedAt, updatedAt, answeredInRound)
    (, int256 price, , , ) = priceFeed.latestRoundData();
    return price; // Price is returned with 8 decimals (e.g., $2000 becomes 200000000000)
  }

  // Function to get the number of decimals for the price feed
  function getDecimals() public view returns (uint8) {
    return priceFeed.decimals();
  }
}

Merknader om produksjonsklargjøring

Vurder alltid følgende når De bruker Chainlink i produksjon:

  • Gasskostnader: Det er vanligvis rimelig å lese fra Data Feeds (view-funksjon), men egendefinerte forespørsler kan koste gass.
  • Nettverksadresser: Bruk riktig Data Feed-adresse for målnettverket Deres (for eksempel Mainnet eller Sepolia).
  • Feilhåndtering: Implementer kontroller for utdaterte data (updatedAt) eller nullverdier fra oraklet for å gjøre løsningen robust.

Test kunnskapene Deres

De har lært hvordan Chainlink Data Feeds integreres. La oss kontrollere forståelsen Deres.

Integrering av Chainlink: Oppsummering

Godt jobbet! De har lært hvordan Chainlink Data Feeds integreres i Solidity-smartkontraktene Deres.

  • Chainlink bygger bro mellom data utenfor kjeden og blokkjeden.
  • De bruker AggregatorV3Interface til å samhandle med Data Feeds.
  • Kontraktens constructor angir oracle-adressen.
  • latestRoundData() henter prisen og annen informasjon.

I neste leksjon skal vi se nærmere på mer komplekse mønstre for datahenting, blant annet hvordan egendefinerte forespørsler kan brukes for data som ikke er tilgjengelige i standardiserte Data Feeds.

Gratis å komme i gang

Lær deg Blokkjede-smartkontrakter med Solidity med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
12
Leksjoner
48

Ofte stilte spørsmål

Er leksjonen «Integrasjon med Chainlink-orakler» gratis?

Ja – hele teksten i «Integrasjon med Chainlink-orakler» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Blokkjede-smartkontrakter med Solidity-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Blokkjede-smartkontrakter med Solidity inneholder totalt 4 leksjoner.

Hva lærer jeg i «Integrasjon med Chainlink-orakler»?

Lær å bruke Chainlink til å koble smartkontraktene dine sikkert til data, hendelser og beregninger fra den virkelige verden. Du øver på Blokkjede-smartkontrakter med Solidity med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Blokkjede-smartkontrakter med Solidity?

Ingen tidligere erfaring er nødvendig. Blokkjede-smartkontrakter med Solidity på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «Integrasjon med Chainlink-orakler»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Blokkjede-smartkontrakter med Solidity-leksjonen?

Ja. Alle Blokkjede-smartkontrakter med Solidity-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Oracle-problemet forklart
  2. Integrasjon med Chainlink-orakler
  3. Håndtering av henting av data utenfor kjeden
  4. Bygge egendefinerte oracle-kontrakter
← Tilbake til Blokkjede-smartkontrakter med Solidity