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

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

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

отредактировано December 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 готовий! На наступному уроці ми проведемо рефакторинг. Призначимо суму, яку хочемо зібрати, і виділимо токени для себе і баунті-кампаній.

Продовження читати тут.

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