Обучение Solidity с легкостью — Введение

Solidity — это объектно-ориентированный язык программирования общего назначения. Solidity используется для написания смарт-контрактов в сети Ethereum. Есть много ресурсов, доступных в Интернете. Однако сбор информации с разных ресурсов требовал больших усилий. Поэтому я решил сделать заметки об этих ресурсах и опубликовать их в виде статей. В этой статье мы сосредоточимся на основах языка Solidity.

Необходимое условие:

  1. Базовое понимание блокчейна Ethereum
  2. Базовое понимание любого языка программирования

Оглавление

  1. Блокчейн сети
  2. Ремикс IDE — https://remix.ethereum.org/
  3. Смарт-контракты
  4. Контракт — Напишите свой первый контракт
  5. Основные типы данных
  6. Операторы
  7. Функция
  8. Расширенные структуры данных
  9. Объем и видимость

1. Блокчейн-сети

Экосистема Ethereum представляет собой сложную архитектуру. Он состоит из многих компонентов. Проще говоря, сеть Blockchain — это распределенная система, в которой вы можете развертывать свои смарт-контракты, а с помощью смарт-контрактов вы можете писать бизнес-логику. Бизнес-логика может быть такой же простой, как сброс данных в сеть блокчейна, или может быть сложной, как построение всего управления доставкой по сети блокчейна. В реальном мире вы можете хотеть или не хотеть создавать свою собственную сеть. Ethereum — это общедоступная распределенная более крупная технология, доступная для всех. В следующей статье мы узнаем, как создать собственную сеть. В этой статье мы сосредоточимся на базовом понимании языка Solidity.

2. Ремикс IDE

Как я упоминал выше, создание сети Blockchain — сложный процесс. Поэтому в этой статье мы будем использовать Remix IDE. Remix IDE — это среда разработки, в которой мы можем развертывать и взаимодействовать с различными типами блокчейн-сетей. В настоящее время мы используем Remix. Мы можем работать с Javascript VM, Injected web3 или Web3 Provider.

  • Javascript VM – это виртуальная среда, созданная наподобие тестовой сети, в которой вы можете работать в виртуальной среде. Данные будут очищены в конце сеанса.
  • Используя Injected web3, вы можете взаимодействовать с различными общедоступными сетями, используя библиотеку/протокол Web3. Для этого вам может потребоваться клиентское приложение, например MetaMask.
  • Если вы создали свою собственную сеть. Вы можете подключиться с помощью провайдера Web3.

Примечание. В этой статье мы будем использовать Javascript VM.

3. Смарт-контракты

Смарт-контракты — это просто программы, хранящиеся в блокчейне, которые запускаются при выполнении заранее определенных условий. Это определение взято из топиков/смарт-контрактов. Смарт-контракты обычно содержат бизнес-логику для совместного использования ресурсов и их владения.

Давайте создадим наш первый смарт-контракт. Откройте RemixIDE, создайте файл (FirstContract.sol) в папке contracts.

Все смарт-контракты заканчиваются расширением .sol.

// FirstContract.sol

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

Минимальный код, необходимый для написания смарт-контракта, — это указать версию Solidity. Теперь вы можете скомпилировать FirstContract.sol, перейдя на вкладку компилятора. Как только вы скомпилируете, вы ничего не увидите. Так как мы еще не написали никакого контракта.

4. Контракт — напишите свой первый контракт

Контракт очень похож на класс в объектно-ориентированном программировании. Он содержит переменные и функции.

pragma solidity >=0.7.0 <0.9.0;
contract Person {
   string public name = "Deepak";
}

Вы можете сохранить файл, скомпилировать и развернуть его на Javascript VM. После развертывания контракта Вы можете взаимодействовать, чтобы получить имя, эквивалентное«Deepak». В приведенном выше примере область действия имени является общедоступной. Это создаст функцию получения для доступа к имени. Мы изучим область видимости позже в этой статье.

Чтобы узнать больше о компиляции и развертывании, прочитайте create_deploy.

5. Основные типы данных

Как и любой язык программирования, Solidity имеет несколько предопределенных типов данных для обработки данных в сетях блокчейна. Данные могут храниться либо как локальная переменная, либо в сети как глобальное состояние.

pragma solidity ^0.8.1;

contract Person {
    string public name;
    uint256 public age;
    address public paddress;

    function setDetail(string memory _name, uint256 _age)
        public
        returns (
            string memory,
            uint256,
            address
        )
    {
        name = _name;
        age = _age;
        paddress = msg.sender;
        return (name, age, paddress);
    }
}

Локальная переменная создается внутри функции и уничтожается, как только программа выходит из функции. Переменная состояния создается вместе с контрактом и уничтожается после уничтожения контракта в сети.
Давайте посмотрим на пример.

function f(uint[] memory c) public {
    // stores a reference to ``s`` in ``g``
    StructType storage g = s;
    // also changes ``s.moreInfo``.
    g.moreInfo = 2;
    // assigns a copy because ``g.contents``
    // is not a local variable, but a member of
    // a local variable.
    g.contents = c;
}

Подробнее о типах данных:docs.soliditylang.org/types

6. Операторы

Оператор в языке программирования — это символ, который указывает компилятору или интерпретатору выполнить определенные математические, реляционные или логические операции и получить окончательный результат [ссылка: computer_programming_operators].

pragma solidity 0.4.8;
contract Operators {
// Arithmatic Operators
    uint a = 10;
    // +, -, unary -, unary +, *, /, % (remainder), ** (exponentiation)
    uint b = 2**3; // b = 8
// a++ and a-- are equivalent to a += 1 / a -= 1 
    // but the expression itself still has the previous value of a. 
    // In contrast, --a and ++a have the same effect on a but return the value after the change.
    a = a++; // a = 10
    a = ++a; // a = 11
// a += e is equivalent to a = a + e. 
    // The operators -=, *=, /=, %=, a |=, &= and ^= are defined accordingly. 
    a += 5; // a = 11+5 = 16
// Logical Operators
    // ! (logical negation)
    // && (logical conjunction, “and”)
    // || (logical disjunction, “or”)
    // == (equality)
    // != (inequality)
    bool isOwner;
    isOwner = isMortal && hasWriteAccess;
    isOwner = true && false; // false
    isOwner = true || false; // true
    isOwner = !false; // true
    var check = (1 ether == 1000 finney); // true
    var check = (1 ether != 2000 finney); // true
// Bitwise Operators
    // & Bitwise AND 
    // | Bitwise OR 
    // ^ Bitwise exclusive OR 
    // ~ Bbitwise negation
    // >> Bitwise right shift
    // << Bitwise left shift
    var orValue = 0x02 | 0x01; // orValue = 0x03
    uint shiftValue = 0x01 << 2; // shiftValue = 4
// Define consutruct here
    function Operators(uint initialCoins) {
       // Initialize state variables here
    }
}

Ссылка, Подробнее:toshblocks.com/operators-arithmetic-logical-bitwise

7. Функция

Функции — это повторно используемый блок кода, который можно выполнять снова и снова. Контракт может иметь одну или несколько функций. Вы можете вызвать функцию напрямую, ссылаясь на контракт. Функцию также можно вызывать динамически после динамического создания контракта.

contract Person {
    string public name;
    uint256 public age;
    address public paddress;

    function setDetail(string memory _name, uint256 _age)
        public
        returns (
            string memory,
            uint256,
            address
        )
    {
        name = _name;
        age = _age;
        paddress = msg.sender;
        return (name, age, paddress);
    }
}

В приведенном выше примере setDetailявляется функцией. Эта функция принимает три входных аргумента и возвращает кортеж в качестве результата.

8. Расширенные структуры данных

Помимо int, float, bool, Solidity также поддерживает сложные структуры данных, такие как mapping, array, struct, enum, address.
Структура — это сложный тип данных, который может содержать другие типы данных.

contract test {
   struct Book { 
      string title;
      string author;
      uint book_id;
   }
   Book book;

   function setBook() public {
      book = Book('Learn Java', 'TP', 1);
   }
   function getBookId() public view returns (uint) {
      return book.book_id;
   }
}

Отображение — это структура данных, которая может хранить значения на основе ключей. Подобно отображению, массив представляет собой структуру данных, в которой может храниться набор данных схожих типов. И мы можем получить доступ к значению, используя индекс значения.

contract LedgerBalance {
    mapping(address => uint) public balances;
    function updateBalance(uint newBalance) public {
        balances[msg.sender] = newBalance;
    }
    function testMethod() public pure{
      uint len = 7; 
      
      //dynamic array
      uint[] memory a = new uint[](7);
      
      //bytes is same as byte[]
      bytes memory b = new bytes(len);
      
      assert(a.length == 7);
      assert(b.length == len);
      
      //access array variable
      a[6] = 8;
      
      //test array variable
      assert(a[6] == 8);
      
      //static array
      uint[3] memory c = [uint(1) , 2, 3];
      assert(c.length == 3);
    }
}

Примечание.

  1. Массив может быть динамическим или статическим в зависимости от создания массива.
  2. Отображение не имеет длины
  3. Отображения не имеют длины. Это важно понимать. Массивы имеют длину, но из-за внутреннего хранения отображений у них нет длины.
  4. Структуры инициализируются с их значением по умолчанию

Допустим, у вас есть отображение mapping(uint256 => uint) myMapping, тогда все элементы myMapping[0], myMapping[1], myMapping[123123], … уже инициализированы значением по умолчанию. Если вы сопоставляете uint256 с uint, то вы сопоставляете тип ключа «uint» с типом значения «uint».

Подробнее: ethereum-blockchain-developer.com/mappings-and-structs

Адрес. Адрес — это особый тип данных. Адрес содержит 20-байтовое значение (размер адреса Ethereum), уникальное местоположение клиента или контракта. Адрес может быть воспроизводимым. Платный адрес имеет несколько специальных функций, таких как перевод или отправка.
Подробнее:docs.soliditylang.org/types#address

9. Масштаб и видимость

Чтобы определить видимость функции, вы можете задать простой вопрос «Кто может вызывать функцию». Функция солидности имеет четыре вида видимости: частный, внутренний, внешний или публичный. По умолчанию функция имеет общедоступную область.

Частная:частная функция может быть вызвана только основным контрактом.
Внутренняя: внутренняя функция может быть вызвана только основным или производным контрактом.
Внешняя: внешняя функция может быть вызвана только третьей стороной. Ее нельзя вызывать из основных или производных контрактов.
Общедоступная: публичная функция может быть вызвана кем угодно и где угодно.

Подробнее:bitsofco.de/solidity-function-visibility-explained/

Заключение

Эта статья — просто введение в блокчейн. Цель этой статьи состоит в том, чтобы просто кратко изложить темы для изучения. Я приложил все справочные ссылки ниже. В случае, если вы ищете подробную версию, вы можете прочитать ethereumbook/ethereumbook.

Рекомендации