Волшебный мир Web 3.0 — это земля, полная сюрпризов, инноваций и идей. Обнаруженный в 2008 году, теперь это утопия для всех интернет-волшебников, ученых, исследователей и др. Многие династии внесли свой вклад в создание этой утопии. Он разработал все желаемые функции и функции в течение определенного периода времени и в настоящее время развивается очень быстрыми темпами. Сатоши Накамото был волшебником, который основал самую первую династию в этом неизведанном регионе. Заклинания Биткойн открывают ворота для инноваций и новых возможностей. Это позволило людям использовать его в качестве одноранговой денежной системы или того, что мы все обычно называем криптовалютой. Но сил и предложений династии Биткойн было недостаточно для выполнения всех действий. Одной из таких династий, купивших парадигму в этом мире, была династия Эфириума. Виталик Бутерин был исследователем династии Биткойн, он выявил недостатки и предложил создать династию Эфириума, которая могла бы позволить разнообразную деятельность, а не ограничиваться только криптовалютой. Волшебник по имени Гэвин Вуд предложил создать заклинания Solidity для династии Ethereum, которые позволили бы каждому работать над более инновационными идеями и приложениями. Это мощное заклинание разработала команда волшебников и ученых во главе с Кристианом Рейтвиснером. Заклинания Solidity настолько сильны, что позволяют каждому исследовать бесконечные идеи и возможности для создания волшебных жезлов Smart Contract. Давайте узнаем больше о заклинаниях солидности, изучим их возможности и узнаем, как их использовать.

Солидность — это высокоуровневое заклинание, ориентированное на контракт (объект). Он реализован строго или статически, когда все переменные и типы данных объявляются перед выполнением. Это позволяет создавать волшебные палочки, называемые смарт-контрактами. Эти контракты создают сложные и мощные приложения, известные как dApps (децентрализованные приложения). В Solidity есть множество интересных функций, которые мне нравятся и заслуживают изучения.

  • Взаимодействие с блокчейном и специальные функции EVM: он имеет несколько глобальных переменных, таких как msg.sender и block.number, которые обеспечивают доступ к информации о текущем состоянии сети. Он также включает поддержку Ether (ETH), собственной криптовалюты, взаимодействие со службой имен Ethereum (ENS) и другие функции и функции, характерные для EVM.
  • Функции безопасности. Некоторые функции безопасности включают в себя управление контролем доступа, когда доступ к данным и функциям ограничен. Он также имеет защиту от переполнения и недополнения для предотвращения арифметических ошибок и многие другие интересные и необходимые функции безопасности.
  • Модификаторы. Он имеет концепцию модификаторов, которые используются для изменения поведения функций и добавления условий к вызовам функций, например, требующих, чтобы вызывающий функцию был авторизован для выполнения этого вызова.
  • События. Он обеспечивает поддержку событий, которые используются для уведомления внешних сторон о важных контрактных событиях. Эти события генерируются при выполнении определенных условий, и их можно использовать для запуска внешних действий или для предоставления информации внешним приложениям.
  • Возможность обновления. Он имеет функции, которые позволяют со временем обновлять смарт-контракты без нарушения их функциональности. Это важно, поскольку позволяет смарт-контрактам развиваться и адаптироваться к меняющимся обстоятельствам, не требуя от пользователей переключения на новый контракт.
  • Интеграция с другими языками. Он предназначен для совместимости с другими языками, такими как JavaScript, Python и Go. Это позволяет разработчикам использовать предпочитаемый ими язык программирования для различных частей децентрализованного приложения, в то же время используя мощь и безопасность Solidity для написания смарт-контрактов.
  • Наследование. Он также поддерживает наследование, что позволяет разработчикам повторно использовать код из других контрактов. Наследование позволяет разработчикам создавать новые контракты, которые наследуют свойства и методы существующих контрактов, что упрощает написание сложных смарт-контрактов и управление ими.
  • Полиморфизм. Он поддерживает полиморфизм, что позволяет разработчикам создавать контракты, которые могут принимать различные формы. Полиморфизм позволяет разработчикам создавать более гибкие и адаптируемые смарт-контракты, которые можно использовать в различных контекстах.
  • Функции с привязкой ко времени. Эти функции с привязкой ко времени – это функции, которые выполняются в определенное время. Функции с привязкой ко времени полезны для выполнения определенных действий через определенные промежутки времени, таких как отправка регулярных платежей или обновление данных контракта в заранее определенное время.
  • Перегрузка функций: позволяет разработчикам создавать функции с одинаковыми именами, но разными аргументами. Перегрузка функций позволяет разработчикам создавать более модульные и расширяемые контракты, что упрощает добавление новых функций и функций с течением времени.

