Okosszerződés nyelvek
Utolsó módosítás: @Satglow(opens in a new tab), 2024. június 17.
Az Ethereum egyik kiváló jellemzője, hogy az okosszerződéseket viszonylag fejlesztőbarát nyelveken lehet programozni. Ha Ön járatos a Pythonban vagy bármilyen kerek zárójeles nyelvben(opens in a new tab), akkor találhat olyan nyelvet, melynek a szintaxisa ismerős lesz.
A két legaktívabb és leginkább karbantartott nyelv:
- Solidity
- Vyper
A tapasztaltabb fejlesztők kipróbálhatják a Yul nyelvet, mely egy haladó nyelv az Ethereum virtuális gépre, vagy ennek kiterjesztését, melynek neve Yul+.
Amennyiben Ön kíváncsi típus, és szeret olyan új nyelvek tesztelésében segíteni, amelyek még komoly fejlesztés előtt állnak, akkor fedezze fel a Fe-t, egy kialakulóban lévő okosszerződésnyelvet, amely még gyerekcipőben jár.
Előfeltételek
A programozási nyelvek, különösen a JavaScript vagy a Python korábbi ismerete segíthet az okosszerződés nyelvekben mutatkozó különbségek értelmezésében. Javasoljuk, hogy először értse meg az okosszerződést, mint koncepciót, mielőtt túl mélyre ásna a nyelvi összehasonlításokban. Bevezetés az okosszerződésekbe.
Solidity
- Objektumorientált, magas szintű nyelv az okosszerződések telepítésére.
- Kerek zárójeles nyelv, amelyet a leginkább a C++ befolyásolt.
- Statikusan típusos (a változó típusa ismert az átfordítási időben).
- A következőket támogatja:
- Öröklődés (kiterjeszthet más szerződéseket).
- Könyvtárak (újrafelhasználható kódot írhat, melyet meghívhat különböző szerződésekből – mint a statikus függvényeket statikus osztályokban más objektumorientált programozási nyelveken).
- Komplex, felhasználó által definiált típusok.
Fontos linkek
- Dokumentáció(opens in a new tab)
- Solidity Nyelvportál(opens in a new tab)
- Solidity példák alapján(opens in a new tab)
- GitHub(opens in a new tab)
- Solidity Gitter Chatroom(opens in a new tab) összekötve a Solidity Matrix Chatroom(opens in a new tab)-mal
- Puska(opens in a new tab)
- Solidity Blog(opens in a new tab)
- Solidity Twitter(opens in a new tab)
Példaszerződés
1// SPDX-License-Identifier: GPL-3.02pragma solidity >= 0.7.0;34contract Coin {5 // A "public" kulcsszó a változókat6 // elérhetővé teszi más szerződések számára7 address public minter;8 mapping (address => uint) public balances;910 // Az események lehetővé teszik, hogy a kliensek11 // általad deklarált szerződés változásokra reagáljanak12 event Sent(address from, address to, uint amount);1314 // A konstruktor csak a szerződés létrehozásakor15 // fut le16 constructor() {17 minter = msg.sender;18 }1920 // Az újonnan létrehozott tokeneket elküldi egy címre21 // Csak a szerződés létrehozó hívhatja meg22 function mint(address receiver, uint amount) public {23 require(msg.sender == minter);24 require(amount < 1e60);25 balances[receiver] += amount;26 }2728 // Elküld valamennyi létező tokent29 // bármely hívótól egy címre30 function send(address receiver, uint amount) public {31 require(amount <= balances[msg.sender], "Insufficient balance.");32 balances[msg.sender] -= amount;33 balances[receiver] += amount;34 emit Sent(msg.sender, receiver, amount);35 }36}Összes megjelenítéseMásolás
Ez a példa azt mutathatja meg Önnek, hogyan néz ki a Solidity szerződés szintaxisa. A függvények és a változók részletesebb leírásáért tekintse meg a dokumentációt(opens in a new tab).
Vyper
- Pythonikus programozási nyelv
- Erősen típusos
- Kicsi és érthető fordító kód
- Hatékony bájtkód-generálás
- Szándékosan kevesebb elemmel rendelkezik, mint a Solidity, azzal a céllal, hogy a szerződések biztonságosabbak és könnyebben auditálhatóak legyenek. A Vyper nem támogatja a következőket:
- Módosítókat (modifier)
- Öröklést
- Soron belüli assembly
- Függvénytúlterhelés
- Operátortúlterhelés
- Rekurzív hívás
- Végtelen hosszú ciklusok
- Bináris fix pontok
További információkért tekintse meg a Vyper magyarázatát(opens in a new tab).
Fontos linkek
- Dokumentáció(opens in a new tab)
- Vyper példa alapján(opens in a new tab)
- Még több Vyper példák alapján(opens in a new tab)
- GitHub(opens in a new tab)
- A Vyper-közösség Discord-csevegése(opens in a new tab)
- Puska(opens in a new tab)
- Okosszerződés-fejlesztési keretrendszerek és eszközök Vyperre
- VyperPunk – tanulja meg a Vyper okosszerződéseket biztosítását és meghackelését(opens in a new tab)
- VyperExamples – Példák a Vyper sebezhetőségére(opens in a new tab)
- Vyper Hub fejlesztéshez(opens in a new tab)
- Példák a Vyper legjobb okosszerződéseire(opens in a new tab)
- A Vyper által gondozott kiváló források(opens in a new tab)
Példa
1# Nyílt Aukció23# Aukció paraméterek4# A kedvezményezett pénzt kap a legnagyobb licitálótól5beneficiary: public(address)6auctionStart: public(uint256)7auctionEnd: public(uint256)89# Az aukció jelenlegi állapota10highestBidder: public(address)11highestBid: public(uint256)1213# Legyen igaz a végén, bármely változást elutasít14ended: public(bool)1516# Számontartja a visszafizetett liciteket, így követni tudjuk a kiutalási mintát17pendingReturns: public(HashMap[address, uint256])1819# Egy egyszerű aukció létrehozása `_bidding_time`20# másodpercnyi licit idővel a kedvezményezett cím21# `_beneficiary` nevében.22@external23def __init__(_beneficiary: address, _bidding_time: uint256):24 self.beneficiary = _beneficiary25 self.auctionStart = block.timestamp26 self.auctionEnd = self.auctionStart + _bidding_time2728# Licitálás az aukción29# a tranzakcióval küldött értékkel.30# Az érték csak akkor kerül visszautalásra31# ha az aukció nincs megnyerve.32@external33@payable34def bid():35 # Ellenőrzi, hogy a licit idő véget ért-e már.36 assert block.timestamp < self.auctionEnd37 # Ellenőrzi, hogy elég magas-e a licit38 assert msg.value > self.highestBid39 # Nyomonköveti az előző legmagasabb licit visszatérítését40 self.pendingReturns[self.highestBidder] += self.highestBid41 # Nyomonköveti a legmagasabb licitet42 self.highestBidder = msg.sender43 self.highestBid = msg.value4445# Kiutalja az előzőleg visszatérített licitet. A kiutalási mintát használjuk itt,46# hogy elkerüljünk egy biztonsági rést. Ha a visszatérítés közvetlenül47# a bid() része lenne, egy ártalmas licit szerződés blokkolhatná48# ezeket a visszatérítéseket, így blokkolná a magasabb bejövő liciteket.49@external50def withdraw():51 pending_amount: uint256 = self.pendingReturns[msg.sender]52 self.pendingReturns[msg.sender] = 053 send(msg.sender, pending_amount)5455# Vége az aukciónak és elküldi a legmagasabb licitet56# a kedvezményezettnek.57@external58def endAuction():59 # It is a good guideline to structure functions that interact60 # with other contracts (i.e. they call functions or send ether)61 # into three phases:62 # 1. feltételek ellenőrzése63 # 2. akció végrehajtás (potenciálisan megváltoztatja a feltételeket)64 # 3. interakció más szerződésekkel65 # Ha ezt a sorrendet felcseréljük, akkor más szerződés visszahívhat66 # a jelenlegi szerződésbe és módosíthatja az állapotot vagy67 # többszörösen elvégzett műveletet eredményezhet (ether kifizetés).68 # Ha a belsőleg meghívott függvény külső szerződéssel történő69 # interakciót tartalmaz, akkor azokat is külső szerződéssel történő70 # interakcióként kell kezelni.7172 # 1. Feltételek73 # Ellenőrzi, hogy elértük-e az aukció végét74 assert block.timestamp >= self.auctionEnd75 # Ellenőrzi, hogy függvény meg lett-e már hívva76 assert not self.ended7778 # 2. Hatások79 self.ended = True8081 # 3. Interakció82 send(self.beneficiary, self.highestBid)Összes megjelenítéseMásolás
Ez a példa megmutathatja Önnek, hogyan néz ki a Vyper szerződés szintaxisa. A függvények és a változók részletesebb leírásáért tekintse meg a dokumentációt(opens in a new tab).
Yul és Yul+
Ha Önnek új az Ethereum és nem programozott okosszerződésnyelveken, akkor azt javasoljuk, hogy kezdjen először a Solidity-vel és a Vyperrel. Csak akkor kezdjen bele a Yul vagy Yul+ nyelvekbe, ha már ismeri az okosszerződésre vonatkozó biztonsági gyakorlatokat és az EVM-mel kapcsolatos munka részleteit.
Yul
- Haladó nyelv Ethereumra.
- Támogatja az EVM-et és az Ewasm-ot(opens in a new tab), amely egy Ethereummal fűszerezett WebAssembly, és amelyet a két platform közös nevezőjének terveztek.
- Jó cél a magas szintű optimizációs szinteknek, melyek az EVM és Ewasm platformokból egyaránt tudnak profitálni.
Yul+
- A Yul alacsony szintű, nagy hatékonyságú kiterjesztése.
- Eredetileg az optimista összesítéses szerződésként fejlesztették ki.
- A Yul+ egy kísérleti fejlesztési javaslatként is tekinthető, melyhez új funkciók tartoznak.
Fontos linkek
- Yul Dokumentáció(opens in a new tab)
- Yul+ Dokumentáció(opens in a new tab)
- Yul+ Játszótér(opens in a new tab)
- Yul+ Bevezető poszt(opens in a new tab)
Példa szerződés
Az alábbi egyszerű példa egy hatványfüggvényt implementál. A solc --strict-assembly --bin input.yul
használatával lehet befordítani. Ezt a példát az input.yul fájlnak kell tartalmaznia.
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}Összes megjelenítése
Ha már nagy tapasztalatra tett szert az okosszerződésekkel kapcsolatban, akkor a teljes ERC20 implementáció Yul-ban itt érhető el(opens in a new tab).
Fe
- Statikusan típusos nyelv az Ethereum virtuális géphez (EVM).
- A Python és a Rust inspirálta.
- Lényege, hogy könnyen tanulható, még azoknak a fejlesztőknek is, akiknek új az Ethereum ökoszisztémája.
- A Fe fejlesztése még nagyon korai szakaszban tart, az alfa kiadása 2021. januárban történt.
Fontos linkek
- GitHub(opens in a new tab)
- Fe bejelentés(opens in a new tab)
- Fe 2021-es ütemterv(opens in a new tab)
- Fe Discord-csevegés(opens in a new tab)
- Fe Twitter(opens in a new tab)
Példaszerződés
Ez a példa egy egyszerű szerződés Fe nyelven telepítve.
1type BookMsg = bytes[100]23contract GuestBook:4 pub guest_book: map<address, BookMsg>56 event Signed:7 book_msg: BookMsg89 pub def sign(book_msg: BookMsg):10 self.guest_book[msg.sender] = book_msg1112 emit Signed(book_msg=book_msg)1314 pub def get_msg(addr: address) -> BookMsg:15 return self.guest_book[addr].to_mem()16Összes megjelenítése
Hogyan válasszunk
Mint minden más programozási nyelvnél, itt is leginkább a megfelelő eszköz kiválasztása a megfelelő munkához, valamint a személyes preferenciák döntenek.
Íme néhány szempont, amelyet érdemes figyelembe venni, ha még nem próbálta egyik nyelvet sem:
Mi a jó a Solidity-ben?
- A kezdőknek sok útmutató és tanulási anyag áll rendelkezésükre. További anyagért látogasson el a Tanulás kódolással című részhez.
- Remek fejlesztői eszközök érhetők el.
- A Solidity-nek kiterjedt a fejlesztői közössége, ami azt jelenti, hogy nagy valószínűséggel gyorsan választ kap a kérdéseire.
Mi a jó a Vyperben?
- Nagyszerű módszer a Python fejlesztők számára az első okosszerződések megírására.
- A Vyper kevesebb funkcióval rendelkezik, így kiválóan alkalmas arra, hogy az ötleteiből gyorsan prototípust készítsen.
- A Vyper célja, hogy könnyen auditálható és az emberek számára olvasható legyen.
Mi a jó a Yul és a Yul+ nyelvekben?
- Egyszerűsített és funkcionális alacsony szintű nyelv.
- Közelebb enged a nyers EVM-hez, így Ön könnyebben tudja a szerződések gázfelhasználását optimalizálni.
Nyelv-összehasonlítások
Az alapvető szintaxis, szerződés-életciklus, interfészek, operátorok, adatszerkezetek, függvények, control flow és további szempontok alapján történő összehasonlításért olvassa el a Puska az Auditless-től(opens in a new tab) című cikket