Tutvu Solidityga, juhtiva programmeerimiskeelega Ethereumi plokiahelas nutilepingute loomiseks. See juhend katab kÔik alates pÔhikontseptsioonidest kuni edasijÔudnud tehnikateni.
Solidity: PÔhjalik juhend nutilepingute programmeerimiseks
Solidity on kĂ”rgetasemeline, lepingupĂ”hine programmeerimiskeel, mida kasutatakse nutilepingute rakendamiseks erinevatel plokiahelaplatvormidel, eelkĂ”ige Ethereumis. See on tugevalt mĂ”jutatud C++, Pythonist ja JavaScriptist ning on loodud Ethereumi virtuaalmasina (EVM) sihtimiseks. See juhend annab ĂŒksikasjaliku ĂŒlevaate Solidityst, mis sobib nii algajatele kui ka kogenud programmeerijatele, kes soovivad sukelduda plokiahela arenduse maailma.
Mis on nutilepingud?
Enne Solidity sisse sukeldumist on oluline mÔista, mis on nutilepingud. Nutileping on enesetÀituv leping, mille tingimused on otse koodi kirjutatud. See salvestatakse plokiahelasse ja tÀidetakse automaatselt, kui eelnevalt kindlaksmÀÀratud tingimused on tÀidetud. Nutilepingud vÔimaldavad automatiseerimist, lÀbipaistvust ja turvalisust erinevates rakendustes, sealhulgas:
- Detsentraliseeritud rahastus (DeFi): Laenu-, laenamis- ja kauplemisplatvormid.
- Tarneahela haldamine: Kaupade jÀlgimine ja lÀbipaistvuse tagamine.
- ValimissĂŒsteemid: Turvaline ja kontrollitav elektrooniline hÀÀletamine.
- Kinnisvara: Kinnisvaratehingute automatiseerimine.
- Tervishoid: Patsiendiandmete turvaline haldamine.
Miks Solidity?
Solidity on Ethereumi ja teiste EVM-ĂŒhilduvate plokiahelate nutilepingute kirjutamiseks domineeriv keel mitmel pĂ”hjusel:
- EVM-ĂŒhilduvus: Solidity on spetsiaalselt loodud kompileerimiseks baitkoodiks, mis töötab Ethereumi virtuaalmasinas.
- Kogukonna tugi: Suur ja aktiivne kogukond pakub ulatuslikku dokumentatsiooni, teeke ja tööriistu.
- Turvaelemendid: Solidity sisaldab funktsioone tavaliste nutilepingute haavatavuste leevendamiseks.
- KÔrgetasemeline abstraheerimine: Pakub kÔrgetasemelisi konstruktsioone, mis muudavad lepingu arendamise tÔhusamaks ja hallatavamaks.
Arengukeskkonna seadistamine
Solidityga arendamise alustamiseks peate seadistama sobiva arenduskeskkonna. Siin on mÔned populaarsed valikud:
Remix IDE
Remix on veebipÔhine, brauseripÔhine IDE, mis sobib suurepÀraselt Solidityga Ôppimiseks ja katsetamiseks. See ei vaja kohalikku installimist ja pakub funktsioone nagu:
- Koodiredaktor sĂŒntaksi esiletĂ”stmise ja automaatse tĂ€iendamisega.
- Kompilaator Solidity koodi baitkoodiks teisendamiseks.
- Lepe testivÔrkudesse vÔi mainneti juurutamiseks.
- Silur koodis samm-sammult liikumiseks ja vigade tuvastamiseks.
Remix IDE-le pÀÀseb juurde aadressil https://remix.ethereum.org/
Truffle Suite
Truffle on terviklik arendusraamistik, mis lihtsustab nutilepingute loomise, testimise ja juurutamise protsessi. See pakub tööriistu nagu:
- Truffle: KÀsureatööriist projektide loomiseks, kompileerimiseks, juurutamiseks ja testimiseks.
- Ganache: Isiklik plokiahel kohalikuks arenduseks.
- Drizzle: Esiotsa teekide kogumik, mis lihtsustab teie nutilepingute integreerimist kasutajaliideste kaudu.
Truffle'i installimiseks:
npm install -g truffle
Hardhat
Hardhat on veel ĂŒks populaarne Ethereumi arenduskeskkond, mis on tuntud oma paindlikkuse ja laiendatavuse poolest. See vĂ”imaldab teil kompileerida, juurutada, testida ja siluda oma Solidity koodi. Peamised funktsioonid on:
- Sisseehitatud kohalik Ethereum vÔrk testimiseks.
- Plugin-sĂŒsteem funktsionaalsuse laiendamiseks.
- Console.log silumine.
Hardhat'i installimiseks:
npm install --save-dev hardhat
Solidity pĂ”hitĂ”ed: SĂŒntaks ja andmetĂŒĂŒbid
Uurime Solidity pĂ”hilist sĂŒntaksit ja andmetĂŒĂŒpe.
Solidity lepingu struktuur
Solidity leping on sarnane objektorienteeritud programmeerimise klassiga. See koosneb olekumuutujatest, funktsioonidest ja sĂŒndmustest. Siin on lihtne nĂ€ide:
pragma solidity ^0.8.0;
contract SimpleStorage {
uint256 storedData;
function set(uint256 x) public {
storedData = x;
}
function get() public view returns (uint256) {
return storedData;
}
}
Selgitus:
pragma solidity ^0.8.0;: MÀÀrab Solidity kompilaatori versiooni. Ootamatu kĂ€itumise vĂ€ltimiseks on oluline kasutada ĂŒhilduvat versiooni.contract SimpleStorage { ... }: MÀÀratleb lepingu nimegaSimpleStorage.uint256 storedData;: Deklareerib olekumutri nimegastoredDatatĂŒĂŒbigauint256(mĂ€rgita tĂ€isarv 256 bitiga).function set(uint256 x) public { ... }: MÀÀratleb funktsiooni nimegaset, mis vĂ”tab sisendina mĂ€rgita tĂ€isarvu ja vĂ€rskendab muutujatstoredData.publicvĂ”tmesĂ”na tĂ€hendab, et funktsiooni vĂ”ivad kutsuda kĂ”ik.function get() public view returns (uint256) { ... }: MÀÀratleb funktsiooni nimegaget, mis tagastabstoredDatavÀÀrtuse.viewvĂ”tmesĂ”na nĂ€itab, et funktsioon ei muuda lepingu olekut.
AndmetĂŒĂŒbid
Solidity toetab mitmesuguseid andmetĂŒĂŒpe:
- TĂ€isarvud:
uint(mÀrgita tÀisarv) jaint(mÀrgiga tÀisarv) erinevate suurustega (ntuint8,uint256). - Boolsid:
bool(truevÔifalse). - Aadressid:
address(tÀhistab Ethereumi aadressi). - Byted:
bytes(fikseeritud suurusega byted massiivid) jastring(muutuva suurusega string). - Massiivid: Fikseeritud suurusega (nt
uint[5]) ja muutuvsuurusega (ntuint[]). - Kaardid: VÔtme-vÀÀrtuse paarid (nt
mapping(address => uint)).
NĂ€ide:
pragma solidity ^0.8.0;
contract DataTypes {
uint256 public age = 30;
bool public isAdult = true;
address public owner = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
bytes32 public name = "JohnDoe";
uint[] public numbers = [1, 2, 3, 4, 5];
mapping(address => uint) public balances;
constructor() {
balances[msg.sender] = 100;
}
}
Olekumuutujad vs. lokaalsed muutujad
Olekumuutujad deklareeritakse funktsioonide vĂ€ljaspool ja salvestatakse plokiahelasse. Need sĂ€ilivad funktsioonikĂ”nede ja lepingu tĂ€itmise ajal. Ălaltoodud nĂ€ites on storedData olekumutri.
Lokaalsed muutujad deklareeritakse funktsioonide sees ja eksisteerivad ainult selle funktsiooni ulatuses. Neid ei salvestata plokiahelasse ja need visatakse Àra, kui funktsioon on lÔpetatud.
Funktsioonid Soliditys
Funktsioonid on nutilepingute ehitusplokid. Nad mÀÀratlevad loogika ja toimingud, mida leping saab sooritada. Funktsioonid vÔivad:
- Muuta lepingu olekut.
- Lugeda andmeid lepingu olekust.
- Suhelda teiste lepingutega.
- Saata vÔi vastu vÔtta Ethereumi.
Funktsiooni nÀhtavus
Solidity funktsioonidel on neli nÀhtavuse modifikaatorit:
- public: Saab kutsuda nii seest- kui vÀljastpoolt.
- private: Saab kutsuda ainult lepingu seestpoolt.
- internal: Saab kutsuda nii lepingu seestpoolt kui ka tuletatud lepingutest.
- external: Saab kutsuda ainult vÀljastpoolt.
Funktsioonimodifikaatorid
Funktsioonimodifikaatoreid kasutatakse funktsiooni kÀitumise muutmiseks. Neid kasutatakse sageli turvapiirangute jÔustamiseks vÔi funktsiooni loogika tÀitmiseelse kontrollide sooritamiseks.
NĂ€ide:
pragma solidity ^0.8.0;
contract Ownership {
address public owner;
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "Only owner can call this function");
_;
}
function transferOwnership(address newOwner) public onlyOwner {
owner = newOwner;
}
}
Selles nĂ€ites kontrollib onlyOwner modifikaator, kas kutsuja on lepingu omanik. Kui ei, siis taastatakse tehing. _ kohthoidja tĂ€histab ĂŒlejÀÀnud funktsiooni koodi.
Funktsiooni oleku muutuvus
Solidity funktsioonid vÔivad samuti omada oleku muutuvuse modifikaatoreid:
- view: NÀitab, et funktsioon ei muuda lepingu olekut. See vÔib lugeda olekumutreid, kuid ei saa neisse kirjutada.
- pure: NÀitab, et funktsioon ei loe ega muuda lepingu olekut. See on tÀielikult iseseisev ja deterministlik.
- payable: NÀitab, et funktsioon vÔib vastu vÔtta Ethereumi.
NĂ€ide:
pragma solidity ^0.8.0;
contract Example {
uint256 public value;
function getValue() public view returns (uint256) {
return value;
}
function add(uint256 x) public pure returns (uint256) {
return x + 5;
}
function deposit() public payable {
value += msg.value;
}
}
Kontrollstruktuurid
Solidity toetab standardseid kontrollstruktuuriga nagu if, else, for, while ja do-while tsĂŒklid.
NĂ€ide:
pragma solidity ^0.8.0;
contract ControlStructures {
function checkValue(uint256 x) public pure returns (string memory) {
if (x > 10) {
return "Value is greater than 10";
} else if (x < 10) {
return "Value is less than 10";
} else {
return "Value is equal to 10";
}
}
function sumArray(uint[] memory arr) public pure returns (uint256) {
uint256 sum = 0;
for (uint256 i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}
}
SĂŒndmused ja logimine
SĂŒndmused vĂ”imaldavad nutilepingutel suhelda vĂ€lismaailmaga. Kui sĂŒndmus on vĂ€lja antud, salvestatakse see plokiahela tehingulogidesse. Neid logisid saavad jĂ€lgida vĂ€lised rakendused, et jĂ€lgida lepingu tegevust.
NĂ€ide:
pragma solidity ^0.8.0;
contract EventExample {
event ValueChanged(address indexed caller, uint256 newValue);
uint256 public value;
function setValue(uint256 newValue) public {
value = newValue;
emit ValueChanged(msg.sender, newValue);
}
}
Selles nĂ€ites antakse setValue funktsiooni vĂ€ljakutsumisel vĂ€lja ValueChanged sĂŒndmus. caller parameetri indexed vĂ”tmesĂ”na vĂ”imaldab vĂ€listel rakendustel filtreerida sĂŒndmusi kutsuja aadressi alusel.
PĂ€ritus
Solidity toetab pĂ€ritust, vĂ”imaldades teil luua uusi lepinguid olemasolevate pĂ”hjal. See soodustab koodi taasĂŒhiskasutamist ja modulaarsust.
NĂ€ide:
pragma solidity ^0.8.0;
contract BaseContract {
uint256 public value;
function setValue(uint256 newValue) public {
value = newValue;
}
}
contract DerivedContract is BaseContract {
function incrementValue() public {
value++;
}
}
Selles nÀites pÀrib DerivedContract BaseContract-ilt. See pÀrib value olekumutri ja setValue funktsiooni. See mÀÀratleb ka oma funktsiooni incrementValue.
Teegid
Teegid sarnanevad lepingutega, kuid need ei saa andmeid salvestada. Neid kasutatakse korduvkasutatava koodi juurutamiseks, mida mitmed lepingud vĂ”ivad kutsuda. Teegid juurutatakse ainult ĂŒks kord, mis vĂ€hendab gaasikulusid.
NĂ€ide:
pragma solidity ^0.8.0;
library Math {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
}
contract Example {
using Math for uint256;
uint256 public result;
function calculateSum(uint256 x, uint256 y) public {
result = x.add(y);
}
}
Selles nÀites mÀÀratleb Math teek add funktsiooni. using Math for uint256; lause vÔimaldab teil kutsuda add funktsiooni uint256 muutujatele punktinotatsiooni abil.
Levinumad nutilepingute haavatavused
Nutilepingud on vastuvÔtlikud erinevatele haavatavustele, mis vÔivad pÔhjustada raha kaotamist vÔi ootamatut kÀitumist. On oluline olla teadlik nende haavatavuste suhtes ja vÔtta meetmeid nende leevendamiseks.
Taaskasutamine (Reentrancy)
Taaskasutamine tekib siis, kui leping kutsub vÀlislepingut ja vÀline leping kutsub tagasi algsesse lepingusse enne, kui algse lepingu tÀitmine on lÔppenud. See vÔib pÔhjustada ootamatuid oleku muutusi.
Leevendus: Kasutage Checks-Effects-Interactions (kontroll-toimingud-interaktsioonid) mustrit ja kaaluge transfer vÔi send funktsioonide kasutamist, et piirata vÀliskutse jaoks saadaolevat gaasi.
ĂletĂ€itumine ja alitĂ€itumine
ĂletĂ€itumine tekib, kui aritmeetiline operatsioon ĂŒletab andmetĂŒĂŒbi maksimaalse vÀÀrtuse. AlitĂ€itumine tekib, kui aritmeetiline operatsioon annab tulemuseks vÀÀrtuse, mis on vĂ€iksem kui andmetĂŒĂŒbi miinimumvÀÀrtus.
Leevendus: Kasutage SafeMath teeke (kuigi Solidity 0.8.0 ja hilisemates versioonides on ĂŒletĂ€itumise ja alitĂ€itumise kontrollid vaikimisi sisse ehitatud), et neid probleeme vĂ€ltida.
Ajatemplist sÔltuvus
Ploki ajatemplile (block.timestamp) tuginemine vĂ”ib muuta teie lepingu kaevurite manipulatsioonile vastuvĂ”tlikuks, kuna neil on ajatempli ĂŒle teatav kontroll.
Leevendus: VÀltige block.timestamp kasutamist kriitilise loogika jaoks. Kaaluge ajatempli vÔi muude usaldusvÀÀrsemate allikate kasutamist.
Teenuse keelamine (DoS)
DoS-rĂŒnded on suunatud lepingu kasutuskĂ”lbmatuks muutmisele seaduslike kasutajate jaoks. Seda saab saavutada kogu saadaoleva gaasi tarbimise vĂ”i haavatavuste Ă€rakasutamise kaudu, mis pĂ”hjustavad lepingu tagasivĂ”tmist.
Leevendus: Rakendage gaasipiiranguid, vĂ€ltige piiramatu arvuga tsĂŒkleid ja valideerige hoolikalt kasutaja sisendeid.
EesjÀrjekorras kÀimine (Front Running)
EesjÀrjekorras kÀimine toimub siis, kui keegi mÀrkab ootel olevat tehingut ja esitab oma tehingu kÔrgema gaasihinnaga, et see tÀidetaks enne originaaltehingut.
Leevendus: Kasutage tehingu ĂŒksikasjade varjamiseks kuni nende tĂ€itmiseni kombineerimis-avastus skeeme vĂ”i muid tehnikaid.
Parimad praktikad turvaliste nutilepingute kirjutamiseks
- Hoidke see lihtsana: Kirjutage lĂŒhike ja kergesti mĂ”istetav kood.
- JÀrgige Checks-Effects-Interactions mustrit: Veenduge, et kontrollid viiakse lÀbi enne mis tahes oleku muutuste tegemist ja interaktsioonid teiste lepingutega viiakse lÔpule.
- Kasutage turvatööriistu: Potentsiaalsete haavatavuste tuvastamiseks kasutage staatilise analĂŒĂŒsi tööriistu nagu Slither ja Mythril.
- Kirjutage ĂŒhiktestid: Testige oma nutilepinguid pĂ”hjalikult, et tagada nende ootuspĂ€rane kĂ€itumine.
- Saage auditeeritud: Enne oma nutilepingute peavÔrku juurutamist laske need auditeerida mainekatel turvaettevÔtetel.
- PĂŒsige kursis: Hoidke end kursis Solidity kogukonna uusimate turvahĂ€kkimiste ja parimate praktikatega.
EdasijÔudnud Solidity kontseptsioonid
Kui teil on pÔhitÔdedest kindel arusaam, saate uurida edasijÔudnumaid kontseptsioone:
Koostamine (Assembly)
Solidity vĂ”imaldab teil kirjutada sisseehitatud koostekoodi, mis annab teile rohkem kontrolli EVM-i ĂŒle. Siiski suurendab see ka vigade ja haavatavuste sisseviimise riski.
Proksiid
Proksiid vÔimaldavad teil oma nutilepinguid uuendada ilma andmeid migreerimata. See hÔlmab proksilepingu juurutamist, mis suunab kÔned implementatsioonilepingusse. Kui soovite lepingut uuendada, juurdate lihtsalt uue implementatsioonilepingu ja vÀrskendate proksit, et see uuele implementatsioonile osutaks.
Metatehingud
Metatehingud vÔimaldavad kasutajatel oma nutilepingutega suhelda ilma otse gaasitasusid maksmata. Selle asemel maksab vahendaja nende eest gaasitasud. See vÔib parandada kasutajakogemust, eriti uutele plokiahelaga kasutajatele.
EIP-721 ja EIP-1155 (NFT-d)
Solidityt kasutatakse tavaliselt mitteasendatavate ĆŸetoonide (NFT-d) loomiseks, kasutades standardeid nagu EIP-721 ja EIP-1155. Nende standardite mĂ”istmine on NFT-pĂ”histe rakenduste loomisel ĂŒlioluline.
Solidity ja plokiahela tulevik
Solidity mÀngib kriitilist rolli kiiresti arenevas plokiahela tehnoloogia maastikus. Kuna plokiahela kasutuselevÔtt jÀtkuvalt kasvab, on Solidity arendajatele suur nÔudlus uuenduslike ja turvaliste detsentraliseeritud rakenduste loomiseks. Keelt tÀiendatakse ja tÀiustatakse pidevalt, seega on selle valdkonna edu saavutamiseks oluline olla kursis viimaste arengutega.
KokkuvÔte
Solidity on vĂ”imas ja mitmekĂŒlgne keel nutilepingute loomiseks Ethereumi plokiahelas. See juhend on andnud pĂ”hjaliku ĂŒlevaate Solidityst, alates pĂ”hikontseptsioonidest kuni edasijĂ”udnud tehnikateni. Solidity meisterdamise ja turvalise arenduse parimate tavade jĂ€rgimisega saate panustada detsentraliseeritud rakenduste pĂ”nevasse maailma ja aidata kujundada plokiahela tehnoloogia tulevikku. Pidage meeles alati turvalisust prioriteediks seada, oma koodi pĂ”hjalikult testida ja olla kursis Solidity ökosĂŒsteemi viimaste arengutega. Nutilepingute potentsiaal on tohutu ja Solidityga saate oma uuenduslikud ideed ellu viia.