Solidity урок 1
pragma solidity ^0.8.25; - версия, с этого начинается написание кода.
contract Sample{ } - объявление контракта
address owner; - переменная, объявляющая владельца контракта
В Solidity, constructor()
- это специальная функция, которая выполняется только один раз, когда контракт разворачивается на блокчейне.
- Инициализация состояния: Используется для задания начальных значений переменных состояния контракта.
- Настройка контракта: Выполняет действия, необходимые для настройки контракта перед его запуском, например, создание внутренних структур данных.
- Определение параметров: Может принимать аргументы, которые используются для инициализации контракта.
public - атрибут, который делает переменную публичной - изи фо рид
function payForItem() public payable { } - функция с атрибутом паблик и пайбл, паблик маст хэв, чтобы человек мог совершать транзакцию из вне, пейбл дает возможность принимать деньги
В Solidity, mapping()
- это специальный тип данных, который представляет собой ассоциативный массив (или хэш-таблица). Он позволяет хранить пары “ключ-значение”, где:
- Ключ: Любой тип данных (например,
address
,uint
,string
). - Значение: Любой тип данных, включая другие
mapping
или структуры данных.(условно кол-во денег)
mapping
не имеет фиксированного размера, он динамически расширяется по мере добавления новых ключей.- Ключи
mapping
являются уникальными и не могут повторяться. - Если ключ не существует, то значение, связанное с ним, будет равно значению по умолчанию для соответствующего типа данных.
- Доступ к значениям
mapping
осуществляется по ключу.
uint256
в Solidity - это целочисленный тип данных с размером 256 бит, который представляет собой беззнаковое целое число, т.е. оно не может быть отрицательным.
// SPDX-License-Identifier: UNLICENSEDpragma solidity ^0.8.25;
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;
mapping (address => uint256) public payments;
mapping (address => uint256) public payments;
- создаетmapping
с именемpayments
, который хранит пары “ключ-значение”.
//0xd9145CCE52D386f254917e481eB44e9943F39138 main contr
//0xd9145CCE52D386f254917e481eB44e9943F39138 main contr
- это комментарий, который вероятно указывает на адрес контракта или какое-то другое значимое значение.
constructor(){ owner = msg.sender; }
constructor() { owner = 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
(владельца контракта).