Создаем токен в сети Ethereum

Создаем свой Ethereum токен

Давайте создадим свой простой токен в Ethereum. Это будет полностью работоспособный токен стандарта ERC20. Его можно будет добавить в Метамаск, отправить друзьям и даже использовать в ICO.

Чтобы лучше понять как работают токены и смарт-контракты давайте прыгнем сразу с места в карьер — создадим в тестовой сети Ethereum Ropsten простой токен. Я думаю лучше начать изучение смарт-контрактов именно так, чтобы почувствовать вкус происходящего. Пока что предварительно вам знать ничего не надо, просто делайте как описано ниже. Уже потом в процессе изучения последующих уроков вы поймете что значит та или иная функция.

На заметку: смарт-контрактом называется любой код, работающий в сети Эфира. Будь то токен или игра, или аукцион или еще что — все это смарт-контракты.
Что нам потребуется?

  • Метамаск
  • сайт http://remix.ethereum.org/
  • сайт https://www.myetherwallet.com/

Никаких установок Geth и долгих мучительных скачиваний блокчейна не требуется.

Итак, установите Метамаск, если он у вас еще не установлен и переключитесь на тестовую сеть Ropsten. Если у вас есть реальные эфиры в реальной сети и вы хотите сделать токен в реальной сети, то останьтесь в Mainnet. Комиссия за создание токена составит примерно 0,05-0,06 эфира.

Если создаете токен в тестовой сети, то зайдите на фаусет https://faucet.metamask.io/ и получите там 1 эфир, он будет нужен для оплаты комиссии.

Тестовая сеть идентична реальной и используется для бесплатных экспериментов со смарт-контрактами.

Код токена

Ниже размещен код нашего токена. Это простой токен. Что я подразумеваю под простым токеном? Есть токены с краудсейлами, баунти, эирдропами и т.д. У нас же будет простой токен без всех этих вещей, в последующих уроках напишем и краудсейлы, и баунти и т.д. Несмотря на то что это простой токен, он вполне работоспособен и соответствует стандарту ERC20. Эмиссия токена будет составлять 10 000 000 (десять миллионов) штук, токен будет называться SET, описанием будет Simple Ethereum Token. Название, описание и количествово токенов можно изменить в первых строчках кода.

Откройте сайт http://remix.ethereum.org, удалите имеющийся там код и вставьте код нашего токена.

В Remix-е перейдите на вкладку Settings и измените версию Solidity на 0.4.21

Настройка Remix

После этого вернитесь на вкладку Compile и нажмите Start to compile. Дождитесь окончания компиляции (обычно несколько секунд) и нажмите на Details.

Откроется всплывающее окно с необходимыми нам данными — Байткодом и ABI. В байткоде нам необходимо скопировать то, что находится в поле object: от кавычек до кавычек. Скопируйте и сохраните в блокнот или другой редактор, ABI скопируйте полностью и тоже сохраните в блокнот. В моем случае Bytecode и ABI выглядят так:

Bytecode

6060604052341561000f57600080fd5b601260ff16600a0a6298968002600081905550601260ff16600a0a6298968002600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff1660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef601260ff16600a0a62989680026040518082815260200191505060405180910390a3611174806100dd6000396000f3006060604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100bf578063095ea7b31461014d57806318160ddd146101a757806323b872dd146101d0578063313ce56714610249578063378dc3dc1461027857806366188463146102a157806370a08231146102fb57806395d89b4114610348578063a9059cbb146103d6578063d73dd62314610430578063dd62ed3e1461048a575b600080fd5b34156100ca57600080fd5b6100d26104f6565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101125780820151818401526020810190506100f7565b50505050905090810190601f16801561013f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015857600080fd5b61018d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061052f565b604051808215151515815260200191505060405180910390f35b34156101b257600080fd5b6101ba610621565b6040518082815260200191505060405180910390f35b34156101db57600080fd5b61022f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061062a565b604051808215151515815260200191505060405180910390f35b341561025457600080fd5b61025c6109b9565b604051808260ff1660ff16815260200191505060405180910390f35b341561028357600080fd5b61028b6109be565b6040518082815260200191505060405180910390f35b34156102ac57600080fd5b6102e1600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506109ce565b604051808215151515815260200191505060405180910390f35b341561030657600080fd5b610332600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c4f565b6040518082815260200191505060405180910390f35b341561035357600080fd5b61035b610c98565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561039b578082015181840152602081019050610380565b50505050905090810190601f1680156103c85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103e157600080fd5b610416600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610cd1565b604051808215151515815260200191505060405180910390f35b341561043b57600080fd5b610470600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ed5565b604051808215151515815260200191505060405180910390f35b341561049557600080fd5b6104e0600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506110c1565b6040518082815260200191505060405180910390f35b6040805190810160405280601581526020017f53696d706c6520457468657265756d20546f6b656e000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60008054905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561066757600080fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156106b557600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561074057600080fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b601260ff16600a0a629896800281565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080831115610adf576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610b63565b828103600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6040805190810160405280600381526020017f534554000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610d0e57600080fd5b81600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610d5c57600080fd5b81600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050929150505600a165627a7a72305820c9398ad1b13b5cf341a545adbcc39ca80078948a31f68888b23eafc4542239e20029

