Kako uporabljati programiranje Solidity
Solidity se uporablja za oblikovanje kompleksnih pametnih pogodb, zasnovanih za delovanje na blok verigi Ethereum. Ta jezik predstavlja edinstvene strategije, ki ga ločujejo od drugih programskih jezikov.
Kaj je Solidity?
Solidity je visokoravni programski jezik za ustvarjanje pametnih pogodb na blok verigi Ethereum. Pametne pogodbe so samodejno izvršljive pogodbe, ki avtomatizirajo izmenjavo sredstev med strankami. Posebnost teh pogodb je, da za zagotovitev skladnosti s pametno pogodbo niso potrebni posredniki.
Izvorna koda Solidity se prevede v bajtno kodo in se kot pametna pogodba razporedi na blok verigi Ethereum. Ko je to storjeno, lahko pametno pogodbo izvede kateri koli vozlišče v omrežju, stanje pa se shrani na blok verigi. Prikazujemo primer preproste pogodbe, ki modelira avtomat za prodajo NFT:
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;
}
}solidityZa katere aplikacije je Solidity primeren?
Solidity je posebej zasnovan za ustvarjanje razpršenih aplikacij ali DApps, ki delujejo na virtualnem stroju Ethereum (EVM). Pametne pogodbe so primerne za upravljanje digitalnih sredstev, ustvarjanje decentraliziranih borz in izvajanje glasovalnih sistemov, med drugim.
Decentralizirane finance (DeFi)
Solidity se uporablja za razvoj aplikacij DeFi, kot so decentralizirane borze, platforme za kredite in posojila, trgi napovedi in kriptovalute. DeFi je postal eden najbolj priljubljenih primerov uporabe tehnologije blockchain. V tem procesu je Solidity postal nepogrešljivo orodje za razvoj aplikacij DeFi v omrežju Ethereum.
Nezamenljivi žetoni
Nezamenljivi žetoni (NFT) so od leta 2020 zelo priljubljeni. NFT-ji so edinstvena digitalna sredstva, shranjena v verigi blokov. Lahko so digitalna umetniška dela, športni spominki ali artefakti iz igralniške industrije. Solidity se uporablja za ustvarjanje pametnih pogodb, ki poganjajo NFT-je.
Upravljanje dobavne verige
Solidity se lahko uporablja za ustvarjanje pametnih pogodb za spremljanje in upravljanje dobavnih verig. Pogodbe se uporabljajo za avtomatizacijo različnih procesov v dobavni verigi. Ti vključujejo sledenje gibanja blaga, preverjanje pristnosti izdelkov in obdelavo plačil med strankami.
Sistemi usklajevanja
Solidity se lahko uporabi za ustvarjanje pametnih pogodb, ki izvajajo varne in pregledne sisteme glasovanja na blok verigi. Pogodbe se lahko uporabijo za zagotovitev, da se glasovi pravilno preštejejo in da je glasovalni postopek pošten in pregleden.
Kakšne so prednosti in slabosti Solidity?
Solidity je sicer zmogljiv jezik za ustvarjanje pametnih pogodb na blok verigi Ethereum, vendar ima svoje specifične prednosti in slabosti, ki jih morajo razvijalci upoštevati pri razvoju pametnih pogodb. Kljub temu pa ustvarjanje varnih pametnih pogodb zahteva določeno raven usposobljenosti in previdnosti.
Za ponazoritev je spodaj prikazan pametni pogodbeni dokument, ki deluje kot črna luknja. Vsak Ether, poslan v pogodbeni dokument, se trajno porabi, brez možnosti za ponovno pridobitev Etherja ali izplačilo:
// 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);
}
}solidityPrednosti trdnosti
- Prilagodljivost: Solidity je vsestranski jezik. Uporablja se lahko za razvoj različnih pametnih pogodb z različnimi primeri uporabe.
- Varnost: Solidity je bil ustvarjen z osredotočenostjo na varnost, vključuje značilnosti, kot so nadzor dostopa, obravnavanje izjem in mehanizmi za odpoved, ki razvijalcem pomagajo pri oblikovanju varnih pogodb.
- Združljivost z Ethereumom: Trenutno je Solidity najbolj priljubljen jezik za ustvarjanje pametnih pogodb na blok verigi Ethereum.
- Izrazita skupnost: Velika skupnost razvijalcev blokovnih verig dela s Solidity, kar omogoča številne vire za učenje in reševanje problemov.
Pomanjkljivosti Solidity
- Učna krivulja: Za razvijalce, ki so novi na področju razvoja blokovnih verig in pametnih pogodb, je Solidity relativno zahteven za učenje.
- Nespremenljivost: Ko je pametna pogodba enkrat razporejena v blockchainu, je ni mogoče več spreminjati. Iz tega sledi, da morajo razvijalci biti pri pisanju in testiranju izredno previdni.
- Pomanjkanje formalne verifikacije: Solidity nima vgrajenih orodij za formalno pregledovanje kode. Zaradi tega morajo razvijalci uporabljati zunanja orodja, da zagotovijo točnost svojih pogodb.
- Omejena orodja: Ekosistem orodij Solidity je še v začetni fazi, kar lahko povzroči težave z integriranimi razvojnimi okolji (IDE), okviri za testiranje in drugimi razvojnimi orodji.
Kakšna je osnovna sintaksa Solidity?
Solidity je objektno usmerjen programski jezik, zasnovan za pametne pogodbe. Navdih črpa iz JavaScript, Python in C++. Sintaksa jezika je podobna JavaScript, čeprav z nekaterimi zanimivimi posebnostmi.
Spremenljivke v Solidity
Na prvi pogled se obdelava spremenljivk v Solidity zdi podobna obdelavi v drugih programskih jezikih. Vendar pa obstaja pomembna razlika, ki izhaja iz dejstva, da kot izvedbeno okolje služi Ethereum Virtual Machine (EVM). Vse operacije na EVM, vključno s shranjevanjem podatkov, povzročajo določene stroške „plina“. Zato je med programiranjem treba pretehtati učinkovitost operacije in določiti, kako jo je mogoče izvesti čim bolj učinkovito.
Poleg rednih spremenljivk ima Solidity tudi konstante, ki jih je treba definirati med kompiliranjem. Konstante zahtevajo manj plina za shranjevanje:
// Regular variable can be declared without defining
int a;
// Constant needs to be defined at declaration
int constant b = 51;solidityEnako velja za immutable spremenljivk, saj zahtevajo manj plina in jih po dodelitvi ni mogoče spremeniti. Za razliko od constant spremenljivk je dodelitev nespremenljivih spremenljivk mogoča med izvajanjem.
Kontrolne izjave v Solidity
Kot imperativni programski jezik Solidity podpira znane kontrolne izjave, kot so veje in zanke. Prikazujemo kodo za izbiro večjega od dveh številk, a in b:
int largerNumber = 0;
// If-else statement
if (a > b) {
largerNumber = a;
} else {
largerNumber = b;
}solidityZankafor v Solidity ustreza sintaksi, znani iz JavaScript ali C++:
// Loop 10 times
for (int i = 0; i < 10; i++) {
// …
}solidityTudi zanka while deluje kot običajno. Kombiniramo pogoj za zaključek s številčno spremenljivko števca:
bool continueLoop = true;
int counter = 0;
// Loop at most 10 times
while (continueLoop && counter < 10) {
// …
counter++;
}solidityPreprosti tipi v Solidity
Solidity je statično tipiziran jezik in podpira tipe, ki so pogosti v programskih jezikih. Preprosti tipi, ki predstavljajo posamezne vrednosti, vključujejo logične vrednosti, številke in nize.
Booleani v Solidityju preslikujejo vrednosti true in false. Lahko se povežejo z znanimi booleanskimi operacijami in uporabijo v if izjavah:
bool paymentReceived = true;
bool itemsStocked = true;
bool continueTransaction = paymentReceived && itemsStocked;
if (continueTransaction) {
// ...
}soliditySolidity podpira široko paleto numeričnih tipov. Celoštevilska števila se lahko razlikujejo med števili s predznakom (int) in števili brez predznaka (uint), pri čemer so slednja lahko samo pozitivna. Poleg tega se lahko obseg števila določi v korakih po 8 bitov, od int8 prek int16 do int265:
uint8 smallNumber = 120;
int8 negativeNumber = -125;
int8 result = smallNumber + negativeNumber;
assert(result == -5)solidityNize se v Solidity uporabljajo predvsem za ustvarjanje statusnih sporočil. Jezik podpira enojne in dvojne narekovaje ter Unicode znake:
string message = 'Hello World';
string success = unicode"Transfer sent";SolidityFunkcije v Solidity
Funkcije so temeljni vidik Solidity, kot v večini programskih jezikov. Opredelitev funkcije je podobna JavaScriptu, kjer morajo biti tipi argumentov izrecno navedeni. Poleg tega se za označevanje return tipov vrednosti uporablja ključna beseda returns.
// Define a function
function addNumbers(int a, int b) returns (int) {
return a + b;
}solidityKlic funkcije se izvede kot običajno:
// Call the function
int result = addNumbers(2, 3);solidityZanimivo je , da se podobno kot imenovani argumenti lahko imenujejo tudi vrnjene vrednosti v Solidity. V tem primeru zadostuje dodelitev ustreznih spremenljivk v telesu funkcije, eksplicitna vrnitev prek return pa ni potrebna:
function divideNumbers(int dividend, int divisor) returns (int quotient) {
quotient = dividend / divisor;
// No `return` necessary
}solidityPodobno kot pri spremenljivkah constant ali immutable se lahko funkcije v Solidity označijo kot funkcije, ki ne spreminjajo stanja. Za ta namen se uporabljata ključni besedi view in pure. Funkcija view ne spreminja stanja, medtem ko funkcija pure dodatno zagotavlja, da ne bere spremenljivk stanja.
Pametne pogodbe v Solidity
Poleg standardnih tipov Solidity pozna tudi nekaj tipov, specializiranih za pametne pogodbe. Osnovni tip je address in mapira naslove Ethereum. Naslovi, ki so payable, lahko prejemajo prenose v Etherju. Za ta namen naslovi payable zagotavljajo metode balance() in transfer().
// 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);
}solidityNa podlagi tipa address obstaja tip contract kot osrednji jezikovni konstrukt. Pogodbe približno ustrezajo razredom v objektno usmerjenih programskih jezikih. Pogodbe tako združujejo podatke o stanju in funkcije ter jih ščitijo pred zunanjim svetom. Pogodbe podpirajo večkratno dedovanje, kot je znano iz Python ali C++.
Pogodbe se običajno začnejo s pragma vrstico, ki določa dovoljeno različico Solidity, ki ji sledi dejanska definicija:
// 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;
}
}solidityPametne pogodbe lahko opredeljujejo stanje podatkov in funkcije. Kot je znano iz C++ in Java, je v vsakem primeru mogoče opredeliti eno od treh ravni dostopa:
public: Do spremenljivke je mogoče dostopati z branjem in pisanjem iz pogodbe. Poleg tega se samodejno generira funkcijaviewkot getter za zunanji dostop za branje.internal: Spremenljivka je zaščitena pred zunanjim dostopom. Dostop za branje in pisanje je mogoč iz pogodbe kot tudi iz pogodb, ki jo podedujejo.private: kotinternal, vendar ni dostopa iz naslednjih pogodb
Funkcije lahko nadalje opišemo kot external. Funkcija external deluje kot del pogodbenega vmesnika in se uporablja za zunanji dostop. Funkcija receive za sprejemanje etra je dobro znan primer:
// Define without `function` keyword
receive() external payable {
// Handle Ether
}solidityModifikatorji v Solidity
Solidity ima zanimivo jezikovno konstrukcijo v obliki modifikatorjev, ki so podobni dekoratorjem v Pythonu. Podobno kot v Pythonu se modifikatorji v Solidity uporabljajo za spreminjanje klicanja funkcije. Pogosto se uporabljajo za zagotovitev, da je pred izvedbo funkcije izpolnjen določen pogoj:
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;
}
}solidityUpravljanje transakcij s Solidity
Solidity ima vgrajeno upravljanje transakcij. To se lahko uporabi za zagotovitev, da je prenos etherja bodisi popolnoma poravnan bodisi sploh ni poravnan. Jezik razume ključno besedo revert, ki sproži »roll-back« transakcije. S ključno besedo error lahko opredelite svoje lastne kodekse napak:
// 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
}
}solidityDrugi pogosto srečani vzorec je uporaba funkcije require(). To se lahko uporabi analogno kot revert:
// Using `require()` function
if (!condition) revert("Error message");
// Equivalent to
require(condition, "Error message");solidity