Nullist esimese Ethereumi nutikalepinguni: sõbralik tee uudishimulikele ehitajatele
Kui oled kunagi kuulnud terminit “nutikleping” ja kujutanud ette robotadvokaati, kes kirjutab paragrahve, siis mul on hea uudis – see on palju lihtsam (ja lõbusam), kui arvad. Las ma juhatan sind läbi kogu teekonna, alates pead kratsimisest, mis üldse on nutikleping, kuni tegeliku Ethereumi võrku üleslaadimiseni, koos mõnede kõrvalepõigetega algajatele mõeldud Solidity õpetustesse ja aeg-ajalt elupäästvatesse web3 tugiteenustesse. Pole vaja kosmilise taseme matemaatikakraadi, luban.
Mäletan siiani hetke, mil mul kohale jõudis. Sõber ütles: “Nutikleping on lihtsalt tilluke programm, mis elab plokiahelas ja käivitub automaatselt, kui tingimused on täidetud.” Kui sa oled kunagi müügiautomaati kasutanud – viska mündid, vajuta nuppu, saa snäkk –, siis saad juba põhiideest aru. Suur erinevus on see, et juhtmete ja mootorite asemel on kood, mis istub tuhandetes arvutites, tagades, et keegi ei petaks. See ongi plokiahela arenduse põhitõde: usalduse võrrandist eemaldamine, lastes läbipaistval ja muutmatul koodil tehingut korraldada.
Nüüd, kui sul on kirglik soov õppida plokiahela programmeerimist, ei pea sa üleöö krüptograafiaeksperdiks saama. Parim alguskoht on Solidity – keel, mida Ethereumi nutiklepingute jaoks kasutatakse. Hea algajate Solidity õpetus õpetab sulle, et Solidity sarnaneb väga JavaScriptiga, mis teeb selle üllatavalt lihtsaks. Kui ma ise esimest korda süvenema hakkasin, jälgisin tasuta interaktiivset kursust (CryptoZombies, kui uudishimulik oled), mis tundus rohkem nagu mängimine kui õppimine. Paari tunniga kirjutasin funktsioone, kaardistasin aadresse saldodele ja eraldasin sündmusi – mõisted, mis paar päeva varem kõlasid nagu muistsed ruunid.
Aga kuidas kirjutada nutiklepingukoodi, mis tegelikult midagi kasulikku teeks? Teeme selle konkreetseks. Ütleme, et tahad lihtsat hoiupõrsast, millest saad ainult sina kuu aja pärast raha välja võtta. Soliditys määratleksid lepingu aadressi omanikuga, uint tähtajaga ja funktsiooni, mis kontrollib require(msg.sender == owner && block.timestamp >= deadline). See on üks paljudest Ethereumi nutiklepingute näidetest, mida saab kohandada ja laiendada. Panen siia skeleti, et su aju saaks selle kallal närida:
pragma solidity ^0.8.0;
contract TimeLockedWallet {
address public owner;
uint public unlockTime;
event Withdrawn(address to, uint amount);
constructor(uint _unlockTime) payable {
owner = msg.sender;
unlockTime = block.timestamp + _unlockTime;
}
function withdraw() public {
require(msg.sender == owner, "Pole omanik");
require(block.timestamp >= unlockTime, "Liiga vara");
emit Withdrawn(msg.sender, address(this).balance);
payable(owner).transfer(address(this).balance);
}
}
Näed? Pole mingit maagiat – ainult loogika. payable ja transfer osad kuuluvad algajate Solidity õpetuste materjali – saad need teekonna jooksul selgeks. Päris põnevus saabub siis, kui laadid nutikleping Ethereumi testvõrku nagu Goerli ja suhtled sellega rahakoti kaudu. Järsku hoiab su kirjutatud koodilõik reaalset test-eetrit ja kogu asi tundub palju käegakatsutavam.
Üleslaadimine on tänapäeval üllatavalt lihtne. Ma kasutan Remixi – brauseripõhist integreeritud arenduskeskkonda –, et kompileerida ja oma lepingud otse plokiahelasse lükata. Mõned klõpsud, MetaMaski kinnitus ja bum – oled just oma esimese peatamatu kooditüki saatnud. Siis tahad ilmselt ehitada kasutajaliidese, et tavalised inimesed saaksid seda kasutada. Siin tuleb kasuks dappi arendamise juhend (dapp development guide). Õpid ühendama veebilehe oma lepinguga ethers.js või web3.js abil, kutsudes neid funktsioone nupuklõpsuga. On mõnus vaadata, kuidas su nutikleping reaalsel liidesel ellu ärkab.
Muidugi on lõbus osa terava servaga. Kui su leping on Ethereumi peal, on see jäädav ja avalik – ja ründajad armastavad algajate vigu. Ma ei saa jätta mainimata nutiklepingute turvanõuandeid (smart contract security tips), mida iga arendaja peab varakult omaks võtma. Reentrancy (taassisenemine), kus keegi kutsub sinu väljamaksefunktsiooni mitu korda enne saldo uuendamist, hävitas algse DAO ja õpetas maailmale, et alati tuleb enne raha saatmist olekut uuendada. Täisarvu ületäitumine (integer overflow) oli kunagi õudusunenägu, kuni Solidity 0.8 tõi sisse sisseehitatud kontrollid. Ja kui su leping tugineb plokiahela juhuslikele numbritele, siis ära tee seda – plokiaja templit ja räsisid saab mõjutada. Kiire mõtteeksperiment: iga kord, kui kirjutad transfer, küsi endalt: “Mis juhtub, kui keegi kutsub seda 50 korda tsüklis?” See paranoia päästab sind.
Olgu, ma saan aru – vahel muutub kogu virn üle jõu käivaks. Kui vahtid tagasipööratud tehingut ega saa aru, miks, või vajad oma dappi jaoks kohandatud infrastruktuuri, siis on web3 tugiteenused (web3 support services) elupäästjad. Need pole ainult suurtele ettevõtetele; paljud väiksemad meeskonnad pakuvad ühekordseid konsultatsioone, et aidata sul siluda, gaasikasutust optimeerida või isegi koodi enne avaldamist auditeerida. See on nagu piloot, kes on seda marsruuti sada korda lennanud. Olen ise selliseid teenuseid kasutanud, kui vajasin NFT vermimisfunktsiooni integreerimist Reacti esiosaga ja lihtsalt ei olnud võimekust ABI mittevastavust ise ära siluda.
Tõde on see, et tee nullist nutiklepinguni on lühem kui kunagi varem. Kui oled tõsine plokiahela programmeerimise õppija, hakka juba täna nuputama. Kloo paar Ethereumi nutiklepingute näidet OpenZeppelin’i Wizardi abil, riku need, paranda ja küsi rumalaid küsimusi Discordi kogukondades. Iga professionaal on kunagi kirjutanud lepingu, mis kogemata raha igaveseks lukustas – see on osa võlust. Ja kui tunned end ummikus, pea meeles, et terve ökosüsteem web3 tugiteenuseid ja dappide arendamise juhendeid ootab, et sind edasi aidata. Plokiahel on lihtsalt uus lõuend ja su nutiklepingud võivad olla kõike alates lihtsast rahakotist kuni detsentraliseeritud mänguni. Nii et käivita Remix, ava algajate Solidity õpetus ja kirjuta koodirida, mis elab meist mõlemast kauem. Sa saad sellega hakkama.











