Mist как зайти

Обновлено: 03.07.2024

Онлайн РПГ (rpg) «Mist» - одна из многих и единственная в своем роде бесплатная браузерная игра. В неё играют уже несколько лет, и за это время игровой мир становится лучше и интереснее, обещая каждому путнику увлекательную жизнь, невероятные приключения и незабываемые воспоминания! Мист – лучшая бесплатная онлайн рпг игра!

Внешний вид
В ролевой онлайн игре Мист все сделано для удобства игроков — приятный интерфейс, лаконичность и легкость использования игровых возможностей, понятная навигация по локациям. Здесь не заманивают игроков яркими цветами и блестящими обертками, а создают по-настоящему красивую и функциональную игру.


Внешний вид персонажа меняется с его развитием, и всегда понятно какой противник стоит перед вами — ловкий уворот, несокрушимый танк или расчетливый универсал. А если вы доведете свое оружие или доспехи до совершенства, то увидите их светящуюся ауру.

Система боя
Привычная по другим онлайн ММОРПГ (mmorpg online) система блоков и ударов предполагает здесь не бездумное тыканье по точкам, а удачно сочетается с пошаговой системой ведения боя (в первую очередь командного). Здесь приходится не только изучать сильные и слабые стороны противника, но и координировать свои действия с командой.




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

Заработок
Количество видов заработка в браузерной онлайн стратегии Мист обширно: десятки видов сбора ресурсов, переработки и создания предметов. Плюс к этому заработок на наставничестве, торговля на рынке, наемничество, неофициальные, но разрешенные способы добычи денег, такие как проводники по локациям и т. д., вплоть до выигрышей в разнообразные лотереи. Создатели лучшей браузерной игры ушли от узконаправленных профессий, и не ограничивают игроков в доступных сферах деятельности.

Игровые локации
Игровой мир здесь раскрывается постепенно. Новые возможности, умения и локации для сражений появляются на каждом уровне. Можно воевать с разнообразными монстрами, зарабатывая награду за каждый бой, но самые интересные локации предназначены для PvP-сражений с другими игроками. «Замок поединков», «Заброшенный храм», «Ледяной чертог», опасные, но захватывающие путешествия за пределами городских стен. Каждый найдет здесь что-то себе по душе!




Общественная жизнь
Новичкам игры разобраться во всех тонкостях помогут наставники, которые будут рядом первые три уровня. Начиная с 4-го уровня откроется доступ к клановой жизни. Кланов в онлайн стратегии Мист не так много, однако каждый из них — это мощная боевая единица. Наградой за клановые сражения может стать обладание целой локацией, а победа в клановом турнире поможет усилить всех членов клана и достигнуть вершин власти в Мисте.

Легенда и мир
Историю Миста можно узнать из Летописей в библиотеке, и там же понять, что этот мир уже живет своей жизнью. Здесь есть свои герои и легенды, сказки и тайны. Все они связаны между собой, а если вас заинтересуют подробности некоторых событий — узнать их можно у не игровых персонажей, которые с удовольствием поведают вам о тайнах прошлого и настоящего, а также предложат какое-нибудь задание.




Мист ждет вас!
Мист — это лучшая новая браузерная онлайн (online) игра 2012 года, в которой вы найдете всё что вам нужно — верных друзей и умных противников, торжество победы и радость от достижения новых вершин! Мы уверены, что Вам понравится играть в эту браузерную rpg игру! И лишь один шаг отделяет вас от всего этого.

Вы находитесь на сайте бесплатной онлайн игры Mist (RPG). Браузерные игры не нужно устанавливать на компьютер, зарегистрируйтесь и начинайте играть, игра бесплатная.

Mist — это большой загадочный мир, подернутый завесой тумана, в котором Вы видите окружающее не дальше, чем на расстоянии вытянутой руки, мир, в котором будущее будет приоткрываться Вам постепенно, по мере развития вашего героя. Мир лучшей браузерной игры Mist даст Вам многое, но это многое будет зависеть только от Вас, это сражения и политика, торговля и экономика, общение с людьми из разных уголков земного шара и, кто знает, может, именно в этом мире вы обретете себя.

Смотрите как работает

Демонстрация приложения доступна по ссылке.
Мы перечислили на счет контракта некоторое кол-во эфира, если он закончится и у вас есть лишний тестовый эфир — можете задонатить сюда 0xe79d8738f0769ec69f09cef4cd497c9cc477733e — сеть Ropsten.

Продолжение следует

На этом пока все. Документацию по geth можно увидеть здесь.

