July 30

Solidity урок 1

pragma solidity ^0.8.25; - версия, с этого начинается написание кода.

contract Sample{    } - объявление контракта

address owner; - переменная, объявляющая владельца контракта

В Solidity, constructor() - это специальная функция, которая выполняется только один раз, когда контракт разворачивается на блокчейне.

Основные функции constructor:

  • Инициализация состояния: Используется для задания начальных значений переменных состояния контракта.
  • Настройка контракта: Выполняет действия, необходимые для настройки контракта перед его запуском, например, создание внутренних структур данных.
  • Определение параметров: Может принимать аргументы, которые используются для инициализации контракта.

public - атрибут, который делает переменную публичной - изи фо рид

function payForItem() public payable  {  } - функция с атрибутом паблик и пайбл, паблик маст хэв, чтобы человек мог совершать транзакцию из вне, пейбл дает возможность принимать деньги

В Solidity, mapping() - это специальный тип данных, который представляет собой ассоциативный массив (или хэш-таблица). Он позволяет хранить пары “ключ-значение”, где:

  • Ключ: Любой тип данных (например, address, uint, string).
  • Значение: Любой тип данных, включая другие mapping или структуры данных.(условно кол-во денег)

Как работает mapping:

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

uint256 в Solidity - это целочисленный тип данных с размером 256 бит, который представляет собой беззнаковое целое число, т.е. оно не может быть отрицательным.

mapping (address => uint256)

// SPDX-License-Identifier: UNLICENSEDpragma solidity ^0.8.25;

contract Sample{   

address public owner;   

mapping (address => uint256) public payments;

constructor(){        owner = msg.sender;

    }
    function payForItem() public payable  {       

payments[msg.sender] = msg.value;

    }
    function widthdrawAll() public {       

address payable _to = payable(owner);       

address _thisCont = address(this);

_to.transfer(_thisCont.balance);     }}

// SPDX-License-Identifier: UNLICENSED 
  • // SPDX-License-Identifier: UNLICENSED - это комментарий, который указывает, что код не имеет лицензии. Вместо UNLICENSED можно указать лицензию (например, MIT, GPL), если вы хотите ограничить использование вашего кода.
pragma solidity ^0.8.25;
  • pragma solidity ^0.8.25; - это директива, которая указывает компилятору Solidity использовать версию компилятора не ниже 0.8.25. Использование ^ означает, что компилятор может использовать более новую версию Solidity, но не более старую, чем 0.8.25.
contract Sample{
  • contract Sample { - определяет контракт под названием Sample. Контракты - это основа Solidity, они хранят данные и логику на блокчейне.
    address public owner;
  • address public owner; - объявляет переменную состояния owner типа address с флагом public.
    • address - это тип данных, который представляет адрес счета в Ethereum.
    • public - делает переменную owner доступной для чтения из вне контракта.
    mapping (address => uint256) public payments;
  • mapping (address => uint256) public payments; - создает mapping с именем payments, который хранит пары “ключ-значение”.
    • address - тип ключа (адрес счета).
    • uint256 - тип значения (беззнаковое целое число с размером 256 бит).
    • public - делает mapping доступным для чтения из вне контракта.
//0xd9145CCE52D386f254917e481eB44e9943F39138 main contr
  • //0xd9145CCE52D386f254917e481eB44e9943F39138 main contr - это комментарий, который вероятно указывает на адрес контракта или какое-то другое значимое значение.
    constructor(){
        owner = msg.sender;
    }
  • constructor() { owner = msg.sender; } - это конструктор контракта. Он выполняется только один раз, когда контракт развертывается на блокчейне.
    • msg.sender - это специальная переменная, которая содержит адрес счета, который инициировал транзакцию.
    function payForItem() public payable  {
        payments[msg.sender] = msg.value;
    }
  • function payForItem() public payable { ... } - это функция контракта.
    • public - делает функцию доступной для вызова из вне контракта.
    • payable - позволяет функции принимать Ethereum (в виде msg.value).
    • payments[msg.sender] = msg.value; - сохраняет значение msg.value (количество ETH, отправленного в транзакции) в mapping payments с ключом msg.sender (адрес отправителя транзакции).
    function widthdrawAll() public {
        address payable _to = payable(owner);
        address _thisCont = address(this);

        _to.transfer(_thisCont.balance); 
    }
  • function widthdrawAll() public { ... } - это еще одна функция контракта.
    • address payable _to = payable(owner); - создает переменную _to типа address payable (это особый тип адреса, который позволяет отправлять ETH). В нее записывается значение owner, приведенное к типу address payable.
    • address _thisCont = address(this); - создает переменную _thisCont типа address, в которую записывается адрес текущего контракта (с помощью this).
    • _to.transfer(_thisCont.balance); - переводит весь баланс текущего контракта (хранящийся в _thisCont.balance) на адрес _to (владельца контракта).

В итоге, этот код описывает простой контракт, который:

  • Хранит адрес владельца.
  • Хранит записи о платежах от пользователей в mapping payments.
  • Имеет функцию payForItem(), которая позволяет пользователям отправлять ETH в контракт и записывать их платежи в payments.
  • Имеет функцию widthdrawAll(), которая позволяет владельцу контракта извлечь все собранные ETH.