Есть много других бесконечных функций Solidity, поскольку он постоянно развивается. Но теперь мы можем взглянуть на основы этого прекрасного заклинания (язык).

  • Типы. В Solidity имеется богатый набор типов данных, включая целые числа, логические значения, строки, адреса и многое другое. Solidity также поддерживает пользовательские типы, такие как структуры и перечисления, которые позволяют разработчикам определять собственные структуры данных.
// Declare variables of various Solidity data types
contract DataTypes {
    bool public myBool = true;
    int public myInt = -123;
    uint public myUint = 456;
    address public myAddress = 0x123abc...;
    fixed public myFixed = 1.23;
    ufixed public myUfixed = 4.56;
    bytes public myBytes = "hello";
    string public myString = "world";
    enum MyEnum { Value1, Value2, Value3 }
    MyEnum public myEnum = MyEnum.Value2;
    struct MyStruct { uint x; uint y; }
    MyStruct public myStruct = MyStruct(1, 2);
    mapping(address => uint) public myMapping;
}
  1. Логическое значение: bool (истина или ложь)
  2. Целое число: int и uint (целые числа со знаком и без знака разных размеров)
  3. Адрес: address (представляет адрес Ethereum)
  4. Фиксированная точка: fixed и ufixed (числа с фиксированной точкой различных размеров)
  5. Байтовые массивы: bytes и string (байтовые массивы и строки переменной длины)
  6. Enum: enum (определяемые пользователем типы перечисления)
  7. Структура: struct (определяемые пользователем составные типы)
  8. Сопоставление: mapping (ассоциативные массивы, отображающие один тип на другой)
  • Переменные. Переменные Solidity могут быть объявлены с использованием ключевого слова var или с явными объявлениями типа. Переменные Solidity могут быть объявлены на уровне контракта, на уровне функции или внутри блока.
  • Управляющие структуры: Solidity включает ряд управляющих структур, включая операторы if/else, циклы for, циклы while и операторы switch. Эти структуры управления позволяют разработчикам создавать сложную логику и процессы принятия решений в своих смарт-контрактах.
if (myUint == 123) {
    // do something
} else if (myUint == 456) {
    // do something else
} else {
    // do something different
}

for (uint256 i = 0; i < 10; i++) {
    // do something during each iteration
}

while (myBool == true) {
    // do something while myBool is true
}

switch (myUint) {
    case 0:
        // do something if myUint is 0
        break;
    case 1:
        // do something if myUint is 1
        break;
    default:
        // do something if myUint is anything else
        break;
}
  • Функции. Функции Solidity похожи на функции в других языках программирования, но с некоторыми дополнительными функциями, характерными для смарт-контрактов. Например, функции Solidity могут иметь несколько возвращаемых значений, а также модификаторы видимости, такие как public, private и internal.
function myFunction() public {
    // do something
}

function myPrivateFunction() private {
    // do something private
}

function myViewFunction() public view returns (uint256) {
    // do something and return a value
}

function myPureFunction(uint256 arg1, uint256 arg2) public pure returns (uint256) {
    // do something with the arguments and return a value
}
  • Сопоставление. Сопоставление в Solidity — это ассоциативный массив, который сопоставляет один тип данных с другим. Отображения похожи на хеш-таблицы или словари в других языках программирования. Вот пример объявления сопоставления:
// Declare a mapping
mapping (address => uint) public balances;

В этом примере я объявил общедоступное отображение с именем balances, которое отображает адреса в значения uint. Затем я могу получить доступ и изменить значения сопоставления с помощью адресных ключей, например:

// Set the balance of an address
balances[msg.sender] = 100;

// Get the balance of an address
uint balance = balances[msg.sender];

В этом примере я установил баланс адреса msg.sender равным 100, а затем получил баланс адреса msg.sender и присвоил его переменной с именем balance. Сопоставления обычно используются в контрактах Solidity для хранения и извлечения данных в формате ключ-значение.

  • Структуры. Структура в Solidity — это определяемый пользователем составной тип, который позволяет группировать вместе связанные переменные данных разных типов. Структуры можно использовать для определения сложных структур данных, недоступных для встроенных типов данных Solidity. Вот пример объявления структуры:
// Declare a struct
struct Person {
    string name;
    uint age;
    bool isStudent;
}

В этом примере я объявил структуру с именем Person, которая имеет три поля: name типа string, age типа uint и isStudent типа bool. Затем я могу объявить переменную типа Person и присвоить значения ее полям, например:

// Declare a variable of type Person
Person public janesh = Person("Janesh", 25, true);
  • Интерфейсы. Интерфейсы позволяют определять внешние функции контракта без их реализации. Это полезно, когда вы хотите взаимодействовать с другими контрактами, так как позволяет определить стандартный набор функций, которые могут вызываться другими контрактами. Вот пример:
interface MyInterface {
    function myFunction(uint256 myArg) external returns (uint256);
}

contract MyContract {
    function callOtherContract(address otherContract) public {
        MyInterface other = MyInterface(otherContract);
        uint256 result = other.myFunction(123);
    }
}

В этом примере MyContract определяет функцию callOtherContract, которая принимает в качестве аргумента адрес другого контракта. Затем функция создает экземпляр интерфейса MyInterface для другого контракта и вызывает его функцию myFunction с аргументом 123.

  • Обработка ошибок. Solidity включает несколько функций для обработки ошибок, таких как оператор require и оператор assert. Эти операторы позволяют разработчикам проверять определенные условия и создавать исключения или отменять транзакции, если эти условия не выполняются.

Позвольте мне показать вам, как вы можете создать контракт с помощью основ, которые мы обсуждали выше.

// Declare the version of Solidity we're using
pragma solidity ^0.8.0;

// Declare the contract
contract MyContract {
    // Declare a public variable
    uint public magicNumber;
    
    // Declare an event
    event NumberSet(uint number);
    
    // Declare a function that sets the value of magicNumber
    function setNumber(uint _number) public {
        magicNumber = _number;
        emit NumberSet(_number);
    }
}

Позвольте мне объяснить контракт, который я написал, чтобы вы позвонили, поняли и начали создавать свой.

  1. В первой строке указывается версия Solidity, которую я использую (в данном случае версия 0.8.0).
  2. Ключевое слово contract используется для объявления контракта. В данном случае я называю его MyContract.
  3. Внутри контракта я объявляю общедоступную переменную с именем magicNumber типа uint (целое число без знака).
  4. Я также объявляю событие с именем NumberSet, которое принимает параметр uint с именем number.
  5. Наконец, я объявляю функцию с именем setNumber, которая принимает параметр uint с именем _number. Эта функция устанавливает значение magicNumber в значение _number и создает событие NumberSet со значением _number.

Когда он развернут в сети блокчейн, он создает смарт-контракт, с которым может взаимодействовать любой человек в сети. Переменная magicNumber общедоступна, что означает, что любой может прочитать ее значение. С другой стороны, функция setNumber может быть вызвана только владельцем контракта или любым другим лицом, которому было дано на это разрешение. Когда setNumber вызывается с новым значением, оно обновляет значение magicNumber и генерирует событие NumberSet с новым значением.

Теперь я чувствую, что у всех нас должна быть ясная картина магического заклинания Solidity. Теперь мы все готовы покорять мир web3. С нашими знаниями и навыками мы можем создать множество волшебных палочек, которые могут расширить возможности таких приложений, как DeFi, DAO, NFT, GameFi и т. д.

Сила и влияние династии Эфириума настолько сильны, что многие династии, которые были созданы после того, как Эфириум принял модель EVM и заклинания Solidity.

В настоящее время в этом волшебном мире развиваются многие династии L1 и L2, но первопроходцем всегда будет Ethereum, который подарил этому миру EVM и Solidity. Многие из них хотят оказаться в центре внимания и думают, что Ethereum — самый старый и он не сможет угнаться за текущими тенденциями. Но мой друг, всегда помни, что старое - это Золото!

«Солидность Solidity — это основа волшебного мира Web3. Без него волшебства не будет!»