Содержание

Деплой (развертывание) смарт-контракта в сеть Ethereum

В одном из уроков описано, как создать смарт контракт на Solidity в блокчейне Ethereum.

В том уроке разработка велась локально. В этом уроке будет подробно описано, как развернуть (задеплоить) контракт в тестовую сеть Ethereum.

Для деплоя контракта в сеть Ethereum Вам понадобится браузер Google Chrome, Firefox или Opera.

Шаг 1. Установка Metamask.

Для начала нужно установить в браузер расширение Metamask. Именно через Metamask контракт будет выгружаться в сеть Эфириум. Устанавливается он очень просто — найдите Metamask среди расширений Вашего браузера и установите. В Google Chrome после установки должен появиться значок метамаска в правом верхнем углу.

Иконка metamask в Google Chrome

А вот официальный сайт метамаска — https://metamask.io.

Нажмите на значок метамаска в Вашем браузере. Должен открыться интерфейс метамаска.

При первом входе нужно задать пароль, который будет использоваться в последующих входах в приложение. После входа в метамаск в левом верхнем углу выберите Ropsten Test Network. Это тестовая сеть Ropsten. Теперь именно в эту сеть будут деплоиться контракты. Если в будущем понадобится выгрузить контракт в другую тестовую сеть или в главную сеть Ethereum, то нужно будет сделать соответствующий выбор в metamask.

Шаг 2. Пополнение эфира в сети Ropsten.

Для того, чтобы выгрузить контракт в сеть Ethereum, Вам понадобится некоторое количество эфира (криптовалюты сети Ethereum). Для получения эфира в тестовой сети Ropsten зайдите на сайт http://faucet.ropsten.be:3001.

После этого откройте Ваш метамаск и справа от аккаунта нажмите на 3 точки.

В выпавшем окне нажмите “Copy Address to clipboard”. После этого адрес Вашего аккаунта скопируется, и его нужно вставить в поле на сайте http://faucet.ropsten.be:3001. На этом же сайте нажмите на кнопку “Send me 3 test ether!”. Через некоторое время на Вашем аккаунте появятся эфиры.

Шаг 3. Компиляция кода в Remix.

Не нужно ждать, пока на аккаунте появятся эфира. Введите в адресной строке браузера “remix.ethereum.org”. Перед Вами откроется редактор Remix. Удалите весь код из Remix и вставьте следующий код:

pragma solidity ^0.4.16;

interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public; }

contract TokenERC20 {
    // Public variables of the token
    string public name;
    string public symbol;
    uint8 public decimals = 18;
    // 18 decimals is the strongly suggested default, avoid changing it
    uint256 public totalSupply;

    // This creates an array with all balances
    mapping (address => uint256) public balanceOf;
    mapping (address => mapping (address => uint256)) public allowance;

    // This generates a public event on the blockchain that will notify clients
    event Transfer(address indexed from, address indexed to, uint256 value);

    // This notifies clients about the amount burnt
    event Burn(address indexed from, uint256 value);

    /**
     * Constrctor function
     *
     * Initializes contract with initial supply tokens to the creator of the contract
     */
    function TokenERC20(
        uint256 initialSupply,
        string tokenName,
        string tokenSymbol
    ) public {
        totalSupply = initialSupply * 10 ** uint256(decimals);  // Update total supply with the decimal amount
        balanceOf[msg.sender] = totalSupply;                // Give the creator all initial tokens
        name = tokenName;                                   // Set the name for display purposes
        symbol = tokenSymbol;                               // Set the symbol for display purposes
    }

    /**
     * Internal transfer, only can be called by this contract
     */
    function _transfer(address _from, address _to, uint _value) internal {
        // Prevent transfer to 0x0 address. Use burn() instead
        require(_to != 0x0);
        // Check if the sender has enough
        require(balanceOf[_from] >= _value);
        // Check for overflows
        require(balanceOf[_to] + _value > balanceOf[_to]);
        // Save this for an assertion in the future
        uint previousBalances = balanceOf[_from] + balanceOf[_to];
        // Subtract from the sender
        balanceOf[_from] -= _value;
        // Add the same to the recipient
        balanceOf[_to] += _value;
        Transfer(_from, _to, _value);
        // Asserts are used to use static analysis to find bugs in your code. They should never fail
        assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
    }

    /**
     * Transfer tokens
     *
     * Send `_value` tokens to `_to` from your account
     *
     * @param _to The address of the recipient
     * @param _value the amount to send
     */
    function transfer(address _to, uint256 _value) public {
        _transfer(msg.sender, _to, _value);
    }

    /**
     * Transfer tokens from other address
     *
     * Send `_value` tokens to `_to` on behalf of `_from`
     *
     * @param _from The address of the sender
     * @param _to The address of the recipient
     * @param _value the amount to send
     */
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        require(_value <= allowance[_from][msg.sender]);     // Check allowance
        allowance[_from][msg.sender] -= _value;
        _transfer(_from, _to, _value);
        return true;
    }

    /**
     * Set allowance for other address
     *
     * Allows `_spender` to spend no more than `_value` tokens on your behalf
     *
     * @param _spender The address authorized to spend
     * @param _value the max amount they can spend
     */
    function approve(address _spender, uint256 _value) public
        returns (bool success) {
        allowance[msg.sender][_spender] = _value;
        return true;
    }

    /**
     * Set allowance for other address and notify
     *
     * Allows `_spender` to spend no more than `_value` tokens on your behalf, and then ping the contract about it
     *
     * @param _spender The address authorized to spend
     * @param _value the max amount they can spend
     * @param _extraData some extra information to send to the approved contract
     */
    function approveAndCall(address _spender, uint256 _value, bytes _extraData)
        public
        returns (bool success) {
        tokenRecipient spender = tokenRecipient(_spender);
        if (approve(_spender, _value)) {
            spender.receiveApproval(msg.sender, _value, this, _extraData);
            return true;
        }
    }

    /**
     * Destroy tokens
     *
     * Remove `_value` tokens from the system irreversibly
     *
     * @param _value the amount of money to burn
     */
    function burn(uint256 _value) public returns (bool success) {
        require(balanceOf[msg.sender] >= _value);   // Check if the sender has enough
        balanceOf[msg.sender] -= _value;            // Subtract from the sender
        totalSupply -= _value;                      // Updates totalSupply
        Burn(msg.sender, _value);
        return true;
    }

    /**
     * Destroy tokens from other account
     *
     * Remove `_value` tokens from the system irreversibly on behalf of `_from`.
     *
     * @param _from the address of the sender
     * @param _value the amount of money to burn
     */
    function burnFrom(address _from, uint256 _value) public returns (bool success) {
        require(balanceOf[_from] >= _value);                // Check if the targeted balance is enough
        require(_value <= allowance[_from][msg.sender]);    // Check allowance
        balanceOf[_from] -= _value;                         // Subtract from the targeted balance
        allowance[_from][msg.sender] -= _value;             // Subtract from the sender's allowance
        totalSupply -= _value;                              // Update totalSupply
        Burn(_from, _value);
        return true;
    }
}

Данный код скопирован с сайта ethereum.org/token

В правой части Remix на вкладке “Compile” Вы увидите, как скомпилировался код. Если код не скомпилировался автоматически, то нажмите кнопку “Start to compile”. Поставьте галочку рядом с “Auto compile” для автоматической компиляции в дальнейшем.

На данный момент Вы должны видеть примерно следующее:

Отсутствие ошибок при компиляции позволяет задеплоить контракт в сеть.

Шаг 4. Деплой контракта в Ethereum через Remix.

Рядом с вкладкой “Compile” перейдите на вкладку “Run”.

Здесь нужно обратить внимание на следующее:

  • Environment — должно быть выбрано “Injected Web3”;
  • Account — здесь автоматически подключится аккаунт, выбранный в metamask;
  • Gas limit и Value изменять не нужно;
  • В следующем поле должен быть выбран “TokenERC20”. Если не выбран, выберите самостоятельно. Это контракт, который будет деплоиться в сеть;
  • Ниже рядом с кнопкой “Create” нужно заполнить количество выпускаемых токенов, название токена и символ токена. Заполняйте как на картинке выше (через запятую, название и символ токена в кавычках).  В коде контракта данные параметры можно найти в следующей функции:
    function TokenERC20(
            uint256 initialSupply,
            string tokenName,
            string tokenSymbol
        )

    Такая функция, имя которой совпадает с именем самого контракта (TokenERC20), называется конструктором контракта. Конструктор контракта выполняется в момент деплоя. Таким образом, в момент деплоя будет выпущено заданное количество токенов с указанными названием и символом.

После этого нужно нажать на кнопку “Create”.

Откроется metamask.

Если возникли какие-то сложности, убедитесь, что аккаунты в Remix и в Metamask совпадают.

В открывшемся окне metamask нажмите кнопку “Submit”.

После этого в правой части Remix должна отображаться строка “1 pending transactions”.

Pending transaction в Remix.

Это означает, что Ваша транзакция (транзакция по созданию смарт контракта) находится в ожидании. Через некоторое время (в сети Ropsten это обычно занимает до минуты) ниже отобразится готовый смарт контракт. Смарт контракт в Remix будет выглядеть примерно так:

Данный контракт также можно посмотреть на сайте https://ropsten.etherscan.io. Для этого скопируйте адрес созданного смарт контракта в Remix, нажав на соответствующую кнопку рядом с названием смарт контракта. Скопированный адрес вставьте в поле поиска на сайте etherscan.Поиск контракта в Etherscan.

Нажмите на клавиатуре Enter, и откроется страница с Вашим контрактом.

Также, можно найти смарт контракт через metamask. В metamask том же окне, где Вы копировали адрес аккаунта, нажмите “View account on Etherscan”. И Вы перейдете на сайт https://ropsten.etherscan.io, а именно на страницу Вашего аккаунта. Здесь можно смотреть все транзакции Вашего аккаунта, в том числе транзакции по созданию контрактов.

Смотрите полный разбор кода контракта токена в уроке “Создание токена ERC20 в Ethereum для ICO“.

Материал был полезен? Поделитесь в соц. сетях:
Логотип echain.ru

Добавить комментарий

Ваш e-mail не будет опубликован.