Sisältö ei ole yksilöllistä sijoitus-, vero-, oikeus- tai tietoturvaneuvontaa.
Kryptoville.

Kryptoista selkoa.
Ilman hypetystä.

Artikkeli · r6-defi-001

Flash-laina: miten laina voi päättyä samassa transaktiossa?

Flash-laina on älysopimusten välinen lainajärjestely, jossa lainatut varat palautetaan saman transaktion aikana. ERC-3156-standardin kuvaamassa mallissa lainalle ei vaadita vakuutta, vaan takaisinmaksu on järjestelyn onnistumisen ehto.[1] Tämä artikkeli selittää mekanismin; se ei ole sijoitusneuvontaa eikä kehota käyttämään lainaa.

Mikä tekee lainasta erityisen?

Tavallisessa lainassa velka voi olla olemassa kauan. ERC-3156:n kuvaamassa flash-lainassa lainanantajasopimus antaa varat vastaanottajasopimuksen tilapäiseen käyttöön, ja ne on palautettava mahdollisen lisämaksun kanssa saman transaktion aikana.[1]

Transaktion sisällä voi silti tapahtua useita sopimuskutsuja. Vastaanottaja voi suorittaa ennalta ohjelmoitua logiikkaa ennen takaisinmaksua. Standardi kuvaa yhden lainattavan tokenin rajapinnan; kaikki flash-lainat eivät välttämättä käytä täsmälleen samaa toteutusta.[1]

Miten ERC-3156:n mukainen lainakutsu onnistuu?

Yhden standardinmukaisen lainakutsun vaiheet ovat seuraavat:[1]

  1. Lainanantaja siirtää sovitun määrän yhtä tokenia vastaanottajalle ennen callback-kutsua.[1]
  2. Lainanantaja kutsuu vastaanottajan onFlashLoan(initiator, token, amount, fee, data) -toimintoa: parametrit kertovat lainan aloittajan, lainatun tokenin, määrän, maksun ja mahdolliset lisätiedot.[1]
  3. Vastaanottaja voi tehdä callbackissa muuta ohjelmoitua työtä. Callbackin on palautettava keccak256("ERC3156FlashBorrower.onFlashLoan"), ja lainanantajan on tarkistettava tämä onnistumisarvo.[1]
  4. Vastaanottajalla on oltava takaisinmaksua varten riittävästi samaa lainattua tokenia sekä callbackin loppuun mennessä annettu lainanantajalle riittävä käyttöoikeus eli allowance määrälle amount + fee.[1]
  5. Callbackin jälkeen lainanantaja perii vastaanottajalta lainatun määrän ja maksun. Jos perintä ei onnistu, lainakutsu palautuu eli tekee revertin; onnistunut flashLoan palauttaa arvon true.[1]

Ajattele kuvitteellista lainaa, jossa lainataan 100 yksikköä kuvitteellista tokenia ja maksu on oletuksen mukaan yksi saman tokenin yksikkö. Takaisinmaksua varten tarvitaan 101 yksikköä tätä tokenia ja vähintään 101 yksikön perintäoikeus. Esimerkki ei kuvaa todellista maksutasoa tai saatavuutta eikä kerro, mistä ylimääräinen yksikkö saadaan.

Mitä epäonnistuminen peruuttaa?

Jos lainakutsu tekee revertin, sen ja sen sisäisten alikutsujen tilamuutokset peruuntuvat. Ympäröivä sopimus voi kuitenkin käsitellä ulkoisen kutsun epäonnistumisen ja jatkaa: sen muut onnistuneet tilamuutokset voivat säilyä, jos ulompi transaktio onnistuu. Jos virhe sen sijaan etenee käsittelemättä koko transaktion tasolle, transaktion suorituksen tilamuutokset peruuntuvat.[5] Siksi epäonnistunut lainakutsu ei automaattisesti tarkoita koko transaktion epäonnistumista.

Ethereumiin sisältyvän mutta suorituksessa epäonnistuvan transaktion laskentatyöstä maksetaan kaasumaksua. Ennen sisällyttämistä validoinnissa hylätty transaktio on eri tilanne.[4]

Miksi saman transaktion raja ei ole turvallisuustakuu?

Takaisinmaksun tarkistus ei osoita, että kaikki muut sopimukset toimivat oikein. ERC-3156 käsittelee erikseen esimerkiksi vastaanottajan kutsujan ja kutsun tietojen tarkistamista sekä lainanantajalle annettuun tokenien käyttöoikeuteen liittyviä riskejä.[1] Standardin nimen näkeminen ei kerro, onko tietty sopimus toteuttanut tarkistukset oikein.

Lainattu määrä voi olla suuri suhteessa siihen, mitä yksittäinen toimija muuten hallitsisi. Se voi lisätä vaikutuksia, jos jokin toinen sopimus käyttää helposti muutettavaa tietoa väärin. Tämä havainnollistaa riskiä, ei tarkoita, että jokainen flash-laina olisi hyökkäys. Uniswapin v2-dokumentaatio varoittaa, ettei pelkkään yhden poolin sillä hetkellä näkyvään vaihtosuhteeseen pidä luottaa ulkopuolisena hintavertailuna.[2]

Mitä rajaus jättää avoimeksi?

ERC-3156 määrittelee muun muassa enimmäislainan ja lainamaksun kysymiseen tarkoitetut toiminnot.[1] Ne eivät lupaa tietyn tokenin saatavuutta, transaktion onnistumista, turvallisuutta tai voittoa. Eri protokollien takaisinmaksutavat voivat poiketa tämän standardin mallista.[1]

Olennaista on erottaa varojen tilapäinen käyttö, takaisinmaksun tarkistus ja muut sopimukset, joiden kanssa transaktio toimii. Yhden ehdon täyttyminen ei yksin kerro koko tapahtumaketjun turvallisuudesta.

Lähteet