[свернуть]
ABI

[ { «constant»: true, «inputs»: [], «name»: «name», «outputs»: [ { «name»: «», «type»: «string» } ], «payable»: false, «stateMutability»: «view», «type»: «function» }, { «constant»: false, «inputs»: [ { «name»: «_spender», «type»: «address» }, { «name»: «_value», «type»: «uint256» } ], «name»: «approve», «outputs»: [ { «name»: «», «type»: «bool» } ], «payable»: false, «stateMutability»: «nonpayable», «type»: «function» }, { «constant»: true, «inputs»: [], «name»: «totalSupply», «outputs»: [ { «name»: «», «type»: «uint256» } ], «payable»: false, «stateMutability»: «view», «type»: «function» }, { «constant»: false, «inputs»: [ { «name»: «_from», «type»: «address» }, { «name»: «_to», «type»: «address» }, { «name»: «_value», «type»: «uint256» } ], «name»: «transferFrom», «outputs»: [ { «name»: «», «type»: «bool» } ], «payable»: false, «stateMutability»: «nonpayable», «type»: «function» }, { «constant»: true, «inputs»: [], «name»: «decimals», «outputs»: [ { «name»: «», «type»: «uint8» } ], «payable»: false, «stateMutability»: «view», «type»: «function» }, { «constant»: true, «inputs»: [], «name»: «initialSupply», «outputs»: [ { «name»: «», «type»: «uint256» } ], «payable»: false, «stateMutability»: «view», «type»: «function» }, { «constant»: false, «inputs»: [ { «name»: «_spender», «type»: «address» }, { «name»: «_subtractedValue», «type»: «uint256» } ], «name»: «decreaseApproval», «outputs»: [ { «name»: «», «type»: «bool» } ], «payable»: false, «stateMutability»: «nonpayable», «type»: «function» }, { «constant»: true, «inputs»: [ { «name»: «_owner», «type»: «address» } ], «name»: «balanceOf», «outputs»: [ { «name»: «», «type»: «uint256» } ], «payable»: false, «stateMutability»: «view», «type»: «function» }, { «constant»: true, «inputs»: [], «name»: «symbol», «outputs»: [ { «name»: «», «type»: «string» } ], «payable»: false, «stateMutability»: «view», «type»: «function» }, { «constant»: false, «inputs»: [ { «name»: «_to», «type»: «address» }, { «name»: «_value», «type»: «uint256» } ], «name»: «transfer», «outputs»: [ { «name»: «», «type»: «bool» } ], «payable»: false, «stateMutability»: «nonpayable», «type»: «function» }, { «constant»: false, «inputs»: [ { «name»: «_spender», «type»: «address» }, { «name»: «_addedValue», «type»: «uint256» } ], «name»: «increaseApproval», «outputs»: [ { «name»: «», «type»: «bool» } ], «payable»: false, «stateMutability»: «nonpayable», «type»: «function» }, { «constant»: true, «inputs»: [ { «name»: «_owner», «type»: «address» }, { «name»: «_spender», «type»: «address» } ], «name»: «allowance», «outputs»: [ { «name»: «», «type»: «uint256» } ], «payable»: false, «stateMutability»: «view», «type»: «function» }, { «inputs»: [], «payable»: false, «stateMutability»: «nonpayable», «type»: «constructor» }, { «anonymous»: false, «inputs»: [ { «indexed»: true, «name»: «from», «type»: «address» }, { «indexed»: true, «name»: «to», «type»: «address» }, { «indexed»: false, «name»: «value», «type»: «uint256» } ], «name»: «Transfer», «type»: «event» }, { «anonymous»: false, «inputs»: [ { «indexed»: true, «name»: «owner», «type»: «address» }, { «indexed»: true, «name»: «spender», «type»: «address» }, { «indexed»: false, «name»: «value», «type»: «uint256» } ], «name»: «Approval», «type»: «event» } ]

