Своя криптовалюта на ethereum

93e8dd767e0c469483bf5d8aa5277bfd.png


Общая рыночная капитализация глобального рынка криптовалют за последний год выросла с $6 млрд (в январе 2016 года) до $28 млрд (на текущий момент). С начала 2017 года рынок криптовалют вырос примерно в полтора раза. На биржах торгуются уже больше сотни разных криптовалют. Крупные организации объединяются в консорциумы, чтобы выпускать свою валюту. Даже государства делают свои национальные криптовалюты. Технологии блокчейна дошли до такого уровня, что уже почти любой может запустить свою криптовалюту, чем мы в этой статье и займемся. Легче всего создать свои монеты на смарт контрактах на базе ethereum.


Зайдя на крупнейшую в настоящий момент биржу криптовалют, вверху списка можно найти к примеру следующие валюты: GNT (Golem), REP (Augur).


769ead1610854a6e95d5a74240e29888.png


Хотя они и находятся в одном списке с Bitcoin (первая и самая известная криптовалюта) и Ethereum (вторая по популярности и капитализации валюта) — они не являются самостоятельными криптовалютами в классическом их понимании. Они являются крипто-токенами (tokens или assets) на базе блокчейна ethereum.


Список подобных токенов можно найти например здесь, там же можно найти статистику по ним.


Нужны подобные токены обычно для следующего: какая-то компания хочет выпустить продукт, в котором нужна некая внутренняя валюта. Также эта компания хочет провести ICO (Initial Coin Offering), т.е. собрать денег на проект путём предварительной продажи токенов инвесторам. Так и появляются эти токены. Преимущества здесь прямо истекают из преимуществ блокчейна и смарт контрактов: прозрачность, защищенность и распределенность.


Например, посмотрим на одну из первых таких компаний Golem. Суть её заключается в следующем: когда нам понадобятся вычислительные мощности, мы можем идти не на Amazon (Azure, Google…), а арендовать компьютер у другого участника сети, расплатившись с ним GNT токенами. Соответственно, также можно сдать свой компьютер в аренду и получить некоторое количество GNT. Дальше эти токены можно либо тратить внутри сети, либо продать на бирже. Некоторые токены могут приносить дивиденды, либо давать права голоса на проводимых выборах о каких-либо вопросах связанных с продуктом компании (такое реализуется на смарт контрактах).


Golem, выпустив 1,000,000,000 токенов, смогли привлечь 820,000 ETH, что по текущему курсы составляет примерно $32,800,000, но во времена их ICO курс был раза в 3 хуже.


Сейчас я вам расскажу, как сделать свою подобную криптовалюту (tokens) на базе Ethereum.


В настоящий момент стандартом считается ERC20, описанный здесь.


Интерфейс обычно выглядит примерно так:


/*
 * ERC20 interface
 * see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 {
  uint public totalSupply;
  function balanceOf(address who) constant returns (uint);
  function transfer(address to, uint value);
  function allowance(address owner, address spender) constant returns (uint);

  function transferFrom(address from, address to, uint value);
  function approve(address spender, uint value);

  event Transfer(address indexed from, address indexed to, uint value);
  event Approval(address indexed owner, address indexed spender, uint value);
}

А реализация примерно так:


contract StandardToken is ERC20 {

  string public constant name = "Token Name";
  string public constant symbol = "TKN";
  uint8 public constant decimals = 18; 

  mapping (address => mapping (address => uint)) allowed;
  mapping (address => uint) balances;

  function transferFrom(address _from, address _to, uint _value) {
    var _allowance = allowed[_from][msg.sender];

    // Check is not needed because safeSub(_allowance, _value) will already throw if this condition is not met
    // if (_value > _allowance) throw;

    balances[_to] +=_value;
    balances[_from] -= _value;
    allowed[_from][msg.sender] -= _value;
    Transfer(_from, _to, _value);
  }

  function approve(address _spender, uint _value) {
    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
  }

  function allowance(address _owner, address _spender) constant returns (uint remaining) {
    return allowed[_owner][_spender];
  }

  function transfer(address _to, uint _value) {
    balances[msg.sender] -= _value;
    balances[_to] += _value;
    Transfer(msg.sender, _to, _value);
  }

  function balanceOf(address _owner) constant returns (uint balance) {
    return balances[_owner];
  }
}

Разберем подробнее.


Это текущее количество выпущенных монет:


uint public totalSupply;

Узнаём баланс по адресу:


function balanceOf(address who) constant returns (uint);

Переводим свои токены кому-то другому:


function transfer(address to, uint value);

Узнаём сколько монет нам разрешено потратить с чужого аккаунта. Управление этими разрешениями осуществляется функцией approve, описанной ниже:


function allowance(address owner, address spender) constant returns (uint);

Переводим чужие, но доступные нам токены кому-то другому:


function transferFrom(address from, address to, uint value);

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


function approve(address spender, uint value);

События о том, что кто-то перевел токены и о том, что кто-то разрешил пользоваться своими токенами:


event Transfer(address indexed from, address indexed to, uint value);
event Approval(address indexed owner, address indexed spender, uint value);

Полное имя токена:


string public constant name = "Token Name";

Краткое имя токена:


string public constant symbol = "TKN";

Количество десятичных разрядов. В ETH их 18, но можно поставить другое число


uint8 public constant decimals = 18; 

Словарь адрес → количество токенов:


mapping (address => uint) balances;

Словарь доступных для распоряжения кому-то другому токенов:


mapping (address => mapping (address => uint)) allowed;

Вот, в принципе и все. Но в данном виде смарт контракт бесполезен, т.к. сейчас не предусматривает создание токенов и их количество всегда будет равно нулю.


Добавим конструктор, который будет создавать 1,000,000 токенов и переводить их владельцу смарт контракта. Также не помешало бы все математичекие операции сопровождать проверками на переполнение, но здесь я это упущу.


function StandardToken(){
  balances[msg.sender] = 1000000;
}

Не помешало бы и добавить функцию, которая позволит покупать токены. Для простоты будем чеканить токены по курсу 1 к 1, т.е. за 1 ETH будем начислять 1 наш токен.
Выглядеть она может например так:


function mint() payable external {
  if (msg.value == 0) throw;

  var numTokens = msg.value;
  totalSupply += numTokens;

  balances[msg.sender] += numTokens;

  Transfer(0, msg.sender, numTokens);
}

Осталось это опубликовать в блокчейн. После этого можно будет пересылать эти токены на другие аккаунты.


Полезные ссылки по теме:


→ Статистика по токенам
→ Список активных и грядущих ICO

Комментарии (1)

  • 17 апреля 2017 в 01:12

    +1

    Вчера для себя открыл Storj, Sia — проекты предназначены для объединения хранилищ, то есть вы условно даете в аренду ваше дисковое пространство на компьютере, взамен получаете монетки. Сейчас вот благодаря вам открыл Golem. Что интересно, как по мне именно такие проекты достойны внимания, так как обыкновенный майнинг, где мы тупо вычисляем хэш, без какой-либо полезной работы не имеет никакого смысла, и эти пузыри должны со временем лопнуть.

© Habrahabr.ru