• Добро пожаловать на инвестиционный форум!

    Во всем многообразии инвестиций трудно разобраться. MMGP станет вашим надежным помощником и путеводителем в мире инвестиций. Только самые последние тренды, передовые технологии и новые возможности. 400 тысяч пользователей уже выбрали нас. Самые актуальные новости, проверенные стратегии и способы заработка. Сюда люди приходят поделиться своим опытом, найти и обсудить новые перспективы. 16 миллионов сообщений, оставленных нашими пользователями, содержат их бесценный опыт и знания. Присоединяйтесь и вы!

    Впрочем, для начала надо зарегистрироваться!
  • 🐑 Моисей водил бесплатно. А мы платим, хотя тоже планируем работать 40 лет! Принимай участие в партнеской программе MMGP
  • 📝 Знаешь буквы и умеешь их компоновать? Платим. Дорого. Бессрочная акция от MMGP: "ОПЛАТА ЗА СООБЩЕНИЯ"

👾 Создаем лотерейный и донатный смарт-контракт в среде Remix IDE [ Ethereum, Solidity ]

Для создания смарт-контрактов на блокчейне Ethereum разработчикам необходима среда, которая упростит процесс разработки, предоставит полезные инструменты и функции, а также оптимизирует тестирование и отладку смарт-контрактов.

Remix IDE отлично соответствует этим требованиям и широко используется разработчиками для разработки смарт-контрактов на Solidity.

Remix IDE — это мощная и пожалуй самая популярная интегрированная среда разработки (IDE) для работы с контрактами на языке Solidity. Она позволяет разработчикам писать, тестировать, отлаживать и развертывать смарт-контракты на блокчейне Ethereum и других совместимых с Ethereum Virtual Machine (EVM) блокчейнах.

Remix IDE предоставляет максимально удобный интерфейс, который сильно упрощает процесс разработки, делая его доступным для разработчиков любого уровня подготовки.

Screenshot_46.jpg


Ключевые преимущества Remix IDE:

  • Готовое решение для разработки контрактов: Remix IDE предлагает все необходимые инструменты и функции для разработки децентрализованных приложений без необходимости установки дополнительных плагинов или модулей. Это позволяет разработчикам сразу начать работу, открыв браузер и запустив Remix IDE.
  • Удобство использования: Простота доступа и удобный интерфейс делают Remix IDE идеальной средой для быстрого написания, тестирования и развертывания смарт-контрактов.
  • Оптимизация разработки и отладки: Remix IDE позволяет разработчикам легко писать, тестировать и отлаживать свои смарт-контракты, что ускоряет процесс разработки и снижает риск ошибок.

Что позволяет Remix IDE:

  • Создавать код смарт-контракта на языке Solidity. В Remix IDE можно создать новый файл и написать код прямо в браузере.
  • Тестирование и отладка: Использовать встроенные инструменты для тестирования и отладки смарт-контрактов. Remix IDE предоставляет возможности для симуляции и анализа работы смарт-контрактов.
  • Развертывание: После написания и тестирования смарт-контракта его можно развернуть на блокчейне Ethereum, причем быстро и удобно.

Сочетание Solidity и Remix IDE значительно упрощает создание безопасных и децентрализованных приложений, работающих на блокчейне Ethereum. Этот инструмент меняет правила игры в индустрии блокчейна, позволяя разработчикам сосредоточиться на своих проектах и поставленных целях.

Remix IDE - это веб-приложение, а это означает, что вы можете получить к нему доступ из любого веб-браузера.
Однако среда также доступна на все существующие ОС - Windows, Mac и Linux.

Перейти на remix.ethereum.org

специально для mmgp
уникальность
 

Alcest

Модератор подраздела "Новости криптовалют"
Команда форума
Модератор
Крипто-блогер
Новостной редактор
Регистрация
13.05.2015
Сообщения
50,216
Реакции
23,282
Поинты
65.161
Далее поэтапно в комментариях расскажу, как создать простой лотерейный смарт-контракт LOTTERY_MMGP с помощью Remix, после чего пройдемся по другим.

Лотерейный контракт позволит людям делать ставки в ETH, после чего происходит микширование пула и далее рандомно выбирается случайный игрок, который забирает весь кэш.

Screenshot_62.jpg
 

Alcest

Модератор подраздела "Новости криптовалют"
Команда форума
Модератор
Крипто-блогер
Новостной редактор
Регистрация
13.05.2015
Сообщения
50,216
Реакции
23,282
Поинты
65.161
Лотерейный смарт-контракт

В FILE EXPLORER создаем имя файла с расширением .sol и даем ему имя:

Screenshot_48.jpg


Пусть будет LOTTERY_MMGP

Далее открываем созданный файл и видим пустой редактор кода

Screenshot_50.jpg


Первое, что нужно - это прописать лицензию

Код:
//SPDX-License-Identifier: MIT

Screenshot_51.jpg


Что такое SPDX-License-Identifier: MIT простыми словами?

Строка // SPDX-License-Identifier: MIT указывает, что код лицензирован по лицензии MIT. Это позволяет любому использовать, копировать, изменять и распространять код при условии включения исходной лицензии. Указание SPDX-License-Identifier: MIT помогает избежать юридических проблем, предоставляя всем информацию о правах и обязанностях при использовании кода.

SPDX означает Software Package Data Exchange (обмен данными о пакетах программного обеспечения) - это стандартный способ указания лицензии программного обеспечения. Используя идентификатор лицензии SPDX, в нашем случае, MIT, мы упрощаем понимание того, что можно и что нельзя делать с кодом. Такая стандартизация способствует согласованности между различными проектами.

Многие инструменты, работающие с кодом Solidity, распознают идентификаторы лицензий SPDX. Это значит, что инструменты для анализа, проверки и развертывания смарт-контрактов могут автоматически понимать информацию о лицензировании. Включение идентификатора SPDX гарантирует правильную работу этих инструментов и предоставление точной информации.

Вот пример простого контракта Solidity с идентификатором SPDX:

Код:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;


Пример контракта {
    uint256 public value;


    function setValue(uint256 _value) public {
        value = _value;
    }
}

Эта маленькая деталь играет большую роль в обеспечении прозрачности, понятности и юридической обоснованности кода смарт-контракта.
 

Alcest

Модератор подраздела "Новости криптовалют"
Команда форума
Модератор
Крипто-блогер
Новостной редактор
Регистрация
13.05.2015
Сообщения
50,216
Реакции
23,282
Поинты
65.161
Далее прописываем строку

Код:
pragma solidity ^0.8.0

Screenshot_63.jpg


Строка pragma solidity используется для определения версии компилятора Solidity, которую следует использовать при компиляции смарт-контракта. Это помогает избежать проблем совместимости между различными версиями компилятора и гарантирует, что контракт будет компилироваться и работать корректно.
 

Alcest

Модератор подраздела "Новости криптовалют"
Команда форума
Модератор
Крипто-блогер
Новостной редактор
Регистрация
13.05.2015
Сообщения
50,216
Реакции
23,282
Поинты
65.161
Сам контракт LOTTERY_MMGP:

Код:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Lottery {
    address public manager;
    address[] public players;

    constructor() {
        manager = msg.sender;
    }

    function enter() public payable {
        require(msg.value > .01 ether, "Minimum 0.01 ETH to enter");

        players.push(msg.sender);
    }

    function getPlayers() public view returns (address[] memory) {
        return players;
    }

    function random() private view returns (uint) {
        return uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp, players)));
    }

    function pickWinner() public restricted {
        require(players.length > 0, "No players in the lottery");

        uint index = random() % players.length;
        address winner = players[index];

        payable(winner).transfer(address(this).balance);
        players = new address[](0); // Reset the players array for the next round
    }

    modifier restricted() {
        require(msg.sender == manager, "Only the manager can call this function");
        _;
    }
}

Screenshot_61.jpg
 

Alcest

Модератор подраздела "Новости криптовалют"
Команда форума
Модератор
Крипто-блогер
Новостной редактор
Регистрация
13.05.2015
Сообщения
50,216
Реакции
23,282
Поинты
65.161
Сам контракт LOTTERY_MMGP:
  • Контракт и переменные:
    • Контракт Lottery содержит переменные manager и players.
    • manager — это адрес владельца контракта, назначаемый при его создании.
    • players — это массив адресов игроков, которые входят в лотерею.
  • Функция enter:
    • Функция enter позволяет игрокам войти в лотерею, отправив N-количество ETH.
    • Адрес отправителя добавляется в массив players.
  • Функция getPlayers:
    • Возвращает список текущих игроков.
  • Функция random:
    • Генерирует случайное число на основе текущей сложности блока, временной метки и списка игроков.
    • Эта функция используется для выбора случайного победителя.
  • Функция pickWinner:
    • Вызывает функцию random для выбора случайного индекса победителя.
    • Переводит баланс контракта на адрес победителя.
    • Сбрасывает массив players для следующего раунда.
  • Модификатор restricted:
    • Ограничивает выполнение функции pickWinner только менеджером
 

Alcest

Модератор подраздела "Новости криптовалют"
Команда форума
Модератор
Крипто-блогер
Новостной редактор
Регистрация
13.05.2015
Сообщения
50,216
Реакции
23,282
Поинты
65.161
Контракт Lottery содержит переменные manager и players.
В контексте смарт-контракта, написанного на Solidity, переменные manager и players могут иметь следующие значения:

Код:
manager

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

Код:
players

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

Alcest

Модератор подраздела "Новости криптовалют"
Команда форума
Модератор
Крипто-блогер
Новостной редактор
Регистрация
13.05.2015
Сообщения
50,216
Реакции
23,282
Поинты
65.161
Строка constructor() - это функция, которая вызывается один раз при создании контракта.

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

Строка manager = msg.sender означает, что переменной manager присваивается адрес того, кто вызвал функцию (или развернул контракт).

manager: Это переменная, которая хранит адрес управляющего контракта.
msg.sender: Это встроенная переменная в Solidity, которая возвращает адрес того, кто вызвал текущую функцию.

Тот, кто развернул контракт, становится его управляющим и может выполнять управленческие функции.

Код:
contract Lottery {
    address public manager;

    // Конструктор, который устанавливает адрес менеджера контракта
    constructor() {
        manager = msg.sender;
    }
}

function enter() public payable {

Строка function enter() public payable { объявляет функцию с именем enter, которая:

  • function enter() - объявление функции с именем enter. Внутри фигурных скобок { } будет содержаться код, который выполняется, когда эта функция вызывается.
  • public - модификатор доступа, который указывает, что данная функция доступна для вызова из любого места. То есть любой пользователь или другой контракт может вызвать эту функцию.
  • payable - ключевое слово, которое позволяет функции принимать ETH при ее вызове. Если функция обозначена как payable, она может получать средства, которые отправляются вместе с вызовом функции.
require(msg.value > .01 ether, "Minimum 0.01 ETH to enter")

Строка require(msg.value > .01 ether, "Minimum 0.01 ETH to enter") означает, что функция будет выполнена только в том случае, если пользователь отправил в лотерею больше 0,01 ETH. Если отправленная сумма меньше или равна 0,01 ETH, выполнение функции будет прервано, и пользователь увидит сообщение об ошибке "Minimum 0.01 ETH to enter"
  • require - функция, которая проверяет, выполняется ли заданное условие. Если условие не выполняется, она прерывает выполнение функции и выдает сообщение об ошибке, указанное в errorMessage.
  • msg.value - встроенная глобальная переменная в Solidity, которая указывает количество ETH, отправленное вместе с вызовом функции.
  • >.01 ether: Это условие проверки, которое требует, чтобы значение msg.value было больше 0,01 ETH

Код:
function enter() public payable {
    require(msg.value > .01 ether, "Minimum 0.01 ETH to enter");
    players.push(msg.sender);
}


Когда выполняется строка players.push(msg.sender), адрес вызывающего функцию добавляется в конец массива players. Это позволяет контракту сохранять список всех участников, которые вызвали функцию (например, зарегистрировались в лотерее).
  • players - массив, который содержит адреса всех участников, например, в лотерее.
  • push - метод массива, который добавляет новый элемент в конец массива.
  • msg.sender - встроенная глобальная переменная в Solidity, которая возвращает адрес того, кто вызвал текущую функцию.

Код:
function enter() public payable {
    require(msg.value > .01 ether, "Minimum 0.01 ETH to enter");
    players.push(msg.sender);
}
 

Alcest

Модератор подраздела "Новости криптовалют"
Команда форума
Модератор
Крипто-блогер
Новостной редактор
Регистрация
13.05.2015
Сообщения
50,216
Реакции
23,282
Поинты
65.161
function getPlayers() public view returns (address[] memory) { return players;
Функция getPlayers предназначена для того, чтобы вернуть список всех игроков, адреса которых хранятся в массиве players. Она может быть вызвана любым пользователем.

Компоненты функции:
  • function getPlayers(): Это объявление функции с именем getPlayers.
  • public: Модификатор доступа, который означает, что эту функцию можно вызывать извне смарт-контракта.
  • view: Ключевое слово, указывающее, что функция не изменяет состояние блокчейна. Она только считывает данные.
  • returns (address[] memory): Определяет, что функция возвращает массив адресов. address[] - это массив адресов, а memory указывает, что этот массив будет храниться в памяти.
  • { return players; }: Тело функции, которое просто возвращает массив players. Этот массив содержит адреса, и, по-видимому, он был объявлен где-то раньше в смарт-контракте.

function random() private view returns (uint) { return uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp, players)));
Эта функция генерирует псевдослучайное число, используя текущую сложность блока, временную метку блока и массив игроков.

Ее компоненты:
  • function random(): Это объявление функции с именем random.
  • private: Модификатор доступа, который означает, что эту функцию можно вызывать только внутри самого смарт-контракта. Она не доступна извне.
  • view: Ключевое слово, указывающее, что функция не изменяет состояние блокчейна, а только считывает данные.
  • returns (uint): Определяет, что функция возвращает значение типа uint (беззнаковое целое число).
  • { return uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp, players))); }: Тело функции, которое возвращает хэш-значение, преобразованное в беззнаковое целое число.
keccak256: Функция хеширования, которая вычисляет хэш Keccak-256.​
abi.encodePacked: Функция кодирования, которая объединяет (packs) несколько значений в одно байтовое представление.​
block.difficulty: Текущее значение сложности блока.​
block.timestamp: Временная метка текущего блока.​
players: Массив адресов игроков, предположительно объявленный ранее в смарт-контракте.​

function pickWinner() public restricted {

Компоненты pickWinner.
  • public: Модификатор доступа.
  • restricted: Является модификатором, используемый для ограничения доступа к функции (например, только менеджер может ее вызвать).

require(players.length > 0, "No players in the lottery");

Проверка, что в массиве players есть хотя бы один игрок.

require останавливает выполнение функции, если условие ложно и выводит сообщение "No players in the lottery".

uint index = random() % players.length; address winner = players[index];

Генерация случайного индекса, который будет использоваться для выбора победителя.
  • random() вызывает функцию, которая возвращает случайное число.
  • % players.length вычисляет остаток от деления случайного числа на количество игроков, что гарантирует, что индекс находится в пределах массива players.
payable(winner).transfer(address(this).balance);

Перевод всех средств, хранящихся на балансе смарт-контракта, на адрес победителя.

  • payable(winner) указывает, что адрес победителя может получать средства.
  • address(this).balance возвращает баланс текущего смарт-контракта.

players = new address[](0); // Reset the players array for the next round

Сброс массива players, создавая новый пустой массив адресов.
Этот комментарий поясняет, что массив сбрасывается для следующего раунда лотереи.

modifier restricted() { require(msg.sender == manager, "Only the manager can call this function"); _;

Модификатор доступа restricted гарантирует, что функцию, к которой он применяется, может вызывать только менеджер (администратор) смарт-контракта. Если кто-то другой попытается вызвать эту функцию, выполнение будет остановлено, и будет выведено сообщение об ошибке "Only the manager can call this function".

Компоненты:

modifier restricted() {:

require(msg.sender == manager, "Only the manager can call this function");:


  • require: Оператор проверки условий, который останавливает выполнение функции, если условие не выполнено. В данном случае он проверяет, соответствует ли msg.sender значению manager.
  • msg.sender: Переменная, которая хранит адрес лица (или контракта), вызвавшего текущую функцию.
  • manager: Переменная, предположительно объявленная ранее в контракте, которая хранит адрес менеджера (администратора) смарт-контракта.
  • "Only the manager can call this function": Сообщение об ошибке, которое будет выведено, если условие не выполнено.
 

Alcest

Модератор подраздела "Новости криптовалют"
Команда форума
Модератор
Крипто-блогер
Новостной редактор
Регистрация
13.05.2015
Сообщения
50,216
Реакции
23,282
Поинты
65.161
Еще раз продублирую код лотерейнего контракта:

Код:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Lottery {
    address public manager;
    address[] public players;

    constructor() {
        manager = msg.sender;
    }

    function enter() public payable {
        require(msg.value > .01 ether, "Minimum 0.01 ETH to enter");

        players.push(msg.sender);
    }

    function getPlayers() public view returns (address[] memory) {
        return players;
    }

    function random() private view returns (uint) {
        return uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp, players)));
    }

    function pickWinner() public restricted {
        require(players.length > 0, "No players in the lottery");

        uint index = random() % players.length;
        address winner = players[index];

        payable(winner).transfer(address(this).balance);
        players = new address[](0); // Reset the players array for the next round
    }

    modifier restricted() {
        require(msg.sender == manager, "Only the manager can call this function");
        _;
    }
}

Далее нужно скомпилировать смарт-контракт, перейдя на вкладку компилятора Solidity и выбрать контракт. В моем случае это LOTTERY_MMGP

Screenshot_31.jpg


Если ошибок не будет, то в панели появится зеленая галка
 

Alcest

Модератор подраздела "Новости криптовалют"
Команда форума
Модератор
Крипто-блогер
Новостной редактор
Регистрация
13.05.2015
Сообщения
50,216
Реакции
23,282
Поинты
65.161
Напротив, если допустили ошибку, то вылезет следующее предупреждение в виде подсказки:

Screenshot_32.jpg
 

Alcest

Модератор подраздела "Новости криптовалют"
Команда форума
Модератор
Крипто-блогер
Новостной редактор
Регистрация
13.05.2015
Сообщения
50,216
Реакции
23,282
Поинты
65.161
Немного теории о компиляции.

Компиляция смарт-контракта - это процесс преобразования исходного кода смарт-контракта, написанного на Solidity в байт-код, понятный и исполняемый виртуальной машиной (Ethereum Virtual Machine, EVM).

В REMIX во вкладке «Solidity Compiler» если компиляция прошла успешна, вы увидите сообщение об успешной компиляции и сгенерированные артефакты, такие как ABI и байт-код.

В свою очередь, ABI (Application Binary Interface) представляет собой интерфейс для взаимодействия с компилированным смарт-контрактом. ABI описывает функции и параметры смарт-контракта, что позволяет другим приложениям и контрактам взаимодействовать с ним.

Screenshot_33.jpg
 

Alcest

Модератор подраздела "Новости криптовалют"
Команда форума
Модератор
Крипто-блогер
Новостной редактор
Регистрация
13.05.2015
Сообщения
50,216
Реакции
23,282
Поинты
65.161
Далее нам нужно задеплоить контракт.

Задеплоить - это значит развернуть контракт в тестовой среде (в моем случае тестовой), чтобы он стал доступен для использования. Когда смарт-контракт задеплоен, его код и данные становятся частью блокчейна и могут взаимодействовать с другими контрактами и пользователями сети.

Деплой - это следующий этап после компиляции. Для этого проходим во вкладку Deploy, выбираем тестовую сеть и нажимаем непосредственно на Deploy

Screenshot_34.jpg


Если вдруг в нижней панели появится "Currently you have no contract instances to interact with" то это означает, что в текущий момент у вас нет задеплоенных экземпляров смарт-контрактов, с которыми вы можете взаимодействовать. Это может происходить по следующим причинам:

  • Не задеплоен ни один контракт - вы еще не развернули (не задеплоили) ни один смарт-контракт на выбранной блокчейн-сети.
  • Сеть и учетная запись - вы можете быть подключены к другой сети или учетной записи, где нет задеплоенных контрактов. Убедитесь, что вы находитесь в нужной сети и используете правильную учетную запись.
  • Обновление списка контрактов - возможно, список контрактов еще не обновлен. Попробуйте обновить страницу или пересканировать сеть для поиска экземпляров контрактов.
 

Alcest

Модератор подраздела "Новости криптовалют"
Команда форума
Модератор
Крипто-блогер
Новостной редактор
Регистрация
13.05.2015
Сообщения
50,216
Реакции
23,282
Поинты
65.161
Теперь в тестовой сети можно провести имитацию участия в лотерее.
REMIX предлагает более десятка тестовых адресов с крупными балансами

Screenshot_35.jpg


Выбираем любой и внизу открываем вкладку Deployed Contracts и принимаем участие в лотерее. На примере внес 1 ETH

Screenshot_36.jpg
 

Alcest

Модератор подраздела "Новости криптовалют"
Команда форума
Модератор
Крипто-блогер
Новостной редактор
Регистрация
13.05.2015
Сообщения
50,216
Реакции
23,282
Поинты
65.161
6 участников лотереи вложили по 1 ETH и баланс пул теперь следовательно составляет 6 ETH

Screenshot_37.jpg
 

Alcest

Модератор подраздела "Новости криптовалют"
Команда форума
Модератор
Крипто-блогер
Новостной редактор
Регистрация
13.05.2015
Сообщения
50,216
Реакции
23,282
Поинты
65.161
Функция pickWinner использует случайное значение для выбора победителя из массива игроков.
Нажимая на соответсвующую кнопку проводится розыгрыш всего пула с условием:

рандомно выбирается случайный игрок, который забирает весь кэш.

Screenshot_39.jpg


После нажания баланс пула обнуляется и победитель получает все 6 ETH
То есть, свои 1 ETH + 5 ETH призовых сверху

Победителем стал этот адрес, баланс которого увеличился на 5 ETH

Screenshot_40.jpg
 
Сверху Снизу