Ajută la actualizarea acestei pagini

🌏

Există o nouă versiune a acestei pagini, dar acum este doar în engleză. Ajută-ne să traducem cea mai recentă versiune.

Această pagină este incompletă. Dacă ești expert în acest subiect, te rugăm să editezi această pagină și s-o presari cu înțelepciune.

Limbaje pentru de contracte inteligente

Ultima editare: , Invalid DateTime
Edit page

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.

Exemplu de contract

1// SPDX-Licență-Identificare: GPL-3.0
2pragma solidity >= 0.7.0;
3
4contract Coin {
5 // Cuvântul cheie „public” face variabilele
6 // accesibile din alte contracte
7 address public minter;
8 mapping (address => uint) public balances;
9
10 // Evenimentele permit clienților să reacționeze la anumite
11 // modificări ale contractului pe care le declari
12 event Sent(address from, address to, uint amount);
13
14 // Codul constructor se execută numai când contractul
15 // este creeat
16 constructor() {
17 minter = msg.sender;
18 }
19
20 // Trimite o sumă de monede nou create la o adresă
21 // Poate fi apelat numai de către creatorul contractului
22 function mint(address receiver, uint amount) public {
23 require(msg.sender == minter);
24 require(amount < 1e60);
25 balances[receiver] += amount;
26 }
27
28 // Trimite o cantitate de monede existente
29 // 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}
37
Afișează tot
📋 Copiere

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.

Exemplu

1# Deschide licitația
2
3# Parametri de licitație
4# Beneficiarul primește bani de la cel mai mare ofertant
5beneficiary: public(address)
6auctionStart: public(uint256)
7auctionEnd: public(uint256)
8
9# Starea actuală a licitației
10highestBidder: public(address)
11highestBid: public(uint256)
12
13# Setat la „true” la sfârșit, interzice orice modificare
14ended: public(bool)
15
16# Ține evidența ofertelor rambursate, astfel încât să putem urma modelul de retragere
17pendingReturns: public(HashMap[address, uint256])
18
19# Creează o licitație simplă cu `_bidding_time`
20# în secunde în numele
21# beneficiarului adresei `_beneficiary`.
22@external
23def __init__(_beneficiary: address, _bidding_time: uint256):
24 self.beneficiary = _beneficiary
25 self.auctionStart = block.timestamp
26 self.auctionEnd = self.auctionStart + _bidding_time
27
28# 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@external
33@payable
34def bid():
35 # Verifică dacă perioada de licitare a trecut.
36 assert block.timestamp < self.auctionEnd
37 # Verifică dacă suma licitată este suficient de mare
38 assert msg.value > self.highestBid
39 # Urmărește rambursarea pentru cel mai înalt ofertant anterior
40 self.pendingReturns[self.highestBidder] += self.highestBid
41 # Urmărește o nouă ofertă ridicată
42 self.highestBidder = msg.sender
43 self.highestBid = msg.value
44
45# Retrage o ofertă rambursată anterior. Modelul de retragere este
46# folosit aici pentru a evita o problemă de securitate. Dacă rambursările au fost direct
47# trimise ca parte a ofertei „bid()", un contract de licitare rău intenționat ar putea bloca
48# aceste rambursări și astfel bloca intrarea noilor sume mai mari licitate.
49@external
50def withdraw():
51 pending_amount: uint256 = self.pendingReturns[msg.sender]
52 self.pendingReturns[msg.sender] = 0
53 send(msg.sender, pending_amount)
54
55# Încheie licitația și trimiteți cea mai mare ofertă
56# către beneficiar.
57@external
58def 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țiilor
63 # 2. efectuarea de acțiuni (condiții potențial schimbătoare)
64 # 3. interacționarea cu alte contracte
65 # Dacă aceste faze sunt amestecate, celălalt contract ar putea apela
66 # înapoi contractul actual și modifica starea sau cauza
67 # efecte ca (plata eterului) care s-ar face de mai multe ori.
68 # Dacă funcțiile numite „internaly” includ interacțiunea cu contracte
69 # externe, trebuie de asemenea să fie considerate interacțiuni cu
70 # contractele externe.
71
72 # 1. Condiții
73 # Verifică dacă a fost atinsă ora de încheiere a licitației
74 assert block.timestamp >= self.auctionEnd
75 # Verifică dacă această funcție a fost deja chemată
76 assert not self.ended
77
78 # 2. Efecte
79 self.ended = True
80
81 # 3. Interacțiune
82 send(self.beneficiary, self.highestBid)
83
Afișează tot
📋 Copiere

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.

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) -> result
3 {
4 switch exponent
5 case 0 { result := 1 }
6 case 1 { result := base }
7 default
8 {
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}
17
Afiș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

Referințe suplimentare