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

Автор: admin от 17-04-2017, 03:20, посмотрело: 1971

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


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


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


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


Хотя они и находятся в одном списке с 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



Источник: Хабрахабр

Категория: Программирование, Криптография

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Добавление комментария

Имя:*
E-Mail:
Комментарий:
Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера
Введите два слова, показанных на изображении: *