Limbaje pentru de contracte inteligente
Un aspect important despre Ethereum este că poți programa contractele inteligente folosind limbaje relativ prietenoase cu programatorii. Dacă ai experiență în Python sau JavaScript, poți găsi un limbaj cu sintaxă familiară.
Cele mai active și suportate două limbaje sunt:
- Solidity
- Vyper
De asemenea, programatorii mai experimentați ar putea dori să utilizeze Yul, un limbaj intermediar pentru Mașina virtuală Ethereum sau Yul +, o extensie pentru Yul.
Condiții prealabile
Cunoașterea anterioară a limbajelor de programare, în special JavaScript sau Python, te poate ajuta să înțelegi diferențele în limbajele contractelor inteligente. De asemenea, îți recomandăm să înțelegeți conceptul de bază al contractelor inteligente înainte de a analiza mai atent diferențele dintre limbajele contractelor inteligente. Introducere în contracte inteligente.
Solidity
- Influențat de C ++, Python și JavaScript.
- Tip static (tipul unei variabile este cunoscut în momentul compilării).
- Susține:
- Moștenire (poți prelungi alte contracte).
- Biblioteci (poți crea cod reutilizabil pe care îl poți apela din diferite contracte inteligente – cum ar fi în funcțiile statice dintr-o clasă statică în alte limbaje de programare orientate pe obiecte).
- Tipuri complexe definite de utilizator.
Linkuri importante
- Documentație
- Portalul limbajului Solidity
- Solidity prin exemple
- GitHub
- Cameră de chat Solidity Gitter
- Foaie de notițe
- Bloc Solidity
Exemplu de contract
1// SPDX-Licență-Identificare: GPL-3.02pragma solidity >= 0.7.0;34contract Coin {5 // Cuvântul cheie „public” face variabilele6 // accesibile din alte contracte7 address public minter;8 mapping (address => uint) public balances;910 // Evenimentele permit clienților să reacționeze la anumite11 // modificări ale contractului pe care le declari12 event Sent(address from, address to, uint amount);1314 // Codul constructor se execută numai când contractul15 // este creeat16 constructor() {17 minter = msg.sender;18 }1920 // Trimite o sumă de monede nou create la o adresă21 // Poate fi apelat numai de către creatorul contractului22 function mint(address receiver, uint amount) public {23 require(msg.sender == minter);24 require(amount < 1e60);25 balances[receiver] += amount;26 }2728 // Trimite o cantitate de monede existente29 // de la orice apelant la o adresă30 function send(address receiver, uint amount) public {31 require(amount <= balances[msg.sender], "Balanță insuficientă.");32 balances[msg.sender] -= amount;33 balances[receiver] += amount;34 emit Sent(msg.sender, receiver, amount);35 }36}37Afișează totCopiere
Acest exemplu ar trebui să-ți dea o idee despre sintaxa contractului Solidity. Pentru o descriere mai detaliată a funcțiilor și variabilelor, consultă documentele.
Vyper
- Limbaj de programare Pythonic
- Tip puternic
- Cod de compilator mic și ușor de înțeles
- În mod deliberat are mai puține caracteristici decât Solidity, cu scopul de a face contractele mai sigure și mai ușor de auditat. Vyper nu acceptă:
- Modificatori
- Moștenire
- Asamblare în linie
- Supraîncărcarea funcției
- Supraîncărcarea operatorului
- Apel recursiv
- Bucle cu lungime infinită
- Puncte fixe binare
Pentru mai multe informații, citește raționamentul Vyper.
Linkuri importante
- Documentație
- Vyper prin exemplu
- GitHub
- Cameră de chat Vyper Gitter
- Foaie de notițe
- Actualizare 8 ianuarie 2020
Exemplu
1# Deschide licitația23# Parametri de licitație4# Beneficiarul primește bani de la cel mai mare ofertant5beneficiary: public(address)6auctionStart: public(uint256)7auctionEnd: public(uint256)89# Starea actuală a licitației10highestBidder: public(address)11highestBid: public(uint256)1213# Setat la „true” la sfârșit, interzice orice modificare14ended: public(bool)1516# Ține evidența ofertelor rambursate, astfel încât să putem urma modelul de retragere17pendingReturns: public(HashMap[address, uint256])1819# Creează o licitație simplă cu `_bidding_time`20# în secunde în numele21# beneficiarului adresei `_beneficiary`.22@external23def __init__(_beneficiary: address, _bidding_time: uint256):24 self.beneficiary = _beneficiary25 self.auctionStart = block.timestamp26 self.auctionEnd = self.auctionStart + _bidding_time2728# Licitează la licitație cu valoarea trimisă29# împreună cu această tranzacție.30# Valoarea va fi rambursată numai dacă31# licitația nu este câștigată.32@external33@payable34def bid():35 # Verifică dacă perioada de licitare a trecut.36 assert block.timestamp < self.auctionEnd37 # Verifică dacă suma licitată este suficient de mare38 assert msg.value > self.highestBid39 # Urmărește rambursarea pentru cel mai înalt ofertant anterior40 self.pendingReturns[self.highestBidder] += self.highestBid41 # Urmărește o nouă ofertă ridicată42 self.highestBidder = msg.sender43 self.highestBid = msg.value4445# Retrage o ofertă rambursată anterior. Modelul de retragere este46# folosit aici pentru a evita o problemă de securitate. Dacă rambursările au fost direct47# trimise ca parte a ofertei „bid()", un contract de licitare rău intenționat ar putea bloca48# aceste rambursări și astfel bloca intrarea noilor sume mai mari licitate.49@external50def withdraw():51 pending_amount: uint256 = self.pendingReturns[msg.sender]52 self.pendingReturns[msg.sender] = 053 send(msg.sender, pending_amount)5455# Încheie licitația și trimiteți cea mai mare ofertă56# către beneficiar.57@external58def endAuction():59 # Un bun sfat ar fi să structurezi funcțiile care interacționează60 # cu alte contracte (adică apelează funcții sau trimit Eter)61 # în trei faze:62 # 1. verificarea condițiilor63 # 2. efectuarea de acțiuni (condiții potențial schimbătoare)64 # 3. interacționarea cu alte contracte65 # Dacă aceste faze sunt amestecate, celălalt contract ar putea apela66 # înapoi contractul actual și modifica starea sau cauza67 # efecte ca (plata eterului) care s-ar face de mai multe ori.68 # Dacă funcțiile numite „internaly” includ interacțiunea cu contracte69 # externe, trebuie de asemenea să fie considerate interacțiuni cu70 # contractele externe.7172 # 1. Condiții73 # Verifică dacă a fost atinsă ora de încheiere a licitației74 assert block.timestamp >= self.auctionEnd75 # Verifică dacă această funcție a fost deja chemată76 assert not self.ended7778 # 2. Efecte79 self.ended = True8081 # 3. Interacțiune82 send(self.beneficiary, self.highestBid)83Afișează totCopiere
Acest exemplu ar trebui să vă dea o idee despre sintaxa contractului Vyper. Pentru o descriere mai detaliată a funcțiilor și variabilelor, vezi documentele.
Yul și Yul+
Dacă ești nou în Ethereum și încă nu ai scris cod cu limbaje de contracte inteligente, îți recomandăm să începi cu Solidity sau Vyper. Încearcă Yul sau Yul + numai după ce ești familiarizat cu cele mai bune practici de securitate a contractelor inteligente și cu specificul de lucru cu EVM.
Yul
- Limbaj intermediar pentru Ethereum.
- Suportă EVM și eWASM, un WebAssembly cu arome de Ethereum, și este conceput să fie un numitor comun utilizabil al ambelor platforme.
- O țintă bună pentru etapele de optimizare la nivel înalt, cu avantaje atât pentru platformele EVM, cât și pentru platformele eWASM.
Yul+
- O extensie de nivel scăzut, extrem de eficientă pentru Yul.
- Conceput inițial pentru un contract optimistic rollup.
- Yul + poate fi privit ca o propunere experimentală de upgrade la Yul, adăugând noi caracteristici.
Linkuri importante
Exemplu de contract
Următorul exemplu simplu implementează o funcție de ridicare la putere. Poate fi compilat folosind solc --strict-assembly --bin input.yul
. Exemplul ar trebui să fie stocate în fișierul input.yul.
1{2 function power(base, exponent) -> result3 {4 switch exponent5 case 0 { result := 1 }6 case 1 { result := base }7 default8 {9 result := power(mul(base, base), div(exponent, 2))10 if mod(exponent, 2) { result := mul(base, result) }11 }12 }13 let res := power(calldataload(0), calldataload(32))14 mstore(0, res)15 return(0, 32)16}17Afișează tot
Dacă ai deja o experiență bună în ceea ce privește contractele inteligente, poți găsi o implementare completă ERC20 în Yul aici.
Cum să alegi
La fel ca în orice alt limbaj de programare, este vorba atât de alegerea unui instrument potrivit la locul de muncă potrivit, cât și de preferințele personale.
Iată câteva lucruri de luat în considerare, dacă nu ai încercat încă niciun limbaj:
Ce este excelent la Solidity?
- Dacă ești începător, există multe tutoriale și instrumente de învățare. Află mai multe informații despre aceasta în secțiunea Învață prin codificare.
- Sunt disponibile instrumente bune pentru programatori.
- Solidity are o comunitate mare de programatori, ceea ce înseamnă că cel mai probabil vei găsi răspunsuri la întrebările tale destul de repede.
Ce este excelent la Vyper?
- O modalitate excelentă de a începe pentru programatorii Python care doresc să scrie contracte inteligente.
- Vyper are un număr mai mic de caracteristici, ceea ce îl face excelent pentru crearea unor idei de prototip.
- Vyper își propune să fie ușor de auditat și extrem de ușor de citit de oameni.
Ce este grozav la Yul și Yul+?
- Limbaj simplist și funcțional la nivel scăzut.
- Permite o apropie mai bună de EVM-ul brut, ceea ce poate ajuta la optimizarea consumului de gaz din contractele tale.
Comparații între limbaje
Pentru comparații ale sintaxei de bază, ciclul de viață al contractului, interfețe, operatori, structuri de date, funcții, flux de control și multe altele, consultă această foaie de cheat de Auditless