Меню Рубрики

Установка ethereum wallet в ubuntu

Эксперименты с контрактами Solidity в тестовой сети Rinkeby блокчейна Ethereum

Эта статья представляет собой небольшое практическое руководство, которое поможет вам быстро настроить среду разработки смарт-контрактов на языке Solidity для блокчейна Ethereum. Вы опубликуете первый контракт, сохраните его в тестовом блокчейне Rinkeby и научитесь вызывать методы контракта. Это будет ваш первый шаг на пути создания децентрализованных приложений DApp (Decentralized Application).

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

При погружении в эту тему я использовал приложение (браузер) Mist в среде Microsoft Windows, а также интерфейс командной строки Geth узла Ethereum в среде Ubuntu. В этой статье мы расскажем о работе с Geth, а также немного о том, как вызывать методы контрактов из Node.js.

С благодарностью приму замечания и пожелания по дальнейшим статьям про блокчейн Ethereum, разработку контрактов на языке Solidity и приложений DApp.

Погружение в тему

Прежде чем начинать создание смарт-контрактов, я рекомендую изучить технологию блокчейна (Blockchain). Например, для начала вы можете почитать статью Объяснение блокчейна для веб-разработчиков, опубликованную на Хабре.

Ethereum — это децентрализованная платформа для разработки смарт-контрактов и создания так называемых децентрализованных приложений DApp. Сайт Ethereum находится по адресу https://www.ethereum.org/. Здесь вы найдете ссылки на основные ресурсы, которые будут вам полезны.

Например, по адресу http://www.ethdocs.org/en/latest/ опубликована документация платформы.

Руководство по языку Solidity находится здесь. Имеется перевод на русский язык, который, однако, может отставать от оригинальной документации.

По ходу изложения материала мы будем делать ссылки на те или иные ресурсы.

Установка узла Ethereum на виртуальной машине Ubuntu

Для публикации контрактов и работы с Ethereum обычным пользователям компьютеров будет проще использовать браузер Mist с визуальным интерфейсом в среде Microsoft Windows. Однако разработчикам программного обеспечения (ПО) для понимания происходящего будет полезнее иметь дело с командной строкой.

Мы установим Go Ethereum — одну из трех оригинальных реализаций протокола Ethereum, написанную на языке Go (еще есть реализации на С++ и Python).

Go Ethereum можно установить на серверные платформы Ubuntu, Arch Linux и FreeBSD. Я выбрал Ubuntu, так как она похожа на Debian, а Debian мы применяем на нашем сервисе интернет-магазинов. Для эксперимента я установил ОС Ubuntu 17.10 на виртуальную машину под управлением VMWare Workstation.

Срзу после установки Ubuntu нужно добавить возможность подключения через SSH. Дополнительно я установил редактор Vim:

Далее нужно установить стабильный релиз Go Ethereum:

Полностью этот процесс описан здесь.

Теперь нам нужно установить полный узел (full node) тестовой сети Rinkeby. Инструкция для узлов различного типа находится здесь: https://www.rinkeby.io/#geth. Нам нужен блок этой инструкции для полного узла.

Прежде всего, копируем файл rinkeby.json в домашний каталог отсюда: https://www.rinkeby.io/rinkeby.json.

Далее открываем первое консольное окно, создаем в домашнем каталоге папку rinkeby и запускаем команду:

Эта команда запускается только один раз при инициализации. Здесь предполагается, что данные узла будут храниться в каталоге /home/frolov/rinkeby, а файл rinkeby.json — в каталоге /home/frolov/. Разумеется, вы можете выбрать другое расположение каталогов.

После завершения инициализации в этом же окне запускаем geth со следующими параметрами (вместо shop2you в параметре ethstats укажите какое-нибудь свое уникальное имя):

Описание параметров команда geth вы можете найти по адресу https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options. Также можно посмотреть справку по параметрам geth с помощью команды:

Параметр —network >
Параметр —rpc разрешает работу сервера HTTP-RPC. Мы будем подключаться к нашему узлу из второго консольного окна через этот сервер. С помощью параметра —rpcaddr мы указываем, что сервер работает на всех сетевых интерфейсах узла (по умолчанию только на localhost). При помощи параметра —rpcapi мы указываем, какие API будут доступны через интерфейс HTTP-RPC.

Параметр —ethstats указывает URL-адрес отчета службы ethstats и задается в формате nodename:secret@host:port. И, наконец, параметр —bootnodes задает URL-адреса для загрузки P2P (Comma separated enode URLs for P2P discovery bootstrap).

Итак, мы запустили узел Go Ethereum для сети Rinkeby в первом консольном окне. Во втором консольном окне подключаемся к этому узлу с помощью такой команды:

После подключения вы увидите командное приглашение утилиты geth. Введите в нем следующую команду:

Эта команда покажет версию программного интерфейса Web3, с помощью которого мы будем работать с контрактами, версию geth, а также номер сети, который для Rinkeby равен 4.

Синхронизация узла

Прежде чем продолжить работу, необходимо дождаться окончания синхронизации узла. Запустите во втором окне в приглашении geth команду eth.syncing:

Так вы не запускаете процесс синхронизации (он должен запуститься автоматически), но, повторяя время от времени запуск команды, сможете отслеживать ход процесса. Когда синхронизация будет завершена, команда вернет false:

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

Заметим, что синхронизация начинается не мгновенно после запуска узел geth, и на ее завершение в сети Rinkeby может уйти достаточно продолжительное время, порядка нескольких десятков минут.

Добавление аккаунтов

Сразу после установки нового узла вам нужно добавить в него аккаунты (если у вас уже есть аккаунты на других узлах, их можно перенести на новый узел).

Для добавления аккаунта введите в приглашении geth команду personal.newAccount():

Здесь вам нужно будет ввести пароль. При работе с настоящей, не тестовой сетью Ethereum, нужно особенно позаботиться о сохранении пароля. Лучше всего не записывать пароль на компьютер, даже на зашифрованный диск. Дело в том, что вирусы или троянские программы смогут похитить пароль с зашифрованного диска, т.к. когда вы работаете с диском, его содержимое становится доступным. Также существуют кей-логгеры, которые могут перехватить пароль при его вводе с клавиатуры.

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

После ввода пароля на консоли появится адрес аккаунта, в нашем случае это «0x7d9006e7f24bd6d90dd8cc63764ab0b92b77d9b3» (у вас будет другой адрес). Заметим, что адреса созданных аккаунтов записывать не обязательно, т.к. их можно посмотреть при помощи команды eth.accounts:

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

Для каждого аккаунта создается приватный ключ. В нашем случае все ключи находятся в каталоге /home/frolov/rinkeby/keystore. Рекомендую сохранить эти ключи в безопасном месте, особенно если они относятся к аккаунтам основной, а не тестовой сети.

Пополнение аккаунта эфиром

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

Этой команде также можно предавать идентификатор аккаунта:

Чтобы пополнить кошелек в тестовой сети Rinkeby вам не потребуются реальные бумажные деньги или криптовалюта. Воспользуйтесь сайтом https://faucet.rinkeby.io/. Вам также потребуется аккаунт в Google+, Facebook или Twitter.

Сделайте публикацию в одной из перечисленных социальных сетей, содержащую адрес вашего аккаунта, такой как 0x7d9006e7f24bd6d90dd8cc63764ab0b92b77d9b3 (у вас будет другой адрес).

Далее скопируйте адрес публикации в поле Social network URL containing your Ethereum address и выберите из списка Give me Ether одно из значений.

Здесь вы можете получать 3 Ethers каждые 8 часов, 7.5 Ethers каждый день или 18.75 Ethers каждые три дня. Для начала работы вам вполне хватит 3 Ethers, так что можете выбирать первый вариант.

Если вы все сделали правильно, через некоторое время «эфирчики» поступят на ваш аккаунт. Разумеется, эти средства вы сможете потратить только в тестовой сети Rinkeby.

Контракт для публикации

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

Этот контракт позволяет хранить текстовую строку и числовое значение. С помощью методов setString и getString можно, соответственно, записывать и читать строки. Аналогичные методы setValue и getValue предусмотрены для числовых значений.

Я создал три тестовых аккаунта:

Для публикации контракта я буду использовать последний из них с адресом 0x957f5272eadf4e284aade9b2cb2a41f475936d07. На этот адрес можно ссылаться следующим образом:

Убедимся, что на аккаунте accounts[2] имеются средства:

Перед публикацией контракта (а также перед вызовом методов контракта, изменяющих данные), необходимо разблокировать аккаунт. Это можно сделать при помощи метода personal.unlockAccount:

У вас будет запрошен пароль, который вы задавали при создании аккаунта.

Читайте также:  Установка блокировки заднего дифференциала на прадо

Компиляция контракта

Далее нам нужно создать для контракта так называемый Application Binary Interface (ABI), а также выполнить компиляцию исходного текста контракта, написанного на языке Solidity.

Интерфейс ABI представляет собой спецификацию взаимодействия контракта с системой Ethereum, или, проще говоря, спецификацию параметров и возвращаемых значений методов контракта. Подробнее об этом можно почитать здесь.

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

Интерфейс ABI и бинарный код программы проще всего получить при помощи браузерного инструмента IDE Remix, доступного по адресу https://remix.ethereum.org. Руководство по использованию Remix можно найти здесь.

Откройте в браузере IDE Remix, и скопируйте код нашего контракта HelloSol в окно исходного текста, как это показано на рисунке ниже:

По умолчанию код будет сразу же откомпилирован, т.к. установлен флажок Auto compile. Чтобы получить ABI и двоичный код, щелкните кнопку Details. Найдите в появившемся окне блок web3Deploy:

Скопируйте отсюда блок кода при помощи кнопки Copy value to clipboard и вставьте этот текст в какой-нибудь текстовый редактор, например, в редактор Vim.

Публикация контракта

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

Перед тем как это сделать, я отредактировал строку from: web3.eth.accounts[0], заменив ее на from: web3.eth.accounts[2]. Это было сделано, чтобы выполнить публикацию от аккаунта web3.eth.accounts[2], на котором имеются средства. Если вы создали только один аккаунт и пополнили его эфиром, то ничего редактировать не нужно, просто вставьте в окно консоли в приглашении программы geth текст, скопированный из Remix:

Как только вы скопируете текст, то увидите в консоли следующее:

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

Теперь ваш контракт опубликован в сети Rinkeby, и ему присвоен адрес 0x11c63c5ebc2c6851111d881cb58c213c609c92d4. Пользуясь этим адресом, любой пользователь сети Rinkeby сможет обращаться к контракту, вызывая его методы.

Вызов методов контракта

Теперь займемся самым интересным — взаимодействием с контрактом. Мы будем вызывать его методы из консоли geth, используя API JavaScript Web3, описанный здесь. Заметим, что это документация на стабильную версию Web3 0.2x.x. Есть еще не реализованная версия 1.0, описанная по адресу http://web3js.readthedocs.io/en/1.0/index.html.

Прежде всего, в консольном приглашении Geth введите следующую строку:

Здесь на основе ABI будет создан объект нашего контракта. Вызовем для него метод at, передав этому методу в качестве параметра адрес контракта 0x11c63c5ebc2c6851111d881cb58c213c609c92d4, полученный нами на шаге публикации контракта:

Теперь можно вызывать методы контракта. Как и ожидается, метод getValue возвращает нулевое значение, т.к. мы еще не сохраняли в базе контракта никаких значений:

Перед тем как вызывать метод setValue, нам необходимо разблокировать аккаунт при помощи метода unlockAccount:

Если вы помните, ранее мы разблокировали аккаунт перед публикацией контракта.

После того как аккаунт разблокирован, вызываем метод setValue:

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

Теперь попытаемся получить значение методом getValue:

Вначале этот метод будет возвращать нулевое значение, и только через некоторое время мы получим наше новое значение.

Аналогичный эксперимент мы можем провести и с методами getString и setString, которые извлекают из базы контракта и изменяют в базе текстовую строку, соответственно:

Установка пакетного компилятора sol

Небольшие контракты очень удобно отлаживать при помощи IDE Remix. Однако есть и альтернатива — пакетный компилятор solc, который можно запускать в командной строке. Документация по этому компилятору находится здесь.

Я использовал для установки solc следующую команду:

После установки можно узнать версию компилятора:

Давайте выполним компиляцию нашего контракта HelloSol, получив для него файлы, содержащие ABI и двоичный код. Запишите исходный текст контракта в файл HelloSol.sol, а затем выполните следующую команду:

После ее выполнения в подкаталоге build текущего каталога будут созданы два файла — HelloSol.abi и HelloSol.bin. Первый из них содержит ABI, а второй — двоичный код откомпилированного контракта.

Для деплоя контракта можно использовать приведенный код из Remix, подставив в него результат компиляции — содержимое файлов HelloSol.abi и HelloSol.bin. При этом нужно проследить за тем, чтобы не было переводов строк внутри строк содержимого этих файлов.

Вызов методов контракта из Node.js

Для децентрализованных приложений DApp необходимо сделать пользовательский интерфейс. Можно связать обычное Web-приложение с системой контрактов, например, при помощи сервиса на базе Node.js. Давайте попробуем обратиться к методам нашего контракта через скрипт JavaScript, работающего на сервере под управлением Node.js.

Прежде всего, установим Node.js:

Также нам потребуется npm:

На следующем этапе нам нужно будет установить git, а также API Web3, причем стабильной версии. По умолчанию устанавливается нестабильная версия 1.x, поэтому сделаем так:

Чтобы проверить, что у нас все получилось, запустите в консоли Node.js при помощи команды node. Из консольного приглашения node введите следующие команды:

Здесь мы подключились у узлу node и посмотрели список аккаунтов, созданных на этом узле.

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

Вместо звездочек укажите свой пароль к аккаунту.

Далее вы можете попробовать в приглашении Node.js подключиться к опубликованному ранее контракту и вызвать его методы:

Мы подготовили скрипт nodejs_web3_test.js, который можно запускать командой «node nodejs_web3_test.js» из консоли Ubuntu:

Этот скрипт подключается к узлу, затем выводит список аккаунтов. Далее он подключается к контракту 0x11c63c5ebc2c6851111d881cb58c213c609c92d4 и вызывает его методы.

Вот что примерно вы увидите на консоли:

Заключение

Затронутая мною тема смарт-контрактов слишком масштабна и охватить ее в одной статье невозможно. Тут потребуется очень толстая книга! Я не рассмотрел некоторые очень важные темы, например, экономику Ethereum, единицы работы Gas, фильтры и многое другое. Но у меня есть планы создания новых статей, а возможно, и книги. Мне хотелось бы знать, о чем нужно рассказать в первую очередь, так что я очень жду ваших откликов!

Update: Книга написана, ссылка ниже!

Читайте также мои книги и статьи про Ethereum:

источник

Гид по владению аккаунтами и контрактами в Ethereum

Материал, который мы решили сегодня опубликовать, родился уже около 6 месяцев назад и до сих пор не потерял своей актуальности (может быть, пришлось его чуть-чуть освежить). Тогда мы еще были способны удивляться, глядя на бизнесменов и стартаперов, намеревающихся проводить ICO, но при этом не способных сделать транзакцию с переводом одной эфирки. Сегодня мы уже перестали удивляться, но таких персонажей не стало сильно меньше.

Вообще, понимание важности безопасного хранения своих секретных ключей и умение это делать — основа децентрализованной экономики, которая, как мы надеемся, скоро существенно потеснит классическую централизованную модель. Нужно чётко понимать, что как только вы передаете управление своим секретным ключом кому-либо — например банку, бирже, государству — так сразу магия децентрализации пропадает, и можно спокойно менять блокчейн на Postgres без особой потери смысла. Короче говоря, в этой статье мы и расскажем об азах безопасного хранения приватных ключей на примере блокчейна Ethereum.

Если для вас эта статья не несет ничего нового — супер, мы очень рады, что вы в нашем «клубе». И, кстати, теперь у вас есть куда отправлять всех криптонеофитов, чтобы они случайно не потеряли по глупости все свои эфирки.

1. Вводная информация
1.1. Аккаунты
1.2. Кошельки
1.3. Контракты
1.4. Multisig-кошельки

2. Владение
2.1. Довольно безопасное
2.1.1. Ноутбук и операционная система
2.1.2. Ethereum-нода
2.1.2.1 Установка на Linux
2.1.2.2. Установка на macOS
2.1.3. Аккаунт
2.1.4. Собираем подписи в единое целое
2.1.4.1 Стандартный MultiSig wallet
2.1.4.2 MixBytes MultiSig
2.2. Чуть менее безопасное
2.3. Обычное
2.3.1 Ethereum Wallet
2.3.2 MEW

Авторы:
Алексей therealal Макеев
Павел pkruglov Круглов
Сергей BoogerWooger Прилуцкий

0. Do it yourself!

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

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

Читайте также:  Установка chameleon el capitan

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

1. Вводная информация

1.1. Аккаунты

Базовая сущность, которой можно владеть в сети Ethereum, это аккаунт (в эфириум-терминах: external account) — пара из закрытого и открытого ключа. Закрытый ключ должен держаться в секрете, открытый (точнее, адрес, получаемый из него) можно свободно публиковать.

«На» адрес могут перечисляться деньги (в сети Ethereum — ether, эфир). Чтобы обозначить принадлежность любых средств, контрактов, транзакций (отправителя транзакции), используется именно адрес (например, 0x36c9cc925dd58747044f52d0a57917df64555a3d). Однако чтобы выполнить любое действие от имени адреса своего аккаунта, нужен закрытый (секретный) ключ. Именно безопасное хранение секретных ключей и является главной функцией любого криптокошелька. Кошельки дополнительно шифруют закрытый ключ паролем, который нужно вводить в ходе использования ключа для подписи транзакций, именно в этот момент криптокошелек использует секретный ключ для создания подписи к транзакции.

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

Обычно аккаунты (адреса и управляющие ими секретные ключи) сохраняются в специальном файле, называемом keystore. Секретные ключи в нем зашифрованы при помощи пароля, который вы будете вводить каждый раз, когда вам надо будет подписать отправляемую в сеть транзакцию. Это означает, что даже если ваш файл скопируют, то без знания пароля будет очень трудно достать из него секретный ключ. Практически невозможно, если вы используете длинный и сложный пароль, и гораздо проще, если вы используете пароль типа «lena1984», которые перебирают атакующие. В любом случае, утечка этого файла — это серьезная проблема.

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

Зная seed, можно воссоздать тот самый секретный ключ. Seed — это информация, которая позволяет с нуля сгенерировать новый keystore-файл, и в нём задать пароль, который захочется. Этот keystore-файл будет использован для управления теми же самыми адресами, что и предыдущий. Так что храните seed очень надёжно, возможно даже в виде хорошо спрятанной твёрдой копии. Не используйте для seed осмысленные куски текста из литературы, например «moroz i solntse den chudesniy» — атакующие смогут перебрать эти тексты с большей эффективностью, чем случайный набор слов типа «shop ban trick track chrome bunny york».

  • seed — для полного воссоздания аккаунта с нуля;
  • пароль — для расшифровывания сохраненного в keystore-файле секретного ключа, когда он требуется для подписания отправляемой в сеть транзакции.

Большинство кошельков помогает вам сгенерировать надёжный seed. В случае веб-кошельков обычно генерация производится строго у вас в браузере, при помощи JavaScript (программа выполняется у вас на компьютере, внутри вашего браузера, и только ваш браузер видит сгенерированный seed). Но надо понимать, что, если на вашем компьютере работает программа-троян, или в вашем браузере стоит вредоносное расширение, ваш seed может быть украден. Ситуация, когда seed генерируется на стороне сервиса (т.е. он его может подсмотреть) вообще неприемлема. Даже если сервису можно доверять, сам сервис могут взломать.

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

1.2. Кошельки

Программа, которая оперирует с аккаунтами, контрактами и прочими сущностями блокчейна, называется кошельком (wallet) или криптокошельком. Кошелек может содержать несколько аккаунтов и поддерживать одновременную работу с ними. Кошельки бывают в виде обычных программ, в виде отдельного устройства (аппаратные) или в виде web-сервиса. Программа-кошелёк не «хранит в себе биткоины» в виде каких-то данных, а хранит лишь ключи по управлению адресами и умеет общаться с блокчейном (формировать транзакции или искать информацию в блокчейне).

1.3. Контракты

Контракты содержат логику, которая будет выполнена с математической точностью, причем большим количеством майнеров, большинство из которых заинтересованы в честном исполнении контракта. Результирующие изменения состояния контракта будут заверены криптографически и отправлены в общий блокчейн Ethereum, где их может увидеть любой участник. Владение контрактом прописывается в самом контракте (с использованием адресов владельцев, адресов их аккаунтов), т. е. оно является частью логики или состояния контракта. Если логика контракта требует транзакций от нескольких владельцев — ее называют мультиподписью (multi-signature, multisig). Именно на основе такой логики реализованы контракты multisig-кошельков. Мультиподпись не ограничивается защитой контрактов, хранящих эфир, ей можно защитить доступ к любому контракту.

1.4. Multisig-кошельки

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

  • владельцы (обычно это аккаунты);
  • количество подписей для выполнения действий.

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

Не путайте реализацию мультисиг кошельков в Ethereum и в Bitcoin. В отличие от Ethereum, в Bitcoin, чтобы воспользоваться биткоинами с заранее созданного multisig-адреса, все необходимые подписи нужно «собрать» заранее и упаковать в одну транзакцию, тогда как в Ethereum несколько транзакций от подписантов могут приходить независимо.

2. Владение

Ниже описаны несколько способов с разным балансом безопасности, цены и удобства использования. Все сказанное далее — наша рекомендация.

2.1. Довольно безопасное

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

2.1.1. Ноутбук и операционная система

Покупается у надежной компании, которая понятия не имеет, для чего будет использован ноутбук. Компания должна иметь околонулевой мотив встроить в ноутбук программные/аппаратные «закладки». Все ноутбуки приобрести у разных компаний. Железо должно быть надежное и иметь минимальную вероятность обычной поломки. В случае поломки/проблем — либо решаем сами, либо вынимаем все жесткие диски и отдаем в ремонт, после которого ноутбук НЕ используем для дальнейшего хранения аккаунтов.

Операционная система: Linux либо macOS. Аппаратные требования: SSD (обязательно SSD!), диск 256+ Гб, оперативная память 16+ Гб, процессор уровня Intel Core i5 или лучше. Между ноутбуком и интернетом должен быть firewall, например на маршрутизаторе. Ноутбук должен быть чистым: не устанавливать никаких программ, кроме операционной системы и Ethereum-ноды, не подключать никаких сторонних флешек и дисков. Никаких инструментов удаленного управления!

2.1.2. Ethereum-нода

Кошельки используют Ethereum-ноду для взаимодействия с блокчейном. Нужна так называемая полная Ethereum-нода.

2.1.2.1. Установка на Linux

Будем рассматривать установку на deb-совместимые дистрибутивы (Debian, Ubuntu, CentOS). Заходим на https://github.com/ethereum/mist/releases и скачиваем последний релиз, на момент написания статьи это был 0.9.3:

После скачивания неплохо проверить целостность пакета, чтобы исключить подмену файла. Для этого на странице представлены SHA256-хеши всех файлов, например для Ethereum-Wallet-linux64-0-9-3.deb это 946b4b7dec1b6f2b58b6ef21d06a12dcee691fa2186baad7d99872f94240ced8.

В Linux вычислить хеш можно с помощью стандартной консольной утилиты sha256sum. В окне терминала вводим следующую команду:

    $ — приглашение терминала, означающее, что команда будет выполнена от имени пользователя (вводить не нужно);

— путь до директории текущего пользователя;

/Downloads/Ethereum-Wallet-linux64-0-9-2.deb — полный путь к файлу.

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

  • sudo — команда, позволяющая выполнить действие с правами root (администратора);
  • dpkg — стандартная утилита для установки deb-пакета;
  • -i — флаг установки пакета (install).
Читайте также:  Установка постамента для раковины

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

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

2.1.2.2. Установка на macOS

Для установки используем ту же страницу https://github.com/ethereum/mist/releases, только нам потребуется файл с расширением *.dmg, на момент написания статьи это Ethereum-Wallet-macosx-0-9-3.dmg. После скачивания проверим хеш файла через терминал. Для запуска терминала в macOS нужно:

  1. Запустить Finder.
  2. Выбрать в меню Finder пункт «Переход», далее — «Служебные программы».
  3. Найти иконку «Терминал» и запустить.

В терминале ввести команду:

Далее дважды кликаем на dmg-файл и устанавливаем кошелек.

2.1.2.3. Синхронизация ноды

Перед какими-либо действиями в блокчейне следует полностью синхронизировать Ethereum-ноду (дождаться, пока все индикаторы синхронизации, подобные нижеприведенному, закончат работу и исчезнут).

Со временем блокчейн будет «распухать». Чтобы его сжать (либо если с последней синхронизации прошло много времени), можно полностью удалить блокчейн (только блокчейн! Не аккаунт), тогда будет выполнена быстрая синхронизация. Данные блокчейна находятся в директории chaindata, которую можно найти:

/.ethereum/geth/ на Linux;
в

Для удаления данных блокчейна, следовательно, можно просто удалить директорию chaindata. Лучше всего закрыть кошелек, переименовать chaindata в chaindata.old, запустить кошелек (должна начаться синхронизация с нуля и основной интерфейс по-умолчанию не появится — поэтому нажимаем Launch Application), убедиться, что аккаунты на месте (если нет — переименовали что-то не то, ищем их в переименованном каталоге), после чего можно удалять chaindata.old.

2.1.3. Аккаунт

При первом старте Ethereum Wallet следуйте указаниям:

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

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

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

/.ethereum/keystore
в macOS:

Эти же директории можно открыть в Ethereum Wallet через верхнее меню File -> Backup -> Accounts.

2.1.4. Собираем подписи в единое целое

Здесь есть два подварианта. Стандартный MultiSig Wallet подойдет, если актив, которым вы владеете, — это эфир или ERC-20 токены, и он перечисляется вам на адрес (т. е. для получения не требуется дополнительных действий с вашей стороны). Для защиты любого контракта мультиподписью мы разработали свое решение на основе стандартного. Какой из подвариантов выбрать — зависит от того, что нужно защитить.

2.1.4.1. Стандартный MultiSig wallet

Для создания мультисига вам необходимо сделать две вещи:

  • скопировать публичные адреса других созданных аккаунтов на текущий ноутбук;
  • иметь на основном кошельке эфир (порядка 0.2 или более) для отправки транзакций.

Как только условия выполнены, можно приступать к созданию. В разделе Wallet Contracts нажмите на ADD WALLET CONTRACT. Введите имя контракта и выберите опцию Multisignature Wallet Contract. Вы увидите следующее сообщение:

This is a joint account controlled by X owners. You can send up to X ether per day. Any transaction over that daily limit requires the confirmation of X owners.

На этом этапе вам нужно выбрать, сколько владельцев будет у кошелька-контракта и сколько подписей необходимо для совершения транзакции сверх суточного лимита. Далее нужно вставить адреса всех аккаунтов-владельцев (те, что мы создавали ранее на разных ноутбуках) и нажать CREATE.

Для добавления существующего мультисиг-кошелька на другом компьютере (например, если ноутбук понадобилось заменить или переустановить кошелек) вам необходимо сделать импорт уже существующего кошелька. Действия выполняются в главном окне Ethereum Wallet:

  1. На вкладке WALLETS прокрутите вниз до раздела Wallet Contracts и нажмите кнопку ADD WALLET CONTRACT.
  2. Впишите удобное имя кошелька.
  3. Выберите IMPORT WALLET.
  4. Введите адрес кошелька.
  5. Если один из ваших существующих аккаунтов является владельцем кошелька, появится зеленая надпись, подтверждающая это.
  6. Нажмите кнопку CREATE.

Для перевода средств с мультисиг-кошелька вам, как обычно, нужно перейти на вкладку SEND, выбрать адрес мультисиг-кошелька, с которого будете переводить, ввести сумму и пароль для создания транзакции. Однако после ввода пароля вы увидите различия с обычной транзакцией:

Здесь вам нужно одобрить транзакцию кнопкой APPROVE.

Такое же сообщение будет выведено на компьютере другого владельца:

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

2.1.4.2. MixBytes MultiSig

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

Опишем, как посылать транзакции в контракт. Контрактами можно управлять в Ethereum Wallet, в шапке есть вкладка Contracts, переходим в нее:

Здесь можно добавить существующий контракт — нажимаем WATCH CONTRACT. В появившейся форме нужно ввести адрес контракта, его имя (выберите любое — оно остается только в вашем кошельке), а также так называемый ABI (application binary interface, представленный большим JSON-текстом):

ABI должен предоставить разработчик контракта. Или же можно попробовать найти ABI на сервисе etherscan.io по адресу контракта во вкладке Contract Source (только для верифицированных контрактов):

Если все успешно, контракт появится на странице контрактов в кошельке. Заходим в него:

Слева можно посмотреть данные состояния контракта, а справа — выбрать функцию для посыла транзакции (Select function): нажимаем Pick A Function, выбираем нужную функцию, появляется форма, где нужно заполнить параметры вызова:

Когда нужные параметры заполнены, выбираем, от имени какого аккаунта выполнить транзакцию (Execute from), нажимаем EXECUTE (потребуется ввести пароль от аккаунта). После этого транзакция уйдет в сеть и достигнет контракта. Напоминаем, для работы MixBytes MultiSig потребуется проделать аналогичную процедуру на двух или более ноутбуках (в зависимости от минимально необходимого числа подписей). Отправлять подписи сверх необходимых не нужно.

2.2. Чуть менее безопасное

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

Рассмотрим на примере Ledger Nano S. При первом подключении устройства к компьютеру вам необходимо инициализировать устройство, в это входит:

  • Установка 8-значного PIN-кода. Код будет спрашиваться при каждом подключении устройства к компьютеру, а также при выходе из спящего режима.
  • Запись фразы восстановления (seed) из 24 слов. Это узкое место, и здесь остановимся подробнее. Если кто-то получит доступ к фразе — можете попрощаться с активами. Поэтому надо обязательно озаботиться ее хранением в безопасном месте. Запишите на бумажку и спрячьте. Плюс к этому рекомендуем хранить ее в двух разных местах — по сути, сделать резервную копию на случай утери. Существует много способов безопасно хранить фразу и в цифровом виде — хранение по частям, стеганография и т. д. Ограничено лишь вашей фантазией.

В этом аппаратном кошельке можно хранить разные валюты, их число уже приближается к двадцати и постоянно обновляется. Для доступа к отдельным кошелькам используются приложения Chrome, таким образом решена проблема доступа на разных ОС.

2.3. Обычное

Здесь есть много подвариантов. Рассмотрим два.

2.3.1. Ethereum Wallet

О том, как работать с отдельными аккаунтами, рассказано в первом решении («Довольно безопасное», не доходя до раздела «Собираем подписи в единое целое») — это отдельный чистый ноутбук и Ethereum Wallet на нем.

2.3.2. MEW

Наверное, самый популярный кошелек для Ethereum на данный момент, потому что простой. Заходим на сайт https://myetherwallet.com/, выбираем файл с ключом, вводим пароль и уже можем осуществлять транзакции. Без поднятия ноды, скачивания блокчейна и т. д. Сами ключи не уходят на сайт, после загрузки в браузере приложение работает автономно.

Но есть риск того, что сайт подменят. Можем подстраховаться от этого: просто скачать сайт себе на компьютер и открывать его локально, исходный код доступен на Гитхабе. Скачиваем архив с последней версией (на момент написания это был архив etherwallet-v3.21.15.zip), разархивируем и просто открываем index.html. Получаем тот же MEW, но локально.

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

источник