O'zbek

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:

Nega Solidity?

Solidity bir qator omillar tufayli Ethereum va boshqa EVM-ga mos blokcheynlarda aqlli kontraktlar yozish uchun dominant til hisoblanadi:

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:

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:

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:

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:

Ma'lumotlar turlari

Solidity turli xil ma'lumotlar turlarini qo'llab-quvvatlaydi:

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:

Funktsiya ko'rinishi

Solidity funktsiyalari to'rtta ko'rinish modifikatoriga ega:

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:

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

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.