Как создать кастомизированную криптовалюту с помощью языка программирования Solidity

Автор: Дзен и искусство компьютерного программирования

1. Введение

В этой статье будет подробно описано, как создать криптовалюту с широкими возможностями настройки с помощью языка программирования Solidity. Статья подойдет читателям, имеющим определенную базу программирования и нуждающимся в некоторых знаниях в области экономики, финансов или цифровых валют. Если у вас нет таких запасов знаний, рекомендуется сначала прочитать соответствующие профессиональные книги.
Развитие криптовалюты и технологии блокчейн привело к тому, что все больше и больше людей узнали об изменениях, происходящих в мире. Как пионер новой эпохи, я считаю, что каждый изучает новые знания и методы для создания своей собственной системы ценностей. Итак, какие проекты или организации успешно внедрили новые криптовалютные или блокчейн-проекты за последние несколько лет? Какие еще проекты или организации потерпели неудачу по разным причинам? Какова судьба этих проектов?
В этой статье мы попытаемся представить, как создать собственную криптовалютную систему с помощью языка программирования Solidity с точки зрения «создания криптовалюты с широкими возможностями настройки». Мы изучим основные концепции, терминологию, принципы алгоритмов, конкретные этапы работы, примеры кода и будущие направления развития, связанные с созданием собственной криптовалютной системы. Я надеюсь, что, прочитав эту статью, читатели смогут глубже понять язык программирования Solidity и криптовалюту, а также улучшить свои навыки разработки криптовалют.

2. Объяснение основных понятий и терминов

2.1 Криптовалюта и блокчейн

Криптовалюта : Криптовалюта (англ. Cryptocurrency), также известная как цифровая валюта, представляет собой электронную платежную систему, основанную на технологии блокчейн для онлайн-транзакций, широко известную как «Биткойн». Криптовалюты обычно генерируются пользователями и размещаются в распределенной сети, к которой каждый может получить доступ, отправлять и получать криптовалюты.
Блокчейн : Блокчейн (англ. Blockchain) — распределенная база данных, записывающая историю всех транзакций с цифровой валютой. Он хранит данные децентрализованно и использует механизмы криптографического консенсуса для обеспечения согласованности данных, то есть все участники следуют одним и тем же правилам. Каждая запись транзакции добавляется в блокчейн, образуя цепочку. Таким образом, блокчейн обеспечивает надежную, неизменяемую запись и помогает проверять и подтверждать транзакции.

2.2 Биткойн и токен ERC-20

Биткойн — это тип криптовалюты, который характеризуется анонимностью и не ограничен национальным законодательством. Основной особенностью Биткойна является его децентрализованный дизайн, который может реализовывать такие функции, как оплата и учет. Однако комиссии за транзакции относительно высоки. Когда сумма каждой транзакции достигает определенного порога, она будет подтверждена и помещена в цепочку.
Токен ERC-20 : Токен ERC-20 Ethereum (также называемый токеном) представляет собой децентрализованный стандарт токенов, который работает на блокчейне Ethereum. Он определяет набор общих интерфейсов, которые позволяют смарт-контрактам создавать собственные токены и обмениваться ими стандартным способом. Токен ERC-20 — это стандарт токена, который можно использовать для представления широкого спектра активов, таких как ETH, BTC или акции компаний. Вы можете создать свой собственный токен ERC-20 для представления своей компании, личности и т. д. или выпустить эти токены ERC-20 на рынок для транзакций.

2.3 Введение в язык Solidity

Solidity : статически компилируемый язык высокого уровня на основе виртуальной машины EVM для написания децентрализованных приложений (DAPP). Solidity — объектно-ориентированный язык для написания смарт-контрактов. Он поддерживает различные типы данных, такие как целые числа, числа с плавающей запятой, строки, логические значения, адреса, массивы, структуры и т. д.; он также поддерживает указатели, наследование, абстрактные классы, события и т. д.

2.4 Виртуальная машина EVM

EVM : полное имя — виртуальная машина Ethereum, которая является ключевым компонентом платформы Ethereum. Это вычислительный механизм, выполняющий смарт-контракты, аналогичный виртуальной машине на Java или других языках программирования.

2.5 ДАПП

DAPP : Аббревиатура Decentralized Application означает децентрализованное приложение. В отличие от традиционных веб-приложений, DAPP полностью работает на смарт-контрактах в блокчейне. Все пользовательские данные хранятся постоянно. Нет необходимости беспокоиться о проблемах безопасности данных. DAPP может обеспечить сверхвысокий уровень обслуживания. Например, на Ethereum существует большое количество децентрализованных приложений, включая государственные каналы, игровые платформы альянсов, кредитные платформы, невзаимозаменяемые токены, децентрализованные автономные организации DAO и т. д.

2.6 DEX и смарт-контракты

DEX (Децентрализованная биржа) : Децентрализованная биржа. В настоящее время самой популярной децентрализованной биржей на основе блокчейна является Uniswap. Uniswap — это полностью децентрализованная биржа, которая соединяет транзакции между несколькими криптовалютами. Пользователям нужно только указать, что они хотят купить, а не сначала отправлять заявку на заказ на биржу, как на централизованной бирже.
Смарт-контракт : Смарт-контракт — это программа, развернутая в блокчейне, которая контролирует работу блокчейна посредством кода в контракте. В их функции входят депозиты, снятие средств, переводы, функции вызова и т. д. Смарт-контракты на блокчейне могут выполнять автоматическое управление активами, например автоматическое ипотечное кредитование, управление токенами смарт-контрактов и т. д.

2.7 ДАО

DAO (Децентрализованная автономная организация) : Децентрализованная автономная организация. DAO — это организационная форма, права собственности и управления которой закреплены в смарт-контрактах и ​​строго регулируются. DAO состоит из группы независимых участников и не требует стороннего голосования или принятия решений. Он может напрямую принимать решения через смарт-контракты в соответствии с внутренними заданными правилами.

3. Объяснение основных принципов алгоритма, конкретных рабочих этапов и математических формул.

3.1 Структура данных

3.1.1 Структура пользовательских данных

struct User { uint userId; // строка идентификатора пользователя userName; // адрес имени пользователя userAddress; // адрес учетной записи пользователя }



Эта структура представляет структуру данных пользователя, где userId представляет уникальный идентификатор пользователя, userName представляет имя пользователя, а userAddress представляет адрес учетной записи пользователя.

3.1.2 Структура данных актива

struct Asset { uint assetsId; // Идентификатор актива bytes32 name; // Строковый символ имени актива ; // Символ актива uint totalSupply; // Общий объем поставок bool isDivisible; // Делится ли это Mapping(address => uint) Balances; // Разрешено отображение таблицы сопоставления баланса держателя(адрес => сопоставление(адрес => uint)) разрешено; // Разрешенная таблица сопоставления токенов }







Эта структура представляет структуру данных актива, где assetsId представляет собой уникальный идентификатор актива, name представляет собой имя актива, символ представляет символ актива, totalSupply представляет общий объем поставок актива, isDivisible указывает, является ли он делится, а балансы представляют таблицу сопоставления балансов держателя, разрешенные представляют таблицу разрешенных сопоставлений токенов.

3.1.3 Структура данных транзакции

struct Transaction { uint transactionId; // Адрес идентификатора транзакции from; // Адрес адреса счета передачи ; // Адрес счета перевода uint sum; // Данные в байтах суммы транзакции; // Дополнительные данные uint timestamp; // Временная метка транзакции }






Эта структура представляет структуру данных транзакции, где идентификатор транзакции представляет собой уникальный идентификатор транзакции, от представляет адрес учетной записи перевода, до представляет адрес учетной записи перевода, сумма представляет собой сумму транзакции, данные представляют собой дополнительные данные. , а timestamp представляет транзакцию.

3.1.4 Введение в технический документ

«За пределами Биткойна: создание передовых криптовалют с помощью языка программирования Solidity» упоминается некоторая информация из официального документа, и мы процитируем ее часть следующим образом:

  • В этой статье представлено введение в мотивацию концепции Сатоши Накамото системы электронных денежных средств P2P и ее основных особенностей, включая распределенную одноранговую сеть, которая принимает транзакции без центрального органа или доверенных третьих сторон.
  • Эта книга предлагает всесторонний обзор того, как работает Биткойн, и подробно объясняет все его технические детали. Он также включает главу о создании собственной цифровой валюты на основе Биткойна. Предоставленные примеры написаны на Python, но вы можете легко перевести их на другие языки программирования, такие как JavaScript или Java.
  • Презентация профессора Вудбери из Еврейского университета в Иерусалиме, объясняющая основы технологий блокчейна. Он освещает такие темы, как алгоритмы консенсуса, децентрализация, бесконтрольные и разрешенные блокчейны и т. д.
  • В этой статье рассказывается об Ethereum, одной из самых популярных криптовалют, основанной на технологии блокчейн. В нем обсуждаются его преимущества перед биткойнами, представлены некоторые ключевые концепции, такие как смарт-контракты, децентрализация, пулы майнинга и биржи, а также рассматриваются несколько вариантов использования.

3.2 Алгоритм консенсуса

Алгоритм консенсуса : Алгоритм консенсуса — это протокол, используемый в распределенных системах для обеспечения согласованности результатов вычислений различных узлов. Общие алгоритмы консенсуса включают Paxos, Raft, ZAB и т. д. Когда несколько узлов одновременно получают разные сообщения и им необходимо выбрать значение в качестве следующего действия, для разрешения конфликтов необходим алгоритм консенсуса.

3.2.1 Алгоритм PoW (алгоритм доказательства работы)

function mineBlock() public return (uint вознаграждение){ require(!blockMined[msg.sender]); // Определить, выполнил ли текущий пользователь майнинг if (!isValidProof()) return; // Если вычислительная мощность превышает целевое значение , затем Доказано, что оно действительно blockMined[msg.sender] = true; //Устанавливаем добытое пользователем currentReward += CalcultReward(); // Получаем вознаграждение в зависимости от суммы, добытой майнером вознаграждение = currentReward; // Возвращаем вознаграждение пользователь addTransaction(" Mining", "MINING", msg.sender, currentReward); // Добавляем транзакцию майнинга currentReward = 0; // Очищаем текущее вознаграждение emite Mined(currentReward); // Запускаем событие майнинга }








Этот код представляет собой пример алгоритма проверки рабочей нагрузки, в котором функция mineBlock() является функцией входа, позволяющей пользователям запрашивать майнинг. Сначала он определяет, производил ли пользователь уже майнинг. Если он уже майнил, он вернет сообщение об ошибке. . Если он не добыл, он вернет сообщение об ошибке. , затем оценивается, соответствует ли вычислительная мощность целевому значению. Если оно достигнуто, оно подтверждается, и пользователь, который успешно добыл майнинг, будет добавлен в список добытый список. Затем вознаграждение будет рассчитано и возвращено пользователю. Наконец, вознаграждение за майнинг будет записано в список транзакций. И инициирует событие майнинга.

3.2.2 Алгоритм PoS (алгоритм Proof of Stake)

function voice() public payable{ // Определяем, проголосовал ли текущий аккаунт require(!voted[msg.sender]); Voted[msg.sender] = true; // Устанавливаем для аккаунта проголосовавший BalanceOf[msg.sender] += msg.value; // Добавляем сумму залога к текущему счету totalSupply += msg.value; // Увеличиваем общий объем поставок addTransaction("stakeing", "STAKING", msg.sender, msg.value); // Добавляем транзакцию залога Issue VoteCast (msg.sender, msg.value); // Запускаем событие голосования }







Этот код представляет собой пример алгоритма доказательства доли. Функция voice() — это входная функция, с помощью которой пользователи могут запросить обещанные взносы. Сначала она определяет, проголосовал ли пользователь. Если пользователь проголосовал, будет возвращено сообщение об ошибке. , Если нет голосования, учетная запись будет установлена. Проголосовали, добавили сумму залога к текущему счету и, наконец, записали залоговую транзакцию в список транзакций и инициировали событие голосования.

3.3 Бизнес-логика

3.3.1 Создание токенов

конструктор (строковая память _name, строковая память _symbol, uint _initialSupply, bool _divisible) public { name = _name; символ = _символ; totalSupply = _initialSupply*(10**(uint(_decimals))); isDivisible = _divisible; владелец = msg.sender; балансы [владелец] = TotalSupply; испустить Transfer(адрес(0), владелец, totalSupply); }







Этот код представляет собой пример создания токена. Функция конструктора () является функцией входа при инициализации контракта. Она создает основные атрибуты токена, такие как имя, символ, начальное предложение, является ли он делимым и т. д.

3.3.2 Передача

функция передачи (адрес _to, uint _value) public возвращает (bool успех) { require(balanceOf[msg.sender] >= _value); require(balanceOf[_to]+_value > BalanceOf[_to]); балансы[msg.sender]-= _value; балансы[_to]+= _value; addTransaction("перенос", "ПЕРЕДАЧА", msg.sender, _to, _value); испустить Transfer(msg.sender, _to, _value); успех = правда; }







Этот код представляет собой пример перевода, в котором функция Transfer() является функцией входа, позволяющей пользователям запрашивать переводы. Сначала она определяет, достаточен ли баланс пользователя, затем обновляет баланс счета, записывает транзакцию перевода в список транзакций. и запускает событие передачи.

3.3.3 Доверенные транзакции

функция утверждения (адрес отправителя, значение uint) публичные возвраты (логический успех) { допуски [msg.sender] [spender] = значение; addTransaction("одобрить", "одобрить", msg.sender, покупатель, значение); излучать утверждение (msg.sender, покупатель, значение); успех = правда; }




функция TransferFrom (адрес _from, адрес _to, uint _value) public возвращает (bool успех) { require(balanceOf[_from]>=_value && допуски[_from][msg.sender]>=_value); require(balanceOf[_to]+_value > BalanceOf[_to]); балансы[_from]-=_value; балансы[_to]+=_value; допуски[_from][msg.sender]-=_value; addTransaction("transferFrom", "TRANSFERFROM", _from, _to, _value); испускать Transfer(_from, _to, _value); успех = правда; }








Этот код представляет собой пример комиссионной транзакции, в которой функция Approval() является функцией разрешения пользователя на запрос комиссионной транзакции. Он делегирует авторизацию пользователя другим учетным записям, записывает авторизованную транзакцию в список транзакций и запускает событие авторизации. ; TransferFrom() Функция позволяет пользователям переводить деньги с других счетов. Сначала она определяет, достаточен ли баланс счета и авторизация, затем обновляет баланс счета и авторизацию, записывает транзакцию перевода в список транзакций и инициирует перевод событие.

3.3.4 Замораживание активов

функция FreeAsset (адрес учетной записи, статус bool) public onlyOwner { FrozeAssets [аккаунт] = статус; addTransaction("freezeAsset", "FREEZEASSET", tx.origin, account, uint(статус)); излучать FreezeAsset (учетная запись, статус); }



Этот код представляет собой пример замораживания активов, где функция FreeAsset() — это функция, позволяющая администратору запросить заморозку активов учетной записи. Сначала она определяет, является ли пользователь администратором, затем обновляет статус замораживания активов пользователя и записывает замороженные активы. транзакцию актива в список транзакций и вызвать событие заморозки актива.

3.3.5 Снятие транзакции

функция revokeTransaction (uint index) public onlyOwner { удалить транзакции [индекс]; }

Этот код представляет собой пример отмены транзакции, в котором функция revokeTransaction() — это функция, используемая администратором для запроса отзыва транзакции. Сначала она определяет, является ли пользователь администратором, затем удаляет транзакцию и запускает отзыв. событие транзакции.

3.4 Примеры кода

pragma solidity ^0.4.24;
contract MyToken {
   event Transfer(address indexed _from, address indexed _to, uint256 _value);
  event Approval(address indexed _owner, address indexed _spender, uint256 _value);
  event FreezeAsset(address indexed _account, bool _status);
  event VoteCast(address indexed _staker, uint256 _amount);
  event Mined(uint256 _reward);
   struct User {
      uint userId;
      string userName;
      address userAddress;
  }
   struct Transaction {
      uint transactionId;
      address from;
      address to;
      uint amount;
      bytes data;
      uint timestamp;
  }
    struct Asset {
       uint assetId;
       bytes32 name;
       string symbol;
       uint totalSupply;
       bool isDivisible;
       mapping(address => uint) balances;
       mapping(address => mapping(address => uint)) allowed;
   }
   uint constant decimals = 18; // 精度
  uint constant multiplier = 10**decimals; // 乘数
  uint constant initialSupply = 10000*multiplier; // 初始总供应量
  bytes32 constant name = 'MyToken'; // 名称
  string constant symbol = 'MTKN'; // 符号
  bool divisible = false; // 可否划分
  address owner; // 所有者
  mapping(address => bool) private blockMined; // 用户是否已经挖矿
  mapping(address => bool) private voted; // 用户是否已经投票
  mapping(address => bool) private frozenAssets; // 账户资产是否已被冻结
  uint currentReward = 0; // 当前奖励
  uint totalSupply; // 总供应量
  mapping(address => uint) balances; // 持有者余额映射表
  mapping(address => mapping(address => uint)) allowances; // 允许的代币映射表
  mapping(uint => Transaction) transactions; // 交易列表
   modifier onlyOwner(){
      require(msg.sender == owner);
      _;
  }
   constructor () public {
      owner = msg.sender;
      totalSupply = initialSupply;
      balances[owner] = totalSupply;
      emit Transfer(address(0), owner, totalSupply);
  }
   function transfer(address _to, uint256 _value) public returns (bool success) {
      require(!frozenAssets[msg.sender], "The sender has been frozen");
      require(_value <= balances[msg.sender],"Insufficient balance.");
      balances[msg.sender] -= _value;
      balances[_to] += _value;
      addTransaction("transfer", "TRANSFER", msg.sender, _to, _value);
      emit Transfer(msg.sender, _to, _value);
      success = true;
  }
   function balanceOf(address _owner) public view returns (uint256 balance) {
      return balances[_owner];
  }
   function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
      require(!frozenAssets[msg.sender], "The sender has been frozen");
      require(_value <= balances[_from],"Insufficient balance.");
      require(_value <= allowances[_from][msg.sender],"Insufficient allowance.");
       balances[_from] -= _value;
      balances[_to] += _value;
      allowances[_from][msg.sender] -= _value;
      addTransaction("transferFrom", "TRANSFERFROM", _from, _to, _value);
      emit Transfer(_from, _to, _value);
      success = true;
  }
   function approve(address _spender, uint256 _value) public returns (bool success) {
      allowances[msg.sender][_spender] = _value;
      addTransaction("approve", "APPROVE", msg.sender, _spender, _value);
      emit Approval(msg.sender, _spender, _value);
      success = true;
  }
   function allowance(address _owner, address _spender) public view returns (uint256 remaining) {
      return allowances[_owner][_spender];
  }
   function freezeAsset(address account, bool status) public onlyOwner {
      frozenAssets[account] = status;
      addTransaction("freezeAsset", "FREEZEASSET", tx.origin, account, uint(status));
      emit FreezeAsset(account, status);
  }
  function revokeTransaction(uint index) public onlyOwner {
     delete transactions[index];
 }
  function withdrawEther() public onlyOwner {
     require(address(this).balance > 0,"No ether left for withdrawal!");
     msg.sender.transfer(address(this).balance);
 }
  function calculateReward() internal returns (uint) {
      currentReward = block.number / 1000 + 1; // 挖矿获得的奖励等于区块高度除以1000加1
      return currentReward * 1 ether; // 返回奖励金额
  }
  function isValidProof() internal pure returns (bool result) {
      return true; // 为了演示方便,省略了算力校验环节
  }
  function addTransaction(bytes memory actionType, bytes memory actionName, address from, address to, uint amount) internal {
      uint id = block.number - 1; // 每次交易自动分配一个ID
      Transaction storage transact = transactions[id];
      transact.transactionId = id;
      transact.actionType = actionType;
      transact.actionName = actionName;
      transact.from = from;
      transact.to = to;
      transact.amount = amount;
      transact.data = "";
      transact.timestamp = now;
  }
 function mineBlock() public returns (uint reward) {
    require(!blockMined[msg.sender]); // 判断当前用户是否已经挖矿
    require(isValidProof()); // 判断算力是否符合要求
    blockMined[msg.sender] = true; // 设置该用户已挖矿
    currentReward += calculateReward(); // 根据矿工挖出来的量得到奖励
    reward = currentReward; // 将奖励返回给用户
    addTransaction("mining", "MINING", msg.sender, currentReward); // 添加挖矿交易
    currentReward = 0; // 清空当前奖励
    emit Mined(currentReward); // 触发挖矿事件
}
function vote() public payable {
    // 判断当前账户是否已经投票
    require(!voted[msg.sender]); 
    voted[msg.sender] = true; // 设置该账户已投票
    balanceOf[msg.sender] += msg.value; // 给当前账户增加质押金额
    totalSupply += msg.value; // 增加总供应
    addTransaction("staking", "STAKING", msg.sender, msg.value); // 添加质押交易
    emit VoteCast(msg.sender, msg.value); // 触发投票事件
}
}

Supongo que te gusta

Origin blog.csdn.net/universsky2015/article/details/132126749
Recomendado
Clasificación