[свернуть]

Деплоим смарт-контракт в MyEtherWallet

Теперь открывайте https://www.myetherwallet.com/ — именно здесь мы задеплоим наш контракт. Если вы хотите создать токен в тестовой сети, то в правом верхнем выпадающем списке выберите Network Ropsten (Myetherapi.com). Если в реальной сети, то останьтесь в ETH (Myetherapi). Я буду создавать токен в тестовой сети.

В верхнем меню выберите контракт и нажмите подменю Опубликовать контракт.

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

Вот и готов наш токен. Теперь его нужно добавить в Метамаск или MyEtherWallet. Для этого нам потребуется адрес контракта. Запомните: при деплое любого контракта блокчейн Эфира автоматически создает адрес контракта. Не путайте его с адресом своего кошелька.

Чтобы узнать адрес созданного контракта перейдите в https://ropsten.etherscan.io и введите в поиск адрес своего кошелька. В списке транзакций вы увидите запись под названием Contract Creation. Выглядит это так:

Адрес контракта

Жмите на Contract Creation и перейдете на страницу со своим контрактом. Копируйте адрес контракта и добавляйте его в Метамаск или MyEtherWallet, а после этого можете рассылать свой токен друзьям и знакомым.

Стоимость деплоя смарт-контракта

Апдейт от 11.08.2018

Вы можете видеть что в нашем контракте есть определенное количество переменных и функций. Каждая переменная и функция стоит определенное количество газа — запомните это! Чем больше функций будет в нашем токене, тем больше газа он потребует на свой деплой. В Эфире есть такое понятие как лимит газа, он плавающий и составляет примерно 7 000 000. Это сделано для того чтобы какой-нибудь «хороший» гражданин не надумал сделать бесконечный цикл, например. Наш вышесозданный контракт требует примерно 1 000 000 газа. Это значит что вы не сможете задеплоить контракт, состоящий, например, из 10 000 строчек кода и выполняющий невообразимые вещи. Это возможно, но код придется разносить по нескольким контрактам и деплоить их по отдельности. Например игры, созданные на Ethereum, могут состоять из 10-20-30 контрактов, подключающихся друг к другу с помощью интерфейсов. Но об этом поговорим в следубщих уроках.

Есть хороший сайт https://ethgasstation.info/  . Сайт показывает текущую стоимость газа в гвеях.

Стоимость газа в Ethereum

На скриншоте я отметил то, на что надо обратить внимание.

Предположим, вам надо задеплоить контракт или просто перевести Эфиры со своего адреса на адрес биржи. Вы заходите на этот сайт, смотрите сколько стоит сейчас газ, потом открываете Метамаск и при совершении транзакции указываете немного большее количество гвеев, чем указано. Если на скриншоте сейчас 3,1 , то в Метамаске укажите 3,5 (обязательно через запятую).

Почему это важно? Метамаск научился определять нужное кол-во гвеев, однако он не учитывает цифры после запятой. То есть если газ стоит 3,1 ,  Метамаск предложит вам 3. И этой самой 0,1 может не хватить вам для проведения транзакции, она будет висеть в пендингах часы или даже сутки. Поэтому всегда немножко прибавляйте.

Вначале статьи я написал что деплой контракта вам обойдется в 0,05-0,06 эфира. Это при стоимости газа в 21 гвей. Вы можете (не) много сэкономить если будете смотреть стоимость газа на https://ethgasstation.info/. При стоимости газа 3,5 контракт обойдется уже в 0.0135 ETH. Если сеть сейчас штормит и стоимость зашкаливает за 60-70 гвей (что стало не редкостью), то иногда стоит подождать несколько часов пока все устаканится.

Читайте также:

Поделиться:

Комментарии 4

  • Можно и не пихать байткод в майэфирваллет, а сразу из ремикса в метамаск

    • Можно, просто Ремикс не умел определять нужное количество газа для деплоя, а MyEtherWallet умел :))

  • Хорошая заметка, но непонятно, что произойдёт в случае направления эфира на адрес контракта? Откуда возьмётся стоимость одной единицы токенов?!

    • Если вы имеете в виду этот простой токен, то он не предназначен для приема эфиров. Если на него их отправить, то они вернутся отправителю назад, а в Эферскане высветится ошибка.
      А если имеете ввиду токен из статьи про ICO https://contractcreator.ru/ethereum/sozdaem-kontrakt-dlya-ico-chast-1/ , то там за прием отвечает безымянная функция

      function() public payable{
      _buy(msg.sender, msg.value);
      }

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *