
от Дэнни

Я хочу показать вам, что создание маркера лучшей практики является простым процессом. Честно говоря, мы собираемся немного написать код, но это будет немного.
Мы будем использовать Solidity для создания нашего Ethereum токена. Но не беспокойтесь, существует много открытых библиотек и контрактов, которые помогут нам в этом процессе.
Мы хотим ERC-20 совместимый маркер. Это означает, что разработчики Ethereum определили набор функций, необходимых для распространенного использования токенов сегодня. Есть и другие типы стандартов ERC, но мы не будем погружаться в них.
Требования:
- Github
- терминал
- NodeJS
- НПМ
- Метамаска (для начального создания аккаунта)
Ладно, начнем кодировать! Первое, что мы хотим сделать, это скачать truffle
глобально. Вы можете посетить их репо на truffle, и вот такой фрагмент для установки:
npm install -g truffle
*Примечание: убедитесь, что у вас последняя версия truffle, если вы установили ее раньше
Truffle будет заниматься компиляцией смарт-контракта, связыванием и развертыванием. Это библиотека, которая облегчит нашу жизнь для этой демонстрации.
Теперь нам нужно создать каталог, где будет жить наш проект. В моем случае я это назвал ethereum_token_tutorial.
Итак, у нас есть два варианта. Или вы можете клонировать репо, которое я сотворил, следуя этому:
git clone -b initial_step https://git@github.com/danieljoonlee/ethereum_token_tutorial.git
Или вы можете сделать это в своем терминале в новом каталоге:
truffle init
Если вы придерживались второго варианта выполнения truffle init
. Каталог должен выглядеть так:
etherem_token_tutorial|___contracts| |_____ConvertLib.sol| |_____MetaCoin.sol| |_____Migrations.sol|___migrations| |_____1_initial_migrations.js| |_____2_deploy_contracts.js|___test| |_____TestMetacoin.sol| |_____metacoin.js|___truffle.js
Удалите ConvertLib.sol
, MetaCoin.sol
, TestMetacoin.sol
, metacoin.js
.
Теперь ваш каталог должен выглядеть так:
etherem_token_tutorial|___contracts| |_____Migrations.sol|___migrations| |_____1_initial_migrations.js| |_____2_deploy_contracts.js|___test|___truffle.js
Прекрасно. Сейчас мы двигаемся. Truffle помогает нам заключать разумные контракты и развертывать их. Но мы удалили наши файлы смарт-контрактов, кроме помощника по миграции. Не беспокойтесь, здесь на помощь приходит Open-Zeppelin.
Open-Zeppelin
это репо с открытым исходным кодом, где вы можете найти смарт-контракты с лучшими практиками, хорошим тестовым покрытием и, скорее всего, проверенные*.
- Аудит – это когда профессиональные разработчики проверяют ваши смарт-контракты на предмет утечек, ошибок или возможностей вредоносных атак.
Вот ссылка, если вас интересуют атаки на смарт-контракт: Ссылки
Для нас использовать любой Open-Zeppelin
контрактов, нам нужно установить его в наш репозиторий:
npm init -ynpm install -E zeppelin-solidity
Мы инициализировали package.json с помощью npm init-y. Мы также установили пакет для использования контрактов Open-Zeppelin.
Ладно, мы напишем Solidity. Раньше я упоминал в статье, что это не будет много кода, и я не шутил!
Создайте новый файл в contracts
папку. В моем случае я назвал это TestToken.sol
Теперь ваш каталог должен выглядеть так:
etherem_token_tutorial|___contracts| |_____Migrations.sol| |_____TestToken.sol***(this one is new)|___migrations| |_____1_initial_migrations.js| |_____2_deploy_contracts.js|___test|___truffle.js
в TestToken.sol
нам нужен такой код:
// TestToken.solpragma solidity ^0.4.18;
import "zeppelin-solidity/contracts/token/ERC20/MintableToken.sol";
contract TestToken is MintableToken { string public constant name = "Test Token"; string public constant symbol = "TT"; uint8 public constant decimals = 18;}
Давайте разберем это, поскольку это достаточно много, хотя это всего несколько строк кода.
pragma solidity ^0.4.18;
Он обязателен в верхней части файла, поскольку он определяет версию Solidity, которую мы используем.
import "zeppelin-solidity/contracts/token/ERC20/MintableToken.sol";
В приведенном выше фрагменте кода Open-Zeppelin так полезен. Если вы знаете, как работает наследование, наш контракт наследует MintableToken. Если вы не знаете, как работает наследование, MintableToken имеет множество функций, сохраненных в inMintableToken.sol. Мы можем использовать эти функции для создания нашего токена. Если вы посетите этот MintableToken, вы заметите массу функций и еще большее наследование. Это может быть немного кроличья нора, но для этой демонстрационной цели я хочу, чтобы мы выпустили токен в тестовую сеть.
Для нас Mintable позволяет создавать сколько угодно токенов, поэтому мы не будем начинать с первоначального предложения. В следующей статье мы создадим службу nodejs, которая будет создавать новые маркеры и обрабатывать другие стандартные функции ERC-20.
Следующий фрагмент кода:
contract TestToken is MintableToken { string public constant name = "Test Token"; string public constant symbol = "TT"; uint8 public constant decimals = 18;}
Здесь мы можем настроить токены. В моем случае я назвал свой Test Token с символом TT и десятичными знаками 18. Но почему 18 десятичных знаков?
Десятичное число 18 достаточно стандартно в сообществе. Итак, если у нас есть один тестовый маркер, он потенциально может выглядеть так: 1,1111111111111111111.
Щенок. Это все кодирование Solidity, которое нам нужно сделать для этого токена. Мы унаследовали все основные функции стандартизированного токена ERC 20 от Open-Zeppelin. После этого нам нужно установить наши константы для имени, символа и десятичных дробей.
Прежде чем мы забудем, мы должны создать аккаунт Metamask и получить его финансирование с помощью testnet ethereum.
Ищите MetaMask
расширение для Chrome или перейдите по этой ссылке

После установки MetaMask вы должны увидеть ряд шагов. Вы можете прочесть подобные условия использования. В конце концов вы добьетесь:

Введите пароль и подтвердите его. Нажав кнопку «Создать», вы увидите другой экран.

Обязательно сохраните исходные слова или скопируйте их в текстовый файл. Нам нужны эти начальные слова, чтобы развернуть маркер в тестовой сети.
Также больше важно это изменить свой тест с Mainnet Test Net на Ropsten Test net. Он находится в левом верхнем углу вкладки MetaMask. Вот нисходящий список:

Причина, по которой мы используем тестовую сеть Ropsten, в том, что это ближайшая тестовая сеть/реализация основной сети Ethereum.
Далее вам нужно будет скопировать свой адрес в буфер обмена с ...
меню такое:

Вы должны иметь адрес, похожий на этот, скопированный в буфер обмена:
address: 0x8EeF4Fe428F8E56d2202170A0bEf62AAc93989dE
Это адрес, с которого мы собираемся разворачивать наш маркерный контракт. Одно, что вам нужно знать о развертывании контрактов, это то, что они стоят Ethereum, вернее Gas. Нам нужно будет добавить немного тестовой сети Ethereum в наши учетные записи.
Теперь, когда у вас есть свой адрес, перейдите по этой ссылке на кран Ropsten:
Кран Ethernet
Редактировать описаниекран.ropsten.be
Скопируйте и вставьте свой адрес, и вскоре у вас будет 1 Ethereum в своем кошельке MetaMask для вашего адреса.

Еще одна вещь, прежде чем мы начнем кодировать наш процесс развертывания! Мы будем использовать бесплатный API под названием Infura.io
:
Infura – масштабируемая блокчейн-инфраструктура
Безопасный, надежный и масштабируемый доступ к API Ethereum и шлюзам IPFS.infura.io
Подпишитесь на их услуги. Вы должны получить от них электронное письмо или быть перенаправлены на сайт с вашим ключом API. Тот, который мы хотим конкретно из сети Ropsten.
Test Ethereum Network (Ropsten)https://ropsten.infura.io/API_KEY
Скопируйте API_KEY.
Почти там! Теперь давайте начнем работать над нашим развертыванием. Давайте вернемся к нашему коду.
Прежде всего, давайте поговорим о безопасности. Создайте новый файл в своем корневом каталоге под названием .env
. Ваша файловая структура должна выглядеть так:
etherem_token_tutorial|___contracts| |_____Migrations.sol| |_____TestToken.sol|___migrations| |_____1_initial_migrations.js| |_____2_deploy_contracts.js|___test|___truffle.js|___.env**(new file)
Внутри вашего .env
файл позволяет добавить некоторые переменные среды (это переменные, к которым вы можете получить доступ где угодно в своем каталоге кода)
//.env fileINFURA_API_KEY=API_KEYMNENOMIC=MNEOMIC_FROM_METAMASK
Сначала добавьте API_KEY, который вы скопировали в файл.
Помните Mneomic (начальные слова) по инициализации расширения Metamask chrome? Это нам сейчас пригодится для развертывания контрактов. Если вы скачали или записали свою мнеомику, теперь запишите их в свой .env
файл MNENOMIC=SOME KEY PHRASE YOU DONT WANT THE PUBLIC TO KNOW.
ВАЖНО***
Мы добавили a .env
файл!!! Нам нужно добавить a .gitignore
файл сейчас, чтобы избежать добавления .env
в общедоступном хранилище, если вы когда-нибудь решите сделать код общедоступным!
Создать .gitignore
файл в том же каталоге, что и ваш .env
. Теперь это должно выглядеть так:
etherem_token_tutorial|___contracts| |_____Migrations.sol| |_____TestToken.sol|___migrations| |_____1_initial_migrations.js| |_____2_deploy_contracts.js|___test|___truffle.js|___.env|___.gitignore**(newfile)
Внутри вашего .gitignore
файл:
// .gitignorenode_modules/build/.env
Мы хотим игнорировать node_modules/
потому что когда мы делаем npm install
он загрузит пакеты из нашего package.json
. Мы хотим игнорировать build
поскольку позже, когда мы запустим сценарий, он автоматически создаст этот каталог для нас. Мы тоже хотим игнорировать .env
поскольку он содержит приватную информацию, которую мы не хотим обнародовать.
Прекрасно! В нашем терминале нам нужно добавить еще два модуля.
npm install --save dotenv truffle-hdwallet-provider
Поскольку мы вводим приватную информацию, нам нужен способ доступа к этим переменным. .env
и dotenv
пакет поможет нам.
Второй пакет, truffle-hdwallet-provider, является поставщиком с поддержкой кошелька. Без этого нам нужно было бы загрузить все блоки или использовать легкий кошелек для новых транзакций в сети Ethereum. С поставщиком кошелька и API Infura. Мы можем разворачивать мгновенно, также минуя болезненные процессы.
Над в truffle.js
в нашем корневом каталоге нужно изменить некоторые конфигурации.
// truffle.jsrequire('dotenv').config();const HDWalletProvider = require("truffle-hdwallet-provider");
module.exports = { networks: { development: { host: "localhost", port: 7545, gas: 6500000, network_id: "5777" }, ropsten: { provider: new HDWalletProvider(process.env.MNENOMIC, " + process.env.INFURA_API_KEY), network_id: 3, gas: 4500000 }, }};
Первая строчка указывает, что мы хотим использовать .env
переменные в этом репо. Как правило, в большинстве программ это требуется только один раз в исходном файле конфигурации.
Большинство из них шаблонны. Основная глава, на которой мы хотим сосредоточиться, это сеть ropsten.
ropsten: { provider: new HDWalletProvider(process.env.MNENOMIC, " + process.env.INFURA_API_KEY), network_id: 3, gas: 4500000 },
Провайдером является наша сеть. В нашем случае мы хотим развернуть наш маркер в Ropsten
сети. Использование HDWalletProvider
мы передаем два аргумента, process.env.MNENOMIC, " + process.env.INFURA_API_KEY
. Мы получаем доступ к нашим .env
переменные путем ссылки process.env.VARIABLE_NAME_IN_ENV
.
Мы установили network_id: 3
потому что это представляет Ропстена. 1
является основной сетью Ethereum и 2
это старая тестовая сеть.
Наконец, мы установили gas: 4500000
, поэтому нам сначала нужен был Ethereum. Мы используем gas/ethereum
всякий раз, когда нам нужно что-то изменить/добавить в сети Ethereum.
Ладно, до последнего шага перед развертыванием!
В нашем migrations/2_deploy_contract.js
нам нужно внести некоторые изменения в наш контракт.
// 2_deploy_contract.js
const TestToken = artifacts.require("./TestToken.sol");
module.exports = function(deployer) { deployer.deploy(TestToken);};
Если вы назвали свой файл контракта токена иначе. Вам нужно заменить TestToken.sol
в файл, который вы назвали.
truffle compile
Это должно создать новую папку в вашем каталоге:
etherem_token_tutorial|___build| |_____contracts| |_____BasicToken.json| |_____ERC20.json| |_____ERC20Basic.json| |_____Migrations.json| |_____MintableToken.json| |_____Ownable.json| |_____SafeMath.json| |_____StandardToken.json| |_____TestToken.json|___contracts| |_____Migrations.sol| |_____TestToken.sol|___migrations| |_____1_initial_migrations.js| |_____2_deploy_contracts.js|___test|___truffle.js|___.env|___.gitignore**(newfile)
В нашей папке сборника есть куча контрактов, которые мы унаследовали от библиотеки Open-Zeppelin. Если вы хотите узнать больше о стандартах ERC-20, я бы посмотрел вики. Если будет достаточно людей, которые спрашивают это, я смогу сделать еще одну публикацию в блоге об этом. Пока вот ссылка на вики.
Вот и настал момент истины. Теперь нам нужно развернуть контракты в сети Ropsten. Введите следующую строчку в свой терминал:
truffle migrate --network ropsten
Вы должны получить серию строк в вашем терминале, например:
Using network 'ropsten'.
Running migration: 1_initial_migration.js Deploying Migrations... ... 0x7494ee96ad7db4a560b6f3169e0666c3938f9f54208f7972ab902feb049a7f68 Migrations: 0x254466c5b09f141ce1f93689db6257b92133f51aSaving successful migration to network... ... 0xd6bc06b3bce3d15dee4b733e5d4b09f0adb8f93f75ad980bad078484641d36e5Saving artifacts...Running migration: 2_deploy_contracts.js Deploying TestToken... ... 0x7e5c1b37f1e509aea59cd297417efe93eb49fdab2c72fa5c37dd2c63a3ba67b7 TestToken: 0x02ec6cbd89d3a435f8805e60e2703ef6d3147f96Saving successful migration to network... ... 0x2fd6d699295d371ffd24aed815a13c5a44e01b62ca7dc6c9c24e2014b088a34eSaving artifacts...
Это займет некоторое время. После полного развертывания скопируйте последний txid. В моем случае:
0x2fd6d699295d371ffd24aed815a13c5a44e01b62ca7dc6c9c24e2014b088a34e
Здесь будет адрес вашего контракта-токена. Вот ссылка на мой txid:
Трансакция Ropsten 0x2fd6d699295d371ffd24aed815a13c5a44e01b62ca7dc6c9c24e2014b088a34e
Подробная информация о транзакции Ropsten (ETH) для 0x2fd6d699295d371ffd24aed815a13c5a44e01b62ca7dc6c9c24e2014b088a34eropsten.etherscan.io
Имеющий адрес самого договора:
Счета Ропстена, адрес и контракты
Ethereum BlockChain Explorer, API и аналитическая платформаropsten.etherscan.io
Вы можете получить завершенное хранилище github здесь.
Это первая часть серии создания токена и взаимодействия с ним. В следующем блоге мы создадим обычный микросервис узла. Мы будем использовать эту услугу для вызова различных функций вашего смарт-контракта токенов, таких как чеканка новых токенов, передача и т.д.
Если вы найдете какие-либо ошибки или описки, сообщите мне! Также я всегда ищу увлекательные проекты в блокчейн-пространстве.
Если вы нашли это полезным и хотите купить мне пива:
BTC: 3Kxz6zPweuiaVG28W78pX9DoEZVkLhH4nT
BCH: qqwusc2peyvlh3wgl0tpt3ll4ug9zujfvy9586tgd4
ETH: 0x96Ee87e22D899BDc27EAD4fE3FCA8e9F39176B4C
LTC: MDhqUBtGgVZrDG7TYzzyK2a2b99sHyHaQQ