Kaip naudoti „Solidity“ programavimą
Solidity naudojama sudėtingų išmaniųjų sutarčių, skirtų veikti Ethereum blokų grandinėje, kūrimui. Ši kalba pasižymi unikaliomis strategijomis, kurios ją išskiria iš kitų programavimo kalbų.
Kas yra Solidity?
Solidity yra aukšto lygio programavimo kalba, skirta kurti protingus kontraktus Ethereum blokų grandinėje. Protingi kontraktai yra savaime vykdomi kontraktai, kurie automatizuoja turto mainus tarp šalių. Jų ypatumas yra tai, kad nereikia jokių tarpininkų, siekiant užtikrinti protingo kontrakto laikymąsi.
Solidity šaltinio kodas yra kompiliuojamas į baitkodą ir diegiamas Ethereum blokų grandinėje kaip išmanusis kontraktas. Tai atlikus, išmanusis kontraktas gali būti vykdomas bet kuriame tinklo mazge, o jo būsena saugoma blokų grandinėje. Pateikiame paprasto kontrakto, modeliuojančio NFT pardavimo automatą, pavyzdį:
pragma Solidity 0.8.7;
contract NFTVendingMachine {
// Declare state variables
address public owner;
mapping (address => uint) public nftBalance;
// Run on deployment
constructor() {
owner = msg.sender;
nftBalance[address(this)] = 100;
}
// Allow the owner to restock the NFT balance
function restock(uint amount) public {
require(msg.sender == owner, "Only the owner can restock.");
nftBalance[address(this)] += amount;
}
// Allow anyone to purchase NFTs
function purchase(uint amount) public payable {
require(msg.value >= amount * 1 ether, "You must pay at least 1 ETH per NFT");
require(nftBalance[address(this)] >= amount, "Not enough NFTs in stock to complete this purchase");
nftBalance[address(this)] -= amount;
nftBalance[msg.sender] += amount;
}
}solidityKokioms programoms tinka „Solidity“?
Solidity yra specialiai sukurta paskirstytoms programoms arba DApps, veikiančioms Ethereum Virtual Machine (EVM) platformoje, kurti. Pažangios sutartys tinka skaitmeninių išteklių valdymui, decentralizuotų biržų kūrimui, balsavimo sistemų diegimui ir kt.
Decentralizuotos finansinės paslaugos (DeFi)
Solidity naudojama kuriant DeFi programas, pavyzdžiui, decentralizuotas biržas, kredito ir skolinimo platformas, prognozavimo rinkas ir kriptovaliutas. DeFi tapo viena iš populiariausių blokų grandinės technologijos naudojimo sričių. Šiame procese Solidity tapo nepakeičiamu įrankiu kuriant DeFi programas Ethereum tinkle.
Nepakeičiami žetonai
Neatsiejamas žetonas (NFT) nuo 2020-ųjų metų sulaukė didelio populiarumo. NFT yra unikalūs skaitmeniniai turtai, saugomi blokų grandinėje. Tai gali būti skaitmeniniai meno kūriniai, sporto suvenyrai ar žaidimų pramonės artefaktai. Solidity naudojama kuriant protingus kontraktus, kurie valdo NFT.
Pristatymo grandinės valdymas
Solidity gali būti naudojama kuriant išmaniuosius kontraktus tiekimo grandinių stebėjimui ir valdymui. Kontraktai naudojami įvairių tiekimo grandinės procesų automatizavimui. Tai apima prekių judėjimo stebėjimą, produktų autentiškumo tikrinimą ir mokėjimų tarp šalių apdorojimą.
Sutikrinimo sistemos
Solidity gali būti naudojama kuriant protingus kontraktus, kurie įgyvendina saugias ir skaidrias balsavimo sistemas blokų grandinėje. Kontraktai gali būti naudojami siekiant užtikrinti, kad balsai būtų skaičiuojami teisingai ir kad balsavimo procesas būtų sąžiningas ir skaidrus.
Kokie yra „Solidity“ privalumai ir trūkumai?
Nors „Solidity“ yra galinga kalba, skirta kurti išmaniuosius kontraktus „Ethereum“ blokų grandinėje, ji turi specifinių privalumų ir trūkumų, kuriuos kūrėjai turėtų atsižvelgti kurdami išmaniuosius kontraktus. Nepaisant to, saugių išmaniųjų kontraktų kūrimas reikalauja tam tikro lygio kompetencijos ir atsargumo.
Pavyzdžiui, žemiau pateikiamas protingas kontraktas, kuris veikia kaip juodoji skylė. Bet koks į kontraktą siunčiamas eteris yra negrįžtamai sunaudojamas, be galimybės atgauti eterį ar atlikti išmokėjimą:
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.9.0;
// This contract swallows all Ether sent to it
contract Blackhole {
event Received(address, uint);
receive() external payable {
emit Received(msg.sender, msg.value);
}
}soliditySolidity privalumai
- Lankstumas: Solidity yra universali kalba. Ji gali būti naudojama įvairių protingų sutarčių, skirtų įvairiems naudojimo atvejams, kūrimui.
- Saugumas: „Solidity“ buvo sukurta atsižvelgiant į saugumą, įtraukiant tokias savybes kaip prieigos kontrolė, išimčių tvarkymas ir gedimų mechanizmai, siekiant padėti kūrėjams kurti saugias sutartis.
- Suderinamumas su Ethereum: šiuo metu Solidity yra pageidaujama kalba protingų sutarčių kūrimui Ethereum blokų grandinėje.
- Išskirtinė bendruomenė: didelė blokų grandinės kūrėjų bendruomenė dirba su Solidity, todėl yra gausu išteklių mokymuisi ir problemų sprendimui.
Solidity trūkumai
- Mokymosi kreivė: Kūrėjams, kurie dar nėra susipažinę su blokų grandine ir protingų sutarčių kūrimu, „Solidity“ yra gana sudėtinga išmokti.
- Nekintamumas: Kai protingas kontraktas yra įdiegtas blokų grandinėje, jo negalima toliau keisti. Todėl kūrėjai turi būti ypač atsargūs rašydami ir testuodami.
- Formalios patikros trūkumas: „Solidity“ neturi įdiegtų įrankių formaliam kodo peržiūrėjimui. Dėl to kūrėjai turi naudoti išorinius įrankius, kad užtikrintų savo sutarčių tikslumą.
- Ribotos priemonės: „Solidity“ priemonių ekosistema dar tik formuojasi, todėl gali kilti problemų su integruotomis programavimo aplinkomis (IDE), testavimo sistemomis ir kitomis programavimo priemonėmis.
Kokia yra pagrindinė Solidity sintaksė?
Solidity yra objektinis programavimo kalba, sukurta protingiems kontraktams. Ji yra įkvėpta JavaScript, Python ir C++ kalbų. Kalbos sintaksė yra panaši į JavaScript, nors turi keletą įdomių ypatumų.
Kintamieji Solidity kalboje
Iš pirmo žvilgsnio „Solidity“ kintamųjų tvarkymas gali atrodyti panašus į kitų programavimo kalbų. Tačiau esminis skirtumas kyla iš to, kad „Ethereum Virtual Machine“ (EVM) veikia kaip vykdymo aplinka. Visos operacijos EVM, įskaitant duomenų saugojimą, reikalauja tam tikrų „dujų“ sąnaudų. Todėl programavimo metu reikia įvertinti operacijos efektyvumą ir nuspręsti, kaip ją galima įgyvendinti kuo efektyviau.
Be įprastų kintamųjų, Solidity turi konstantas, kurios turi būti apibrėžtos kompiliavimo metu. Konstantos reikalauja mažiau dujų saugojimui:
// Regular variable can be declared without defining
int a;
// Constant needs to be defined at declaration
int constant b = 51;solidityTas pats taikoma immutable kintamiesiems, nes jie reikalauja mažiau dujų ir negali būti keičiami po priskyrimo. Skirtingai nei constant kintamieji, nekintamųjų kintamųjų priskyrimas gali būti atliekamas vykdymo metu.
Kontrolės teiginiai Solidity kalboje
Kaip imperatyvinė programavimo kalba, Solidity palaiko įprastas valdymo instrukcijas, pavyzdžiui, šakeles ir ciklus. Pateikiame kodą, skirtą pasirinkti didesnį iš dviejų skaičių, a ir b:
int largerNumber = 0;
// If-else statement
if (a > b) {
largerNumber = a;
} else {
largerNumber = b;
}solidityfor kilpa Solidity atitinka sintaksę, žinomą iš JavaScript arba C++:
// Loop 10 times
for (int i = 0; i < 10; i++) {
// …
}soliditywhile kilpa taip pat veikia kaip įprasta. Mes sujungiame nutraukimo sąlygą su skaitmeniniu skaitiklio kintamuoju:
bool continueLoop = true;
int counter = 0;
// Loop at most 10 times
while (continueLoop && counter < 10) {
// …
counter++;
}solidityPaprasti tipai Solidity kalboje
Solidity yra statinio tipavimo kalba, palaikanti tipus, paprastai naudojamus programavimo kalbose. Paprasti tipai, atspindintys vieną reikšmę, apima boolinius tipus, skaičius ir eilutes.
Booleans Solidity atvaizduoja vertes true ir false. Jos gali būti susietos naudojant žinomus Boolean operatorius ir naudojamos if teiginiuose:
bool paymentReceived = true;
bool itemsStocked = true;
bool continueTransaction = paymentReceived && itemsStocked;
if (continueTransaction) {
// ...
}soliditySolidity palaiko platų skaitmeninių tipų spektrą. Sveikieji skaičiai gali būti skirstomi į ženklinius (int) ir beženklinius (uint) skaičius, kur pastarieji gali būti tik teigiami. Be to, skaičiaus diapazonas gali būti nurodytas 8 bitų žingsniais, nuo int8 per int16 iki int265:
uint8 smallNumber = 120;
int8 negativeNumber = -125;
int8 result = smallNumber + negativeNumber;
assert(result == -5)solidityStringai Solidity kalboje naudojami daugiausia būsenos pranešimams generuoti. Kalba palaiko viengubas ir dvigubas kabutes, taip pat Unicode simbolius:
string message = 'Hello World';
string success = unicode"Transfer sent";SolidityFunkcijos Solidity
Funkcijos yra pagrindinis Solidityaspektas, kaip ir daugumoje programavimo kalbų. Funkcijos apibrėžimas yra panašus į JavaScript, kur argumentų tipai turi būti aiškiai nurodyti. Be to, raktinis žodis „returns“ naudojamas return vertės tipams nurodyti.
// Define a function
function addNumbers(int a, int b) returns (int) {
return a + b;
}solidityFunkcijos iškvietimas atliekamas kaip įprasta:
// Call the function
int result = addNumbers(2, 3);solidityĮdomu tai, kad analogiškai kaip ir pavadinti argumentai, Solidity grąžinamosios reikšmės taip pat gali būti pavadintos. Tokiu atveju pakanka priskirti atitinkamas kintamuosius funkcijos kūne, o aiškus grąžinimas per return nėra būtinas:
function divideNumbers(int dividend, int divisor) returns (int quotient) {
quotient = dividend / divisor;
// No `return` necessary
}solidityPanašiai kaip constant ar immutable kintamieji, Solidity funkcijos gali būti pažymėtos kaip nekeičiančios būsenos. Šiam tikslui naudojami raktiniai žodžiai view ir pure. view funkcija nekeičia būsenos, o pure funkcija papildomai garantuoja, kad nebūtų skaitomi būsenos kintamieji.
Išmanieji kontraktai „Solidity“ kalba
Be standartinių tipų, Solidity žino keletą specializuotų išmaniųjų sutarčių tipų. Pagrindinis tipas yra address ir atitinka Ethereum adresus. Adresai, kurių tipas yra payable, gali priimti pervedimus Ether. Šiam tikslui payable adresai teikia balance() ir transfer() metodus.
// Get address of this contract
address mine = address(this);
// Get payable external address
address payable other = payable(0x123);
// Transfer if balances fulfill conditions
if (other.balance < 10 && mine.balance >= 100) {
other.transfer(10);
}solidityRemiantis address tipu, contract tipas egzistuoja kaip centrinė kalbos konstrukcija. Sutartys atitinka objektų orientuotų programavimo kalbų klases. Taigi, sutartys apjungia būsenos duomenis ir funkcijas bei apsaugo juos nuo išorinio pasaulio. Sutartys palaiko daugkartinį paveldėjimą, kaip žinoma iš Python ar C++.
Sutartys paprastai prasideda pragma eilute, kurioje nurodyta leidžiama „Solidity“ versija, po kurios eina tikrasis apibrėžimas:
// Make sure Solidity version matches
pragma Solidity >=0.7.1 <0.9.0;
// Contract definition
contract Purchase {
// Public state variables
address seller;
address buyer;
// View-function
function getSeller() external view returns (address) {
return seller;
}
}solidityIšmanieji kontraktai gali apibrėžti būsenos duomenis ir funkcijas. Kaip žinoma iš C++ ir Java, kiekvienu atveju galima apibrėžti vieną iš trijų prieigos lygių:
public: Prie kintamojo galima prieiti skaitant ir rašant iš sutarties. Be to,viewfunkcija automatiškai generuojama kaip gavimo funkcija išorinei skaitymo prieigai.internal: Kintamasis yra apsaugotas nuo išorinės prieigos. Skaityti ir rašyti galima iš sutarties vidaus, taip pat iš paveldėtų sutarčių.private: kaipinternal, bet nėra prieigos iš paveldėtų sutarčių
Funkcijos taip pat gali būti apibūdinamos kaip external. external funkcija veikia kaip sutarties sąsajos dalis ir yra naudojama išorinei prieigai. receive funkcija, skirta eteriui priimti, yra gerai žinomas pavyzdys:
// Define without `function` keyword
receive() external payable {
// Handle Ether
}solidityModifikatoriai Solidity kalboje
Solidity turi įdomią kalbos konstrukciją modifikatorių forma, kurie primena Python dekoratorius. Panašiai kaip Python, Solidity modifikatoriai naudojami funkcijos iškvietimui pakeisti. Jie dažnai naudojami siekiant užtikrinti, kad prieš vykdant funkciją būtų įvykdyta tam tikra sąlyga:
contract Sale {
uint price;
address payable owner;
modifier onlyOwner {
// Will throw error if called by anyone other than the owner
require(
msg.sender == owner,
"Only owner can call this function."
);
// The wrapped function's body is inserted here
_;
}
// `onlyOwner` wraps `changePrice`
function changePrice(uint newPrice) public onlyOwner {
// We'll only get here if the owner called this function
price = newPrice;
}
}soliditySandorių valdymas naudojant „Solidity“
Solidity turi integruotą sandorių valdymą. Tai gali būti naudojama siekiant užtikrinti, kad eterio pervedimas būtų visiškai įvykdytas arba visiškai neįvykdytas. Kalba supranta revert raktinį žodį, kuris sukelia sandorio „atšaukimą“. Naudodami error raktinį žodį galite apibrėžti savo klaidų kodus:
// Custom error definition
error InsufficientPayment(uint256 paid, uint256 required);
// Contract representing a sale
contract Sale {
uint price;
// Purchase if enough ether transferred
function purchase() public payable {
if (msg.value < price) {
revert InsufficientPayment(msg.value, price);
}
// Complete purchase
}
}solidityKitas dažnai pasitaikantis modelis yra require() funkcijos naudojimas. Ji gali būti naudojama analogiškai kaip revert:
// Using `require()` function
if (!condition) revert("Error message");
// Equivalent to
require(condition, "Error message");solidity