Ethereum blokcheynida aqlli kontraktlarni ishlab chiqish uchun yetakchi dasturlash tili boʻlgan Solidityni oʻrganing. Ushbu toʻliq qoʻllanma asosiy tushunchalardan tortib ilgʻor texnikalargacha hamma narsani qamrab oladi.
Solidity: Aqlli kontraktlarni dasturlash boʻyicha toʻliq qoʻllanma
Solidity - bu yuqori darajadagi, shartnomaga yo'naltirilgan dasturlash tili bo'lib, turli blokcheyn platformalarida, xususan Ethereumda aqlli kontraktlarni amalga oshirish uchun ishlatiladi. U C++, Python va JavaScript tillaridan katta ta'sirlangan, Ethereum Virtual Machine (EVM) ni maqsad qilgan holda ishlab chiqilgan. Ushbu qo'llanma Solidity haqida batafsil ma'lumot beradi, blokcheynni rivojlantirish dunyosiga kirishni istagan yangi boshlanuvchilar va tajribali dasturchilar uchun mos.
Aqlli kontraktlar nima?
Solidityga sho'ng'ishdan oldin, aqlli kontraktlar nima ekanligini tushunish muhim. Aqlli kontrakt - bu kelishuv shartlari to'g'ridan-to'g'ri kodga yozilgan o'z-o'zidan bajariladigan shartnoma. U blokcheynda saqlanadi va oldindan belgilangan shartlar bajarilganda avtomatik ravishda ishga tushadi. Aqlli kontraktlar turli xil ilovalarda avtomatlashtirish, shaffoflik va xavfsizlikni ta'minlaydi, jumladan:
- Markazlashtirilmagan moliya (DeFi): Kreditlash, qarz olish va savdo platformalari.
- Ta'minot zanjiri boshqaruvi: Tovarlarni kuzatish va shaffoflikni ta'minlash.
- Ovoz berish tizimlari: Xavfsiz va tekshiriladigan elektron ovoz berish.
- Ko'chmas mulk: Mulk bitimlarini avtomatlashtirish.
- Sog'liqni saqlash: Bemor ma'lumotlarini xavfsiz boshqarish.
Nega Solidity?
Solidity bir qator omillar tufayli Ethereum va boshqa EVM-ga mos blokcheynlarda aqlli kontraktlar yozish uchun dominant til hisoblanadi:
- EVM mosligi: Solidity aynan Ethereum Virtual Machine-da ishlay oladigan baytkodga kompilyatsiya qilish uchun mo'ljallangan.
- Jamiyatni qo'llab-quvvatlash: Katta va faol jamiyat keng hujjatlar, kutubxonalar va vositalarni taqdim etadi.
- Xavfsizlik xususiyatlari: Solidity umumiy aqlli shartnoma zaifliklarini kamaytirish xususiyatlarini o'z ichiga oladi.
- Yuqori darajadagi abstraksiya: Shartnoma ishlab chiqishni yanada samarali va boshqariladigan qiladigan yuqori darajadagi konstruksiyalarni taklif etadi.
Ishlab chiqish muhitingizni sozlash
Solidity bilan ishlab chiqishni boshlash uchun siz mos ishlab chiqish muhitini o'rnatishingiz kerak. Mana ba'zi mashhur variantlar:
Remix IDE
Remix - bu Solidity-ni o'rganish va sinab ko'rish uchun juda mos bo'lgan onlayn, brauzerga asoslangan IDE. U mahalliy o'rnatishni talab qilmaydi va quyidagi kabi xususiyatlarni taqdim etadi:
- Sintaksisni ajratib ko'rsatish va avtomatik to'ldirish bilan kod muharriri.
- Solidity kodini baytkodga aylantirish uchun kompilyator.
- Sinov tarmoqlariga yoki asosiy tarmoqqa kontraktlarni joylashtirish uchun deployer.
- Kod orqali o'tish va xatolarni aniqlash uchun disk raskadrovka.
Remix IDE-ga quyidagi manzilda kiring: https://remix.ethereum.org/
Truffle Suite
Truffle - bu aqlli kontraktlarni qurish, sinovdan o'tkazish va joylashtirish jarayonini soddalashtiradigan keng qamrovli ishlab chiqish ramkasi. U quyidagi kabi vositalarni taqdim etadi:
- Truffle: Loyihani yaratish, kompilyatsiya qilish, joylashtirish va sinovdan o'tkazish uchun buyruq qatori vositasi.
- Ganache: Mahalliy ishlab chiqish uchun shaxsiy blokcheyn.
- Drizzle: Aqlli kontraktlaringizni foydalanuvchi interfeyslari bilan integratsiyalashni osonlashtiradigan front-end kutubxonalari to'plami.
Truffleni o'rnatish uchun:
npm install -g truffle
Hardhat
Hardhat - bu moslashuvchanligi va kengaytirilishi bilan mashhur bo'lgan yana bir mashhur Ethereum ishlab chiqish muhiti. U Solidity kodingizni kompilyatsiya qilish, joylashtirish, sinovdan o'tkazish va disk raskadrovka qilish imkonini beradi. Asosiy xususiyatlariga quyidagilar kiradi:
- Sinov uchun o'rnatilgan mahalliy Ethereum tarmog'i.
- Funksionallikni kengaytirish uchun plagin ekotizimi.
- Console.log disk raskadrovka.
Hardhatni o'rnatish uchun:
npm install --save-dev hardhat
Solidity asoslari: Sintaksis va ma'lumotlar turlari
Keling, Solidity-dagi asosiy sintaksis va ma'lumotlar turlarini o'rganamiz.
Solidity kontraktining tuzilishi
Solidity kontraktdagi sinfga o'xshaydi. U holat o'zgaruvchilari, funktsiyalari va voqealardan iborat. Mana oddiy misol:
pragma solidity ^0.8.0;
contract SimpleStorage {
uint256 storedData;
function set(uint256 x) public {
storedData = x;
}
function get() public view returns (uint256) {
return storedData;
}
}
Tushuntirish:
pragma solidity ^0.8.0;
: Solidity kompilyator versiyasini belgilaydi. Kutilmagan xatti-harakatlarning oldini olish uchun mos versiyani ishlatish juda muhim.contract SimpleStorage { ... }
:SimpleStorage
nomli shartnomani belgilaydi.uint256 storedData;
:uint256
turidagi (256 bitli imzosiz butun son)storedData
nomli holat o'zgaruvchisini e'lon qiladi.function set(uint256 x) public { ... }
: Kiritish sifatida imzosiz butun sonni qabul qiladigan vastoredData
o'zgaruvchisini yangilaydiganset
nomli funktsiyani belgilaydi.public
kalit so'zi funktsiyani har kim chaqirishi mumkinligini anglatadi.function get() public view returns (uint256) { ... }
:storedData
qiymatini qaytaradiganget
nomli funktsiyani belgilaydi.view
kalit so'zi funktsiya shartnomaning holatini o'zgartirmasligini ko'rsatadi.
Ma'lumotlar turlari
Solidity turli xil ma'lumotlar turlarini qo'llab-quvvatlaydi:
- Butun sonlar:
uint
(imzosiz butun son) vaint
(imzoli butun son) turli o'lchamlar bilan (masalan,uint8
,uint256
). - Booleanlar:
bool
(true
yokifalse
). - Manzillar:
address
(Ethereum manzilini ifodalaydi). - Baytlar:
bytes
(qattiq o'lchamli bayt massivlari) vastring
(dinamik o'lchamli satr). - Massivlar: Qattiq o'lchamli (masalan,
uint[5]
) va dinamik o'lchamli (masalan,uint[]
). - Xaritalash: Kalit-qiymat juftliklari (masalan,
mapping(address => uint)
).
Misol:
pragma solidity ^0.8.0;
contract DataTypes {
uint256 public age = 30;
bool public isAdult = true;
address public owner = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
bytes32 public name = "JohnDoe";
uint[] public numbers = [1, 2, 3, 4, 5];
mapping(address => uint) public balances;
constructor() {
balances[msg.sender] = 100;
}
}
Holat o'zgaruvchilari va mahalliy o'zgaruvchilar
Holat o'zgaruvchilari funktsiyalardan tashqarida e'lon qilinadi va blokcheynda saqlanadi. Ular funktsiya chaqiruvlari va shartnoma bajarilishi davomida saqlanib qoladi. Yuqoridagi misolda storedData
holat o'zgaruvchisi hisoblanadi.
Mahalliy o'zgaruvchilar funktsiyalar ichida e'lon qilinadi va faqat shu funktsiya doirasida mavjud. Ular blokcheynda saqlanmaydi va funktsiya tugallanganda tashlab yuboriladi.
Solidity-dagi funktsiyalar
Funktsiyalar aqlli kontraktlarning asosiy qismlaridir. Ular shartnoma bajarishi mumkin bo'lgan mantiq va operatsiyalarni belgilaydi. Funktsiyalar quyidagilarni bajara oladi:
- Shartnomaning holatini o'zgartirish.
- Shartnomaning holatidan ma'lumotlarni o'qish.
- Boshqa kontraktlar bilan o'zaro aloqa qilish.
- Etherni yuborish yoki qabul qilish.
Funktsiya ko'rinishi
Solidity funktsiyalari to'rtta ko'rinish modifikatoriga ega:
- public: Ichki va tashqi tomondan chaqirilishi mumkin.
- private: Faqat shartnoma ichidan ichki tomondan chaqirilishi mumkin.
- internal: Shartnoma ichidan va undan olingan kontraktlardan ichki tomondan chaqirilishi mumkin.
- external: Faqat tashqi tomondan chaqirilishi mumkin.
Funktsiya modifikatorlari
Funktsiya modifikatorlari funktsiyaning xatti-harakatini o'zgartirish uchun ishlatiladi. Ular ko'pincha xavfsizlik cheklovlarini kuchaytirish yoki funktsiya mantiqini bajarishdan oldin tekshiruvlarni amalga oshirish uchun ishlatiladi.
Misol:
pragma solidity ^0.8.0;
contract Ownership {
address public owner;
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "Only owner can call this function");
_;
}
function transferOwnership(address newOwner) public onlyOwner {
owner = newOwner;
}
}
Ushbu misolda onlyOwner
modifikatori chaqiruvchi shartnomaning egasi ekanligini tekshiradi. Agar yo'q bo'lsa, u tranzaktsiyani qaytaradi. _
to'ldiruvchisi funktsiya kodining qolgan qismini ifodalaydi.
Funktsiya holatining o'zgaruvchanligi
Solidity funktsiyalari holat o'zgaruvchanligi modifikatorlariga ham ega bo'lishi mumkin:
- view: Funktsiya shartnomaning holatini o'zgartirmasligini ko'rsatadi. U holat o'zgaruvchilarini o'qishi mumkin, lekin ularga yozish mumkin emas.
- pure: Funktsiya shartnomaning holatini o'qimasligini yoki o'zgartirmasligini ko'rsatadi. U butunlay o'z-o'zidan va deterministikdir.
- payable: Funktsiya Etherni qabul qilishi mumkinligini ko'rsatadi.
Misol:
pragma solidity ^0.8.0;
contract Example {
uint256 public value;
function getValue() public view returns (uint256) {
return value;
}
function add(uint256 x) public pure returns (uint256) {
return x + 5;
}
function deposit() public payable {
value += msg.value;
}
}
Boshqaruv tuzilmalari
Solidity if
, else
, for
, while
va do-while
sikllari kabi standart boshqaruv tuzilmalarini qo'llab-quvvatlaydi.
Misol:
pragma solidity ^0.8.0;
contract ControlStructures {
function checkValue(uint256 x) public pure returns (string memory) {
if (x > 10) {
return "Value is greater than 10";
} else if (x < 10) {
return "Value is less than 10";
} else {
return "Value is equal to 10";
}
}
function sumArray(uint[] memory arr) public pure returns (uint256) {
uint256 sum = 0;
for (uint256 i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}
}
Voqealar va jurnalga yozish
Voqealar aqlli kontraktlarga tashqi dunyo bilan aloqa qilish imkonini beradi. Voqea chiqarilganda, u blokcheynning tranzaksiya jurnallarida saqlanadi. Ushbu jurnallarni shartnoma faoliyatini kuzatish uchun tashqi ilovalar kuzatishi mumkin.
Misol:
pragma solidity ^0.8.0;
contract EventExample {
event ValueChanged(address indexed caller, uint256 newValue);
uint256 public value;
function setValue(uint256 newValue) public {
value = newValue;
emit ValueChanged(msg.sender, newValue);
}
}
Ushbu misolda setValue
funktsiyasi chaqirilganda ValueChanged
voqeasi chiqariladi. caller
parametrida indexed
kalit so'zi tashqi ilovalarga voqealarni chaqiruvchining manziliga qarab filtrlash imkonini beradi.
Meros
Solidity merosni qo'llab-quvvatlaydi, bu sizga mavjud kontraktlar asosida yangi kontraktlar yaratish imkonini beradi. Bu kodni qayta ishlatish va modullikni rag'batlantiradi.
Misol:
pragma solidity ^0.8.0;
contract BaseContract {
uint256 public value;
function setValue(uint256 newValue) public {
value = newValue;
}
}
contract DerivedContract is BaseContract {
function incrementValue() public {
value++;
}
}
Ushbu misolda DerivedContract
BaseContract
dan meros bo'lib o'tadi. U value
holat o'zgaruvchisi va setValue
funktsiyasini meros qilib oladi. U o'zining incrementValue
funktsiyasini ham belgilaydi.
Kutubxonalar
Kutubxonalar kontraktlarga o'xshaydi, lekin ular ma'lumotlarni saqlay olmaydi. Ular bir nechta kontraktlar tomonidan chaqirilishi mumkin bo'lgan qayta ishlatiladigan kodni joylashtirish uchun ishlatiladi. Kutubxonalar faqat bir marta joylashtiriladi, bu gaz xarajatlarini kamaytiradi.
Misol:
pragma solidity ^0.8.0;
library Math {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
}
contract Example {
using Math for uint256;
uint256 public result;
function calculateSum(uint256 x, uint256 y) public {
result = x.add(y);
}
}
Ushbu misolda Math
kutubxonasi add
funktsiyasini belgilaydi. using Math for uint256;
bayonoti nuqta belgilashidan foydalanib uint256
o'zgaruvchilarida add
funktsiyasini chaqirishga imkon beradi.
Umumiy aqlli shartnoma zaifliklari
Aqlli kontraktlar mablag'larni yo'qotishga yoki kutilmagan xatti-harakatlarga olib kelishi mumkin bo'lgan turli xil zaifliklarga duchor bo'ladi. Ushbu zaifliklardan xabardor bo'lish va ularni kamaytirish uchun choralar ko'rish juda muhimdir.
Reentrancy
Reentrancy - bu shartnoma tashqi shartnomani chaqirganda va tashqi shartnoma asl shartnomaning bajarilishi tugallangunga qadar asl shartnomaga qayta chaqirganda sodir bo'ladi. Bu kutilmagan holat o'zgarishlariga olib kelishi mumkin.
Kamaytirish: Tekshiruvlar-Effektlar-O'zaro aloqalar naqshidan foydalaning va tashqi qo'ng'iroq uchun mavjud gazni cheklash uchun transfer
yoki send
funktsiyalaridan foydalanishni ko'rib chiqing.
Overflow va Underflow
Overflow - bu arifmetik operatsiya ma'lumotlar turining maksimal qiymatidan oshib ketganda sodir bo'ladi. Underflow - bu arifmetik operatsiya ma'lumotlar turining minimal qiymatidan kamroq qiymatga olib kelganda sodir bo'ladi.
Kamaytirish: Ushbu muammolarning oldini olish uchun SafeMath kutubxonalaridan foydalaning (garchi Solidity 0.8.0 va undan keyingi versiyalarida toshib ketish va kamayishni tekshirishlar sukut bo'yicha o'rnatilgan bo'lsa ham).
Vaqt tamg'asiga bog'liqlik
Blok vaqt tamg'asiga (block.timestamp
) tayanish sizning shartnomangizni konchilar tomonidan manipulyatsiyaga zaif qilishi mumkin, chunki ular vaqt tamg'asini ma'lum darajada nazorat qiladilar.
Kamaytirish: Muhim mantiq uchun block.timestamp
dan foydalanishdan saqlaning. Vaqtning ishonchliroq manbalari sifatida orakullardan yoki boshqa manbalardan foydalanishni ko'rib chiqing.
Xizmatdan voz kechish (DoS)
DoS hujumlari qonuniy foydalanuvchilar tomonidan shartnomani ishlatib bo'lmaydigan qilishga qaratilgan. Bunga barcha mavjud gazni sarflash yoki shartnomaning qaytarilishiga olib keladigan zaifliklardan foydalanish orqali erishish mumkin.
Kamaytirish: Gaz chegaralarini amalga oshiring, chegaralanmagan iteratsiyali sikllardan saqlaning va foydalanuvchi kiritishlarini diqqat bilan tekshiring.
Front Running
Front running - bu kimdir kutilayotgan tranzaksiyani kuzatib borishi va asl tranzaksiyadan oldin bajarilishi uchun o'z tranzaksiyasini yuqori gaz narxi bilan taqdim etganda sodir bo'ladi.
Kamaytirish: Tranzaksiya tafsilotlarini ular bajarilgandan keyingacha yashirish uchun majburiyatlarni ochish sxemalaridan yoki boshqa usullardan foydalaning.
Xavfsiz aqlli kontraktlar yozish uchun eng yaxshi amaliyotlar
- Oddiy qilib qo'ying: Ixcham va tushunarli kod yozing.
- Tekshiruvlar-Effektlar-O'zaro aloqalar naqshiga amal qiling: Har qanday holat o'zgarishlari amalga oshirilishidan oldin tekshiruvlar o'tkazilishini va boshqa kontraktlar bilan o'zaro aloqalar oxirida amalga oshirilishini ta'minlang.
- Xavfsizlik vositalaridan foydalaning: Potentsial zaifliklarni aniqlash uchun Slither va Mythril kabi statik tahlil vositalaridan foydalaning.
- Birlik testlarini yozing: Aqlli kontraktlaringiz kutilganidek ishlayotganiga ishonch hosil qilish uchun ularni to'liq sinovdan o'tkazing.
- Auditdan o'ting: Ularni asosiy tarmoqqa joylashtirishdan oldin, aqlli kontraktlaringizni obro'li xavfsizlik firmalari tomonidan auditdan o'tkazing.
- Doimo yangilanib turing: Solidity jamiyatidagi so'nggi xavfsizlik zaifliklari va eng yaxshi amaliyotlardan xabardor bo'ling.
Ilg'or Solidity tushunchalari
Asoslarni yaxshi tushunganingizdan so'ng, siz yanada ilg'or tushunchalarni o'rganishingiz mumkin:
Assembly
Solidity sizga EVM ustidan ko'proq nazorat beradigan inline assembly kodini yozishga imkon beradi. Biroq, bu xatolarni va zaifliklarni kiritish xavfini ham oshiradi.
Proxylar
Proxylar sizga ma'lumotlarni ko'chirmasdan aqlli kontraktlaringizni yangilash imkonini beradi. Bu qo'ng'iroqlarni amalga oshirish shartnomasiga yo'naltiradigan proksi-shartnomani joylashtirishni o'z ichiga oladi. Shartnomani yangilashni xohlaganingizda, siz shunchaki yangi amalga oshirish shartnomasini joylashtirasiz va proksini yangi amalga oshirishga ishora qilish uchun yangilaysiz.
Meta-tranzaksiyalar
Meta-tranzaksiyalar foydalanuvchilarga gaz to'lovlarini to'g'ridan-to'g'ri to'lamasdan aqlli shartnomangiz bilan o'zaro aloqa qilish imkonini beradi. Buning o'rniga, relayer ularning nomidan gaz to'lovlarini to'laydi. Bu foydalanuvchi tajribasini yaxshilashi mumkin, ayniqsa blokcheyn bilan yangi tanish bo'lgan foydalanuvchilar uchun.
EIP-721 va EIP-1155 (NFTlar)
Solidity odatda EIP-721 va EIP-1155 kabi standartlardan foydalangan holda almashmaydigan tokenlarni (NFTlar) yaratish uchun ishlatiladi. Ushbu standartlarni tushunish NFTga asoslangan ilovalarni qurish uchun juda muhimdir.
Solidity va Blokcheyn kelajagi
Solidity blokcheyn texnologiyasining jadal rivojlanayotgan landshaftida muhim rol o'ynaydi. Blokcheynni qabul qilish o'sishda davom etar ekan, innovatsion va xavfsiz markazlashtirilmagan ilovalarni yaratish uchun Solidity ishlab chiquvchilarga talab yuqori bo'ladi. Til doimiy ravishda yangilanib va yaxshilanib boradi, shuning uchun ushbu sohada muvaffaqiyatga erishish uchun so'nggi o'zgarishlardan xabardor bo'lish muhimdir.
Xulosa
Solidity - bu Ethereum blokcheynida aqlli kontraktlarni yaratish uchun kuchli va ko'p qirrali til. Ushbu qo'llanma Solidity haqida asosiy tushunchalardan tortib ilg'or texnikalargacha keng qamrovli ma'lumot berdi. Solidityni o'zlashtirib va xavfsiz ishlab chiqish uchun eng yaxshi amaliyotlarga rioya qilgan holda, siz markazlashtirilmagan ilovalarning qiziqarli dunyosiga hissa qo'shishingiz va blokcheyn texnologiyasining kelajagini shakllantirishga yordam berishingiz mumkin. Har doim xavfsizlikni birinchi o'ringa qo'yishni, kodingizni to'liq sinovdan o'tkazishni va Solidity ekotizimidagi so'nggi o'zgarishlardan xabardor bo'lishni unutmang. Aqlli kontraktlarning potentsiali ulkan va Solidity bilan siz o'z innovatsion g'oyalaringizni amalga oshirishingiz mumkin.