Привет, незнакомец!

Похоже, вы здесь новенький. Чтобы принять участие, нажмите одну из кнопок ниже!

Смарт-контракт на Solidity: Часть 7 — ICO

отредактировано November 2017 Раздел: Смарт Контракты

Серия уроков были взяты с сайте inaword.ru

В сегодняшнем уроке вы узнаете как быстро создать смарт-контракт ico на ethereum. Конечно быстрый подход не лучший вариант когда вы работаете с деньгами. Но в учебных целях подойдет. Наш первый пример контракта ico на Solidity для Ethereum будет очень простым. А впоследствии мы будем его дополнять полезными фичами. Итак, приступим.

ICO — Initial Coin Offering. Первичное предложение токенов. Если вы вообще не знакомы с этим понятием, то сперва загляните на википедию. Вкратце на примере.

Допустим у группы людей появилась идея, но на ее реализацию нужны деньги. Тогда они рекламируют свою идею и призывают вложиться. Взамен они дают токены — валюту своего проекта. И как правило владельцам этих токенов что-то обещают. Например разделить между владельцами токенов какую-то часть прибыли проекта.

Жизненный цикл ICO может состоять из следующих стадий:

  1. Pre-sale — момент когда команда пробует продать токены узкуму кругу людей. Нужно чтобы оценить интерес и проверить готовность к основной продаже. Эта стадия может отсутствовать.
  2. Непосредственная открытая продажа токенов. Ну тут все ясно. Назначается дата, когда будет старт продаж. И начинается продажа. По наступлению какого-либо условия распродажа токенов заканчивается. Например по достижению необходимой суммы или наступлению даты окончания продажи.
  3. Выпуск токенов на биржи.

Мы сосредоточимся на второй части. Технически процесс прост. Инвестор отправляет эфир на контракт, отвечающий за распродажу. А контракт распродажи отдает команду выпустить токены и зачислить на ваш баланс.

Итак ICO состоит из двух контрактов:

  1. Контракт распродажи. Обычно называют Crowdsale.
  2. Контракт токена.

В предыдущем уроке мы уже реализовали свой токен ERC20. И он был создан с применением шаблонам MintableToken. Т.е. он уже содержит функцию, которая выпускает новые токены на адрес владельца. Нам осталось только написать контракт распродажи!

Давайте условимся что распродажа токенов будет начинаться 18 июля 2017 года в 15 часов по Москве и длиться будет 30 дней. В solidity дата представляется в UNIX формате. Это количество секунд с 1 января 1970 года (можно воспользоваться сервисом перевода тут). При этом время должно быть указано не местное, а относительно Гринвичевского меридиана GMT. Итак разница между Москвой и GMT у нас + 3 часа. Тогда время начал распродажи по GMT — 18 июля 2017 года 12.00. Теперь воспользуемся сервисом перевода в UNIX формат и получим — 1500379200. Эта дата актуальна момент написания статьи. Поскольку дальше мы будем тестировать наш контракт, то лучше указать дату вчерашнего дня.

Итак в нашем контракте Сrowdsale буду следующие переменные

  1. start — дата начала распродажи наших токенов в UNIX формате
  2. token — контракт нашего токена
  3. owner — адрес владельца контракта распродажи. На этот адрес мы будем отправлять вырученные деньги.
  4. period — сколько дней будет длиться распродажа

Когда пользователь нам пришлет деньги мы проверим что текущая дата больше чем дата начала распродажи и меньше чем дата конца распродажи. Если так, то эфир, который нам прислал пользователь мы мы переведем на счет владельца контракта. А затем выполним выпуск токенов на счет пользователя посредством вызова mint. Давайте запишем условие проверки:

now > start && now < start + period*24*60*60

Тут мы познакомились со специальными операторами now — возвращает текущую дату, а 2460*60 — это перевод дней в секунды. Ничего сложного.

Осталось ответить на вопрос — как контракт узнает, что пользователь хочет купить у нас токены? Когда на контракт пересылается эфир, то у контракта вызывается специальная функция — fallback function.

function() external payable {
   ....
}

Модификатор payable ставится в тех функциях, которые принимают эфир. А сколько именно пользователь прислал эфира хранится тут msg.value.

Мы во всем разобрались и теперь можем написать наш контракт распродажи:

contract Crowdsale {

    address owner;

    SimpleTokenCoin public token = new SimpleTokenCoin();

    uint start = 1500379200;

    uint period = 28;

    function Crowdsale() {
        owner = msg.sender;
    }

    function() external payable {
        require(now > start && now < start + period*24*60*60);
        owner.transfer(msg.value);
        token.mint(msg.sender, msg.value);
    }

}

У нас тут одна незнакомая функция owner.transfer — она просто пересылает эфир на счет owner’а.

Наш контракт токена указан со словом public. Это нам необходимо для того чтобы можно было узнать адрес контракта токена в remix после создания crowdsale. Зная адрес контракта мы сможем вызывать его функции и тестировать наш ICO.

Давайте попробуем — залейте наш Crowdsale контракт в блокчейн (и не забудьте про код токена из предыдущего урока). Теперь у нас несколько контрактов поэтому во время заливки в блокчейн не забудьте выбрать тот, который заливаем — Crowdsale.

Функции отправить в Remix в явном виде нет. Зато перед вызовом функции всегда можно указать количество эфира. Поэтому мы будем указывать эфир и явно вызывать Fallback функцию. Итак давайте попробуем купить монетки.

Теперь выберете в поле Account другой адрес. И теперь попробуем купить с этого адреса наши монетки. Укажите в поле Value — 10. А затем вызовите функцию Fallback.

Если вы все сделали верно то в консоле ошибок не должно быть.

Если все же были ошибки, то проверьте дату начала распродажи.

Теперь проверим — на счету текущего аккаунта должно быть 10 наших токенов. Чтобы это проверить нужно вызвать balanceOf у нашего контракта токена. Мы сделали поле адреса токена в нашем контракте Crowdsale публичным. Поэтому можем посмотреть адрес. Радом с синим полем token внизу рядом с надписью address. Скопируйте его.

Затем выбрите из списка контрактов контракт нашего токена SimpleTokenCoin.

Теперь в поле рядом с кнопочкой «At address» вставьте скопированный адрес и нажмите зеленую кнопочку «At address».

Теперь ниже у вас должна появится панель управления контрактом токена.

Теперь скопируйте адрес текущего акканта:

И вызовите функцию balanceOf у контракта вставив туда адрес текущего аккаунта.

Как видим на балансе появилось 1000000000000000000 токенов. 18 нулей после единицы. На самом деле 1 эфир тоже так записан внутри блокчейна. В кошельках отображается все что больше 18 разряда как целая часть. Если вы будете тестировать свой контракт в реальном блокчейне, то в кошельке нужно указать что у вас 18 знаков после запятой и тогда кошелек отобразит 1.

Если вы залили наш контракт в реальный блокчейн. То нужно узнать адрес контракта токена, а затем добавить информацию о монете в кошелек: адрес, название и количество знаков после запятой. Вот так в MyEtherWallet выглядит добавление токена ICE из этой статьи.

Наш контракт ICO готов! В следующем уроке мы проведем рефакторинг. Назначим сумму которую хотим собрать и выделим токены для себя и баунти-кампаний.

Продолжение читать тут.

Войдите или Зарегистрируйтесь чтобы комментировать.