Команда (фрилансеры)

Набираем команду фрилансеров, Вы:

  • Программист,
  • Дизайнер,
  • SEO-специалист,
  • Менеджер

Разработка на заказ

Наша команда фрилансеров выполнит
работы на заказ:

Создание и раскрутка сайтов
Разработка приложений (мобайл, десктоп, сервер)
Разработка игр (веб, мобайл, 3D)
Аутсорсинг, фриланс

Контакты
vk.com/sitev_ru
Skype: sitev.ru
E-mail: mike@sitev.ru
github.com/sitev

Рейтинг@Mail.ru

Besucherzahler
счетчик посещений
Сайт на C++
Наш сайт работает на C++ и это очень круто! =))

Пишем свою монету для Ethereum!

Прежде чем читать эту статью, прочитайте http://sitev.ru/post/180, иначе будет ничего не понятно.

Монетой или токеном называют смарт-контракт, если он отвечает стандарту ERC20

По-моему, это набор каких-то непонятных слов. Ну чтож, разбираемся дальше.

Чтобы смарт-контракт считался денежкой он должен содержать:

1. Методы

function totalSupply() constant returns (uint256 totalSupply)
function balanceOf(address _owner) constant returns (uint256 balance)
function transfer(address _to, uint256 _value) returns (bool success)
function transferFrom(address _from, address _to, uint256 _value) returns (bool success)
function approve(address _spender, uint256 _value) returns (bool success)
function allowance(address _owner, address _spender) constant returns (uint256 remaining)

2. События

event Transfer(address indexed _from, address indexed _to, uint256 _value)
event Approval(address indexed _owner, address indexed _spender, uint256 _value)

3. Поля

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

Рассмотрим эти требования подробней:

totalSupply() - возвращает суммарное количество выпущенных монет (функцию может вызвать любой) balanceOf() - возвращает количество монет принадлежащих _owner (может вызвать любой). Кошельки для отображения вашей монеты вызывают именно эту функцию transfer() - передаёт _value монет на адрес _to, для перемещения пользователем своих монет на другой адрес. Метод должен создавать событие Transfer в случае успешного перемещения монет transferFrom() - передает _ value монет от _from к _to, тоже самое что и transfer(), но не своих монет, а монет доверенного лица (нужно иметь разрешение на перемещение монет между адресами) approve() - разрешает пользователю _spender снимать с вашего счета средства не более чем _value с помощью функции transferFrom. Метод должен создавать событие Approval allowance() - возвращает сколько монет со своего счета разрешил снимать _owner пользователю _spender

Transfer - событие, которое должно возникать при любом успешном перемещении монет, для transfer и transferFrom Approval - событие должно возникать при получении разрешения на снятие монет, для allowance

name - полное название вашей монеты symbol - короткое название вашей монеты, иначе говоря - символ для отображения на биржах и в кошельках decimals - rоличество знаков после запятой, 18 - это наиболее распространенное значение

Давайте напишем свою монету. Называться она будет в честь нашего сайта "Sitev Token", символ "SIT" и иметь 18 знаков после запятой.

pragma solidity ^0.4.13;

contract SitevToken {
    
    string public constant name = "Sitev Token";
    
    string public constant symbol = "SIT";
    
    uint32 public constant decimals = 18;
    
    uint public totalSupply = 0;
    
    mapping (address => uint) balances;
    
    function balanceOf(address _owner) constant returns (uint balance) {
        return balances[_owner];
    }

    function transfer(address _to, uint _value) returns (bool success) {
        if(balances[msg.sender] >= _value && balances[_to] + _value >= balances[_to]) {
            balances[msg.sender] -= _value; 
            balances[_to] += _value;
            Transfer(msg.sender, _to, _value);
            return true;
        } 
        return false;
    }
    
    function transferFrom(address _from, address _to, uint _value) returns (bool success) {
        if(balances[_from] >= _value && balances[_to] + _value >= balances[_to]) {
            balances[_from] -= _value; 
            balances[_to] += _value;
            Transfer(_from, _to, _value);
            return true;
        } 
        return false;
    }

    function mint(address _to, uint _value) {
      assert(totalSupply + _value >= totalSupply && balances[_to] + _value >= balances[_to]);
      balances[_to] += _value;
      totalSupply += _value;
    }
    
    function approve(address _spender, uint _value) returns (bool success) {
        return false;
    }
    
    function allowance(address _owner, address _spender) constant returns (uint remaining) {
        return 0;
    }
    
    event Transfer(address indexed _from, address indexed _to, uint _value);
    
    event Approval(address indexed _owner, address indexed _spender, uint _value);
    
}

Сразу бросается в глаза, что нет функции totalSupply. Для публичных полей геттеры создаются автоматически, когда уже контракт будет залит в блокчейн. В поле balances хранятся балансы всех пользователей. Разберитесь, как реализованы функция transfer и transferFrom. Там всё просто. Для того чтобы мы смогли выпускать новые монеты написали функцию mint. С помощью неё можно выпускать монеты на баланс любого пользователя.

Заливаем контракт в Remix.

У всех пользователей по 0 монет, balanceOf будет возвращать 0 с любого аккаунта (проверьте это).

Теперь попробуем переместить несколько монет с нашего баланса на баланс другого пользователя. Функция transfer вернёт false (см. Detail), потому что на нашем счёте нет монет.

Давайте мы себе выпустим 100 монет? Ну ктож откажется то! )) Вызываем mint с нашим адресом и суммой 100, теперь balanceOf должен выдавать также 100. Переместим, 5 монеток на чужой адрес. Работает!

Сейчас функция transferFrom может быть вызвана любым пользователем, а надо чтобы она работала только в случае, если есть разрешение. Применим mapping. Первый ключ - адрес на снятие с которого предоставляется разрешение, второй - пользователь, которому предоставляется разрешение. Чтобы разрешить выпуск монет только владельцу контракта, вспомним, как в предыдущем посте мы реализовали контракт Ownablе и сделаем на его основе.

Получится следующий код:

pragma solidity ^0.4.13;

contract Ownable {
    
    address owner;
    
    function Ownable() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    function transferOwnership(address newOwner) onlyOwner {
        owner = newOwner;
    }
    
}

contract SitevToken is Ownable {
    
    string public constant name = "Sitev Token";
    
    string public constant symbol = "SIT";
    
    uint32 public constant decimals = 18;
    
    uint public totalSupply = 0;
    
    mapping (address => uint) balances;
    
    mapping (address => mapping(address => uint)) allowed;
    
    function mint(address _to, uint _value) onlyOwner {
        assert(totalSupply + _value >= totalSupply && balances[_to] + _value >= balances[_to]);
        balances[_to] += _value;
        totalSupply += _value;
    }
    
    function balanceOf(address _owner) constant returns (uint balance) {
        return balances[_owner];
    }

    function transfer(address _to, uint _value) returns (bool success) {
        if(balances[msg.sender] >= _value && balances[_to] + _value >= balances[_to]) {
            balances[msg.sender] -= _value; 
            balances[_to] += _value;
            Transfer(msg.sender, _to, _value);
            return true;
        } 
        return false;
    }
    
    function transferFrom(address _from, address _to, uint _value) returns (bool success) {
        if( allowed[_from][msg.sender] >= _value &&
            balances[_from] >= _value 
            && balances[_to] + _value >= balances[_to]) {
            allowed[_from][msg.sender] -= _value;
            balances[_from] -= _value; 
            balances[_to] += _value;
            Transfer(_from, _to, _value);
            return true;
        } 
        return false;
    }
    
    function approve(address _spender, uint _value) returns (bool success) {
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
        return true;
    }
    
    function allowance(address _owner, address _spender) constant returns (uint remaining) {
        return allowed[_owner][_spender];
    }
    
    event Transfer(address indexed _from, address indexed _to, uint _value);
    
    event Approval(address indexed _owner, address indexed _spender, uint _value);
    
}

Наша монета Sitev Token готова, можно заливать и тестировать!


Отправить комментарий
Наш проект: язык Cj
Cj - язык программирования (C++ & Javascript)
Новый язык программирования, для разработки веб, мобайл, десктоп-приложений, игр... подробнее...

Хотите поддержать проект?

  • Оставляйте ссылки на наш сайт
  • Станьте спонсором проекта
подробнее...

Концепция SITEV.ru

SITEV.ru - это социальная сеть для ИТ-специалистов (программистов, дизайнеров, seo-специалистов, рекламных менеджеров, маркетологов), в том числе фрилансеров, бизнесменов... а также обычных пользователей, для которых и делается ИТ

Реклама


Поиск работы по всему миру