В geth используется web3.js библиотека, документацию по ней можно посмотреть здесь.
Это одна из самых распространенных библиотек для подключения к Ethereum-блокчейну. Мы же специализируемся на разработке на Ruby on Rails, поэтому задаемся целью найти подходящий ruby-интерфейс. В следующей статье мы опишем что из этого выйдет.

Вариант приложения с использованием Web3.js

Основной сценарий приложения:

  1. Пользователь подключается к сети Ropsten через MetaMask
  2. Если на аккаунте нет эфира, будет невозможно выполнить ни одну транзакцию. Мы добавили функцию получения эфира, которая становится доступна при балансе аккаунта меньше 0.1 эфира. Реализовано это через сторонний сервис, на который делается ajax запрос с адресом, на который нужно перевести эфир.
  3. Основные действия со смарт контрактом доступны только после того, как пользователь станет участником организации. Для этого вызывается метод addMember в смарт контракте.
  4. Участник организации может создать Предложение о переводе средств (далее Proposal), или проголосовать за уже существующее.
  5. Когда истекает время для Proposal (время создания + 5 минут), появляется возможность его завершить, в результате чего, в зависимости от распределения голосов, эфир будет переведен на указанный адрес, или нет.

Еще раз обращаем ваше внимание на то, что текущая версия Web3.js — 0.20.1. Но уже готовится к релизу версия 1.0, в которой изменения достаточно существенны. Как мы говорили выше, MetaMask встраивает web3 в страницу, и его можно сразу использовать. Но учитывая то, что библиотека активно развивается, а нам нужно гарантировать работоспособность приложения для пользователя, необходимо использовать свою залоченную версию, и переопределять объект web3, который встраивает MetaMask. Мы делаем это здесь в следующем методе:


Делать это нужно после события window.onload .
Одна неочевидная проблема, которая решается в этом коде — если просто сделать window.web3 = new Web3(web3.currentProvider) как предлагается в официальной документации, то не подхватывается аккаунт по умолчанию.
Еще в MetaMask, как уже писалось, можно выбирать сеть из списка. У нас используются адреса контрактов в сети Ropsten, если попытаться подключаться по этим адресам в других сетях — результат будет непредсказуем. Поэтому прежде чем предоставлять доступ к приложению, нужно проверить в той ли сети находится пользователь. Получить идентификатор сети можно с помощью команды:


Мы делаем эту проверку здесь и сравниваем результат с id для сети Ropsten — это 3.

Список id всех сетей можно увидеть например здесь в описании net_version.

Вся логика работы с блокчейном находится в файле blockchain.js.

Здесь есть два типа функций — функции для получения данных из блокчейна и функции изменяющие данные в блокчейне. Большинство методов из web3.js выполняются асинхронно и принимают callback в качестве последнего параметра. Поскольку зачастую приходится вызывать несколько методов для получения данных, и вызов некоторых из них зависит от результата работы других — удобно использовать промисы. В версии 1.0 web3.js асинхронные методы возвращают промисы по умолчанию.

Приведем один пример получения информации из блокчейна:
Функция getCurrentAccountInfo возвращает адрес текущего аккаунта, баланс и флаг того, является ли данный аккаунт участником организации.


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


Как видим, синтаксис ничем не отличается от предыдущего примера, вот только выполнение этой функции повлечет создание транзакции, для изменения данных в блокчейне.
При вызове любой функции смарт контракта, в результате которой создается транзакция, MetaMask предлагает пользователю подтвердить эту транзакцию или отклонить ее. Если пользователь подтверждает транзакцию, то функция возвращает хеш транзакции.
Один неочевидный момент — это как узнать выполнилась транзакция успешно или нет.
Определить статус транзакции можно на основании кол-ва газа, которое было использовано. Если использовано максимально доступное кол-во газа, то либо в ходе выполнения возникла ошибка, либо газа не хватило для выполнения транзакции. Проверку статуса мы делаем следующим образом.

При создании новой транзакции, мы добавляем ее в localStorage и периодически опрашиваем ее статус, до тех пор пока не узнаем что она выполнилась успешно или нет. Логика мониторинга транзакций находится в файле — transactions-storage.js.

Что в итоге?

На наш взгляд оба варианта имеют право на жизнь, но в различных случаях. В данном конкретном примере версия с Ruby немного притянута за уши и версия использующая MetaMask более логична. Но, как уже было упомянуто в начале, задачей было не дать образец проекта, а показать на простой логике примеры взаимодействия с блокчейном при помощи javascript и ruby. Надеемся с этой задачей мы справились.
Следующей задачей ставим себе описание более продвинутой работы с деплоем и тестированием смарт контрактов. Ожидайте следующую статью на эту тему!

В заключение

Мы рассмотрели предназначенный для хранения криптовалюты Эфириум кошелек Mist.

Официальное предложение от команды разработчиков экосистемы обеспечивает безопасное и надежное хранение монет пользователями любого уровня компетентности в теме криптовалют.

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

Погружение в разработку на Ethereum. Часть 3: приложение для пользователя

В предыдущих статьях (часть 1 и часть 2) мы описали как можно пользоваться децентрализованными приложениями на смарт-контрактах, если вы сами не против быть нодом. Но чем меньше пользователя заставляют совершать дополнительные действия — тем лучше. Для работы со смарт контрактами необходимо подписывать транзакции приватным ключом, поэтому совсем без дополнительный действий, к сожалению, не обойтись. В этой статье мы рассмотрим два подхода: первый — полноценное децентрализованное приложение (DApp) на javascript с использованием библиотеки Web3 и плагина MetaMask, второй — аналогичное приложение, но использующее Ruby on Rails API и гем Ethereum.rb для доступа к блокчейну.



Для демонстрации работы настоящего DApp рассмотрим приложение, вдохновленное официальным примером. Вместо Democracy с голосованием и выполнением произвольных транзакций сделаем упрощенный контракт Charity, в котором кто угодно создает предложение по распределению денег (эфира), участники голосуют, и после истечения дедлайна предложение либо выполняется, либо нет, в зависимости от результата голосования.
Логика смарт контракта в данном случае не очень важна, наша цель — продемонстрировать варианты взаимодействия пользователя с блокчейном.
Рассмотрим какие средства мы будем использовать чуть подробнее а после перейдем непосредственно к приложению.

«Hello command line!»

Запустим geth с консолью (как установить geth можно посмотреть здесь):


Пример результата: 22159430784000000000

Число такое большое потому, что отображается не в ether, а в wei — минимально возможной единице измерения количества эфира, она же используется в коде при манипуляциях с эфиром. Для отображения числа в привычном ether, как в кошельке Mist, можно добавить преобразование:


Приступим к открытию контракта. Присвоим адрес контракта в переменную:


Присвоим интерфейс контракта в переменную:


Создадим объект контракта:


Этот объект может использоваться для открытия существующего контракта либо для деплоя нового. В данном случае нам нужно первое, для этого выполним команду:


Каждая команда выводит undefined — не обращайте внимания. Вместо адреса и интерфейса подставьте свои значения, а если вы находитесь в той же тестовой сети (Ropsten), что и мы во время создания нашего примера — то сможете использовать наш контракт. Вызовем функции контракта:


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


Возвращается номер транзакции. По этому номеру можно отследить транзакцию на сайте etherscan: ropsten.etherscan.io для Ropsten и rinkeby.etherscan.io для Rinkeby, введя номер транзакции в поиске, либо выполнив команду:


Не забудьте подставить номер своей транзакции вместо нашего.

Увидите структуру с подробностями транзакции. Теперь можно выполнить getString и увидеть, что строка изменилась:

Общая информация о MIST



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

Несмотря на то, что Mist является официальным кошельком экосистемы Ethereum, он все еще в стадии бета-версии, поскольку развитие и дополнение функционала продолжается и сегодня.

Вариации использования монеты ETH оказались столь обширными, что команда разработчиков не могла предусмотреть всех моментов и активно продолжает внедрять предложения в проект. Кошелек Mist реализован в версиях под все операционные системы – Win, Mac OS, Linux и Ubuntu (для работы с ней потребуется отдельный файл).

Основной контракт Charity

Контракт в виде одного единственного файла, поэтому не будем пользоваться специальными средствами для деплоя, сделать это можно любым способом, хоть через Mist, хоть используя командную строку Geth. Можете использовать наш код отсюда. В целом его схему можно изобразить так:


Рассмотрим код контракта Charity.sol по логическим блокам. Сначала идет описание всех нужных нам переменных:


Структура голосов, складывается в массив для каждого предложения


msg — это структура, по которой можно получить информацию о вызывающем. В данном случае msg.sender — это адрес аккаунта, который вызвал метод с этим модификатором.

Опишем конструктор нашего контракта, который будет выполняться при деплое. Все, что требуется задавать — время, которое выделяется для голосования за каждое предложение. Кроме этого увеличиваем размер массива members, потому что добавлять пользователей будем исходя из размера, а нулевой элемент остается зарезервированным.


Функция для добавления пользователя:


Заметьте функцию require — она пришла на замену throw в более старых версиях solidity. В require передается true или false , если это false — то срабатывает обработчик аналогичный throw — откатывается вся транзакция.
Чтобы можно было проверить, находится ли адрес в списке пользователей используем такую функцию:


Заметьте здесь ключевое слово now — это текущее время, но не на момент вызова транзакции, а на момент создания блока. Поэтому дедлайн будет отсчитываться с момента, когда предложение уже будет создано на блокчейне.

Несмотря на то, что proposals у нас public , получать таким образом можно только простейшие поля в виде массива. То есть вызвав в контракте метод например proposals(1) , мы получим предложение с индексом 1 в виде массива < recipient, amount, description, votingDeadline, executed, proposalPassed, numberOfVotes, currentResult >, а массивы votes и voted внутри структуры не вернутся. Но нам нужна информация о том, проголосовал ли пользователь за определенное предложение, чтобы отображать его голос или дать возможность проголосовать. И желательно сделать это в одно обращение, поэтому мы получаем эту информацию когда читаем структуру Proposal для отображения в нашем приложении с помощью специальной функции getProposal , которая принимает аккаунт, для которого нужен статус голоса и идентификатор предложения.


А это вспомогательная функция, которая ищет как проголосовал конкретный пользователь в конкретном предложении. Возвращаться будет: 0 — если пользователь не проголосовал, 1 — если пользователь проголосовал “за”, -1 — если проголосовал “против”.


Голосование: для предложения с конкретным номером отдаем голос true (за) или false (против).


И последняя функция executeProposal служит для завершения голосования и отправки (или неотправки) эфира на адрес получателя.


В конце присутствует пустая функция с модификатором payable.

Как расходуется газ


В прошлой статье мы уже писали что такое газ. Для удобства напомним:
Эфир нужен для любых операций по изменению данных, им оплачивается так называемый gas — абстрактная единица измерения, которая служит для оценки требующейся работы по выполнению транзакции. Она нужна для независимости этой оценки от текущей рыночной стоимости эфира. При отправке транзакции можно задать сколько эфира вы платите за каждую единицу газа и максимальное количество газа, которое вы готовы оплатить. Чем больше вы выделяете — тем более приоритетна ваша транзакция для потенциальных майнеров. Ведь по сути плата за gas — это оплата работы майнеров по выполнению вашей транзакции и включению ее в очередной блок. Поэтому при майнинге кроме фиксированной платы за найденный блок — на момент написания это 5 эфиров, — майнер также получает плату за транзакции, как правило это несколько сотых эфира. Количество газа за транзакцию зависит от вычислительной сложности операций над данными.

Для того чтобы наглядно продемонстрировать как происходит оплата и расход газа при выполнении транзакции создадим новый контракт. Заодно будем использовать другой метод компиляции и деплоя — через командную строку.

1. Деплой контракта для демонстрации

Рассмотрим следующий контракт:


Контракт содержит лишь одну функцию doWork , которая принимает количество итераций int _iterations в качестве параметра, после чего считает хеш keccak256 от счетчика цикла. Так мы сможем давать разное количество работы и смотреть как от этого зависит количество требуемого газа. Единственная переменная, сохраняющаяся в контракте — successfullyExecutedIterations , — служит для сохранения количества выполненных циклов при последнем запуске. Она нужна для демонстрации того, что происходит в случае превышения расхода газа.

Сохраним текст контракта в файл UselessWorker.sol. Для компиляции воспользуемся solc — компилятором solidity (инструкцию по установке можете найти по ссылке):


Флагами --bin и --abi говорим компилятору генерировать бинарный код и интерфейс, На команду выдается ответ подобный следующему:


Запустим geth для выполнения деплоя:


Для начала присвоим в переменные бинарный код и интерфейс, скопировав их из вывода компилятора. Обратите внимание, что перед бинарным кодом надо добавить 0x:


Создадим объект контракта как и в случае открытия:


Выполним деплой контракта. Деплой — это тоже транзакция, которая должна выполняться от имени определенного аккаунта, расходует газ и требует ожидания. Поэтому деплой контракта, кроме аргументов конструктора, которые в данном случае не требуются, и массива параметров (from, data, gas), принимает коллбэк (в данном случае простейший, выдающий либо текст ошибки, либо адрес контракта). Но сначала требуется разблокировать аккаунт:


После чего можно выполнять команду с отправкой транзакции от этого аккаунта:


Далее ожидайте подобного ответа:


Это означает, что контракт задеплоен, можно вызывать функции этого контракта:


Обратите внимание, что мы не описывали такой функции в контракте, она создается автоматически для каждого public поля.

2. Эксперименты с расходом газа

Начнем с вычисления примерного количества газа, которое потребуется при вызове функции, для этого можно вызывать метод estimateGas() на интересующем методе контракта, при этом в качестве параметров в estimateGas передаются параметры интересующего метода. В нашем случае можно вызывать так:


Видим, что каждый цикл по расчетам должен тратить 113 газа. Сколько это будет стоить в эфире? Для этого нужно знать какая цена газа будет использоваться. Если она не указывается при отправке транзакции, можно посмотреть значение по умолчанию (сразу делаем преобразование в ether):


Это значит 1 газ по умолчанию в данном случае стоит 0.0000001 эфира. Эта цена не фиксирована и изменялась даже в процессе того как мы выполняли текущие команды. Поэтому ваши значения скорее всего будут отличаться. Комиссия за транзакцию таким образом будет равна цене на газ умноженной на количество газа. Рассчитаем цену для одного цикла (в цену входит не только сам цикл, но и некоторая начальная цена просто за принятие транзакции):


При такой цене около 10000 циклов должно дать комиссию в районе десятых долей эфира. Проверим:


Действительно. Но что будет если указать не 10000, а например 1000000? Результат будет следующий:


Такая непропорциональность возникает из-за того, что есть еще и максимальное количество газа, которое может быть израсходовано. У этого количества так же есть значение по умолчанию но в данном случае его нельзя посмотреть. Посмотрим что будет, если явно задавать лимит газа, который мы готовы оплачивать. Но сначала проверим, не изменилась ли цена:


Выросла почти в 3 раза (у нас это произошло менее чем за пол часа). Цена по умолчанию принимается рыночной цене, поэтому динамически меняется. Чтобы оценка сохранялась для той же цены, что мы использовали в начале, присвоим свою цену за газ (в wei) в переменную:


Рассчитаем цену за 100 тысяч циклов (миллион может выполняться слишком долго) с нашей ценой, но измененным лимитом газа (параметр gas).


Ограничим количество газа до 1000:


В этом случае расходуется весь предоставляемый газ. Никаких изменений на блокчейне не будет сохранено, но майнер все равно получает оплату, так как выполнял работу пока не кончился газ. Поэтому важно правильно указывать лимит газа. Функция estimateGas не всегда может предоставлять достоверные данные, потому что ее выполнение опирается на текущее состояние блокчейна, которое во время выполнения настоящей транзакции может быть другим, что повлечет другой расход газа.

Перейдем к реальному исполнению методов и сравнению с предсказанными значениями. Сначала посмотрим и запомним баланс своего аккаунта:


Допустим мы хотим выполнить 10 циклов. Вычислим сколько газа должно потребоваться на этот вызов:


Используем для этой операции нашу цену fixedGasPrice , но зададим максимальным количеством газа 42000 (этого скорее не хватит, так как меньше предсказанного значения). Поэтому наша оплата, с учетом расхода всего предоставленного газа, должна составить в wei:


Что в эфире будет:


Выполним транзакцию с заданием нашего лимита и цены (но перед этим разблокируем аккаунт):


По номеру транзакции можно отследить ее статус, выполнив:


В результат записывается структура, выглядящая следующим образом:


Если в результате у вас nil — значит транзакция еще не добавилась в блок, надо подождать и повторить команду.

В этой структуре мы видим, что расход газа gasUsed оказался 42000, как и ожидалось. Проверим, изменился ли наш баланс:


Расход оказался 0.0042 эфира, как и ожидалось. Проверим, изменились ли данные в контракте:


В переменную ничего не сохранилось, несмотря на то, что присваивание в контракте выполнялось перед циклом. Таким образом видно, что в случае нехватки газа изменения откатываются полностью. Но эта транзакция все равно добавляется в блок, ведь работа была проведена, поэтому мы можем видеть номер блока и всю остальную информацию. Однако в информации мы не видим никаких других признаков ошибки, кроме того, что был потрачен весь газ. Как же определить статус транзакции в редком, но возможном случае, когда израсходован весь газ, но больше и не требовалось? К сожалению пока нет более простого способа чем либо смотреть через сайт (например вот ссылка для нашей транзакции, можно искать любую другую транзакцию и видеть завершилась ли она с ошибкой), либо заново симулировать отправку той же самой транзакции с помощью средств дебага.

Проверим теперь что будет, если указать лимит чуть больше предсказанного. Также сохраним начальный баланс:


На этот раз выделим 43000 газа, можно ожидать изменение баланса


Выполним транзакцию с заданием нового лимита:


И получим результат ее выполнения:

Использовано 42817 газа (на 1 меньше предсказанного).
Расход эфира:


Ровно столько, сколько необходимо для оплаты использованного газа.

Сохранены ли изменения в контракте?

Безопасность криптокошелька

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


Безопасность кошелька Mist со стороны разработчиков на высоком уровне, но все, кто имеет опыт в криптоотрасли знают, что большая часть проникновений происходит со стороны кошельков клиентов, не соблюдающих все требования безопасности.

Самым главным моментом в обеспечении надежного хранения своих монет является создание резервной копии кошелька Mist и помещение его на съемный носитель, например, флешку или DVD диск. Копирование позволит восстановить счет и баланс на нем, при утере данных основной версии.

При регистрации кошелька и первом с ним обращении резервной копии нет. Потому ее нужно сделать самостоятельно.

Процесс включает в себя несколько этапов:

  • Находим в системной папке место куда сохранены файлы ключей от кошелька;


  • В папке размещены три файла ключей, которые нужно перенести на несколько сторонних носителей и хранить. Здесь подойдут и записи на диск, флешку смартфона и так далее.
Помните. Мошенников, желающих получить доступ к кошелькам с анонимной криптовалютой, по которой просто некому предъявить претензий, много. У пострадавшего даже нет возможности обратиться к правоохранителям, поскольку под отраслью нет юридической базы, да и вряд ли Вас поймут вообще.

С различной информацией на ПК попадают и вирусы, ищущие файлы с определенным разрешением и отправляющие их с исходящей почтой.

Хранить ключи на ПК небезопасно, равно, как и говорить о них даже в кругу знакомых.

Погружение в разработку на Ethereum. Часть 2: Web3.js и газ

В предыдущей статье мы описали деплой контрактов и взаимодействие с ними через пользовательский интерфейс кошелька Mist, но это не подходит для реальной разработки. Нужна библиотека, которая позволит работать с блокчейном из кода пользовательского приложения. В этой статье мы кратко рассмотрим что представляет собой библиотека Web3.js, пощупав ее из консоли Geth. И еще одна важная тема, которая наверняка интересует не только разработчиков, но и потенциальных заказчиков — сколько стоят транзакции на блокчейне, ведь каждая из них требует газа, который покупается за эфир.


Мы уже знаем как деплоить контракты из Mist. Но Mist — это лишь приложение, предоставляющее графический интерфейс к основным функциям. Работает оно на основе клиента Geth. Geth входит в Go-реализацию протокола Ethereum. Go-реализация не единственная, одной из распространенных является к примеру Parity — Rust-реализация. Стоит отметить, что в Parity можно использовать еще одну тестовую сеть — Kovan, использующую Proof-of-Authority — тот же алгоритм распределения работ по созданию блоков, что и Rinkeby (вместо Proof-of-Work в Ropsten). Кроме того для Parity используется не Mist, а кошелек на веб-интерфейсе. Но мы остановимся пока на Go-реализации. Geth является входной точкой в сеть Ethereum. Для демонстрации его работы мы можем воспользоваться предоставляемой им командной строкой. Командная строка интерпретирует обычный JavaScript. Попробуем получить доступ к тому же контракту, который мы создали через Mist в предыдущей статье. Для начала сохраним адрес и интерфейс контракта в какой-нибудь файл, они понадобятся позже. Так как Mist использует Geth, закроем Mist, чтобы не создавать конфликтов (Это не касается Windows-реализации Mist, которая, как выяснилось, требует запущенный Geth для работы).

Вариант приложения с использованием Ruby on Rails и гема ethereum.rb

По-настоящему децентрализованное приложение выглядит как вариант, описанный выше. Пользователь сам подписывает транзакции при помощи ключа, который хранится у него же. Но помимо случаев, когда пользователь приложения непосредственно взаимодействует с блокчейном, бывают случаи, когда требуется доступ к блокчейну на стороне бекенда. Возможно это какое-то внутреннее приложение и действия с блокчейном выполняются от аккаунтов, которые вы контролируете и ключи для которых вы можете хранить на сервере. Возможно логика вашего приложения на смарт контрактах подразумевает реагирование на определенные события от вашего централизованного сервера. В данном случае, помимо web3.js, который вы конечно тоже можете использовать на сервере, было бы неплохо иметь инструмент для привычного вам стека разработки. Для нас таким является Ruby on Rails, поэтому мы решили попробовать библиотеку ethereum.rb, которая должна решать туже задачу, что и web3.js.

Демонстрация приложения доступна по ссылке — Rails API версия.
Исходный код здесь.

Для демонстрации работы с ethereum.rb, мы сделали аналогичный набор функций, описанным в blockchain.js. Код работы с блокчейном можно посмотреть здесь, а мы опишем основные моменты и, возможно, отличия.

Первое — теперь у нас нет доступа к аккаунту пользователя, поэтому нам нужно сделать некоторый процесс авторизации и создавать для каждого пользователя аккаунт в блокчейне. Процесс авторизации в данном примере максимально упрощен, мы просто генерируем токен, который сохраняется в LocalStorage браузера, и по которому происходит авторизация запросов к API.

В целом схема работы с аккаунтами такая:

  1. Пользователь нажимает кнопку Create Account, на сервере в базе данных создается пользователь с уникальным токеном для авторизации, создается аккаунт для подключения к блокчейну и приватный ключ для аккаунта сохраняется в базе данных, токен возвращается пользователю для дальнейшей авторизации.
  2. Пользователь делает запросы к API используя auth token для авторизации.
  3. Приватный ключ пользователя из БД используется для подписи транзакций.


Методы, которые изменяют данные в блокчейне — создают транзакцию, которую нужно подписать приватным ключом. Для работы с приватными ключами используется гем Eth. Ниже демонстрируется процесс создания нового аккаунта для блокчейна и подпись транзакции приватным ключом.

Для примера использования signed_transactions рассмотрим метод завершения Proposal, который вызывает метод executeProposal в смарт контракте:


Метод возвращает хеш транзакции. Логика проверки статуса транзакции аналогична той, что мы использовали в js версии.

Используемые средства

1. MetaMask
  • Обеспечивает подключение к нужной Ethereum-сети через свой удаленный узел, благодаря этому пользователю не требуется разворачивать узел у себя.
  • Позволяет создавать новые или импортировать существующие аккаунты для работы с блокчейном. Это дает возможность подписывать транзакции приватным ключом, который хранится локально у пользователя.

В плагине можно подключаться к реальной и тестовым сетям, нажав на название сети сверху.


При необходимости можно импортировать существующий ключ, но удобнее просто создать новый.


Если вы хотите импортировать ключ, созданный в Geth или Mist — при импорте выбирайте JSON File и находите файл с нужным адресом в директориях

/.ethereum/<сеть>/keystore. Стоит отметить, что по крайней мере на Ubuntu на момент публикации статьи есть баг с открытием JSON файла: после выбора файла окно MetaMask закрывается и никакой ключ не импортируется. В этом случае попробуйте открыть MetaMask в отдельной вкладке, используя адрес расширения chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/popup.html
Кстати, выбрав тестовую сеть и нажав BUY можно получить ссылки на ресурсы, раздающие тестовый эфир. Даже для Ropsten (достаточно нажать request 1 ether from faucet):



2. Использование библиотеки Web3.js с плагином MetaMask

Web3.js — это JavaScript библиотека, та же, которую мы использовали в Geth в предыдущей статье. MetaMask встраивает Web3.js в каждую открытую страницу, поэтому можно протестировать простые команды непосредственно в javascript консоли в Chrome Developer Tools. Важно отметить, на момент написания этой статьи, актуальная версия Web3.js — 0.20.1. Документация для версии 0.x.x доступна по ссылке, не путайте с документацией для версии 1.0 (ссылка).
Выполним две команды, одну на получение данных, например баланса аккаунта, вторую на изменение, например задание строки в смарт контракте StringHolder из предыдущей статьи. Предварительно не забудьте создать аккаунт в MetaMask, подключиться к нужной сети (в данном случае Ropsten Test Network) и зайти в консоль Developer Tools.


Не забывайте при вызове методов контракта передавать коллбэк функцию в качестве последнего аргумента. Можно так:


Web3.js использует библиотеку BigNumber для числовых значений. В примере выше ответ выведен без преобразования.
Команды чтения выполняются сразу, а если вы захотите выполнить функцию, изменяющую данные в смарт контракте (не помеченную как constant ), то MetaMask выдаст окно подписи транзакции. Продемонстрируем это, открыв контракт StringHolder из прошлой статьи и вызвав в нем метод задания строки:


После вызова метода setString выдается окно с запросом подтвердить транзакцию и информацией по предположительным затратам газа и эфира. Нажмите Submit. В консоли увидите хеш транзакции.


Через некоторое время проверим, что строка изменилась:


Все работает как должно.

3. Ethereum.rb

Это библиотека для работы с блокчейном Ethereum из Ruby (ссылка на github) — на данный момент поддерживается наиболее активно.
Попробуем открыть контракт StringHolder из irb консоли:


Заметьте, кэмел-кейс (getString) автоматически преобразовался в снейк-кейс (get_string)

Особенность вызова методов здесь в том, что через call вызываются только геттеры, где нужно просто получить данные. Для выполнения транзакций будет нужен transact_and_wait для синхронного вызова либо transact для асинхронного вызова.
Попробуем вызвать функцию set_string , для которой будет создаваться транзакция. Есть два способа: unlockAccount (deprecated) и sign transaction (об этом чуть позже).


Необходимо назначить от кого посылается транзакция (того же, кого мы сейчас разблокировали):


Потом можно вызывать сеттер вместо call подставив либо transact_and_wait , либо transact :


Дожидаемся окончания, вызываем


Видим наши изменения — все работает.

Криптовалютный кошелек Mist: обзор, руководство, рекомендации


Проблема хранения криптовалют возникает в тот момент, когда решается вопрос с их получением, покупкой или добычей.

Хранилище должно быть полностью безопасным, доступным из любой точки мира и давать пользователю возможность оперативно распоряжаться своими средствами.

Как и криптовалют, кошельков и их производных огромное количество.

В данном материале мы рассмотрим криптокошелек Mist – одно из официальных программных хранилищ Ethereum.


Содержание:

Преимущества и недостатки кошелька Mist

  • Официальное предложение от разработчиков криптовалюты. Кто лучше команды понимает узкие места сети? Специально разработанное для обращающих ETH в сети участников, приложение Mist обеспечивает полный контроль над средствами;
  • Возможность работы с ПК. Мы в обзоре как раз рассмотрели данный вариант. Размещенный на PC кошелек позволяет просто и быстро оперировать средствами;
  • Мобильная работа. Безопасность мобильной версии обеспечат мультиподписи по каждому ключевому действию;
  • Простота и интуитивно понятный интерфейс кошелька Mist;
  • Возможность локального хранения ключей доступа;
  • Открытый исходный код.
  • Необходимость содержания всего блокчейна на устройстве, с которого производится работа с кошельком. Это требует значительного места на диске и затрудняет оперативную работу, если потребовалось восстановление кошелька;
  • Сроки синхронизации. Объемный блокчейн синхронизируется несколько суток, а при относительно слабом интернет-соединении еще дольше.

Что должен делать наш DApp


Два js модуля — Blockchain.js и BlockchainApi.js — отвечают за работу с блокчейном. Они делают одно и тоже, только первый работает c Web3.js и через ноду MetaMask напрямую обращается к блокчейну, второй — делает ajax запросы к Rails API, где уже происходит взаимодействие с блокчейном через гем ethereum.rb. Само клиентское приложение написано на React и не зависит от того, какой js модуль из двух используется.

Скачивание и установка кошелька Mist



Скачивание установочных файлов лучше всего производить из надежного источника.

Выбирайте версию, созданную для Вашей операционной системы.

Обратите отдельное внимание на разрядность системы – это влияет на скорость и качество работы кошелька.

В некоторых ситуациях он просто не запустится. Выбранную версию скачиваете на свой ПК.

Когда архив или пакет файлов скачан, приступаем к установке. Она сводится к нескольким шагам:

  • Распаковываем архив (открываем папку с файлами);
  • Запускаем файл с расширением exe – это мастер установки;
  • Следуем указаниям установщика и проходим все этапы установки;
  • В качестве места для размещения кошелька лучше выбрать не системный диск и создать отдельную папку;
  • Соглашаемся с условиями использования кошелька и правилами разработчиков.
Важно! Установка программного кошелька Mist потребует загрузки на ПК всего блокчейна, сформировавшегося на момент установки. Процесс потребует значительного времени и свободного места на диске. Очень желательно не перезагружать PC в процессе и не отключать его, чтобы избежать ошибок и дополнительных проверок.


Когда установка завершена, проходим несложную процедуру регистрации.



Процесс начинается с выбора типа версии кошелька с которой предстоит работать. Она может быть тестовой или основной.

Первая позволит познакомиться с возможностями и удобством приложения и проходит быстрее. Для тестовой версии загружается только финальный отрезок блокчейна.

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


Первым вопросом системы будет уточнение о том, первичная происходит установка или восстановление из резервной копии. В нашем случае установка первичная, потому пропускаем этот шаг кнопкой “Skip”.

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

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

На втором шаге вводим пароль, которым будет закрыт доступ к частному (Вашему) ключу.

Лучше сделать его максимально сложным и запоминающимся для себя.

Лучшей защитой от мошенников будет удержание его в голове без переноса на физические носители.


Снова последует напоминание о необходимости резервного копирования.

Следующий шаг – внесение минимальной суммы ETH на счет.

Этот ход реализован для исключения создания сотен и тысяч пустых кошельков, нагружающих систему.

Пополнить счет можно через интерфейс интегрированной в кошелек Mist криптобиржи ShapeShift, где на Эфириум можно обменять более 100 криптовалют и токенов.


Адрес Вашего кошелька в Mist показан в поле “Destination”.

Дальнейшие этапы регистрации потребуют только Вашего согласия с условиями и правилами работы. Теперь осталось дождаться окончания синхронизации кошелька Mist с блокчейном для начала полноценной работы.

Читайте также: