Общая рыночная капитализация глобального рынка криптовалют за последний год выросла с $6 млрд (в январе 2016 года) до $28 млрд (на текущий момент). С начала 2017 года рынок криптовалют вырос примерно в полтора раза. На биржах торгуются уже больше сотни разных криптовалют. Крупные организации объединяются в консорциумы, чтобы выпускать свою валюту. Даже государства делают свои национальные криптовалюты. Технологии блокчейна дошли до такого уровня, что уже почти любой может запустить свою криптовалюту, чем мы в этой статье и займемся. Легче всего создать свои монеты на смарт контрактах на базе ethereum.
Зайдя на крупнейшую в настоящий момент биржу криптовалют, вверху списка можно найти к примеру следующие валюты: GNT (Golem), REP (Augur).
Хотя они и находятся в одном списке с 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](https://www.icoalert.com )
Автор: r-kamenskiy