Погружение в разработку на Ethereum. Часть 1. Блокчейн эфир


Создаём собственный блокчейн на Ethereum / Хабр

Как создать приватный блокчейн Ethereum с нуля?

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

Инструкция включает в себя следующее:

  • Создание приватного блокчейна Ethereum с помощью geth.
  • Создание кошелька MetaMask для работы с приватным блокчейном.
  • Перевод средств между несколькими аккаунтами.
  • Создание, развёртывание и вызов смарт-контракта в приватном блокчейне с помощью remix.
  • Создание обозревателя блоков Ethereum поверх приватного блокчейна.
Go Ethereum (или geth) это одна из трёх изначальных реализаций протокола Ethereum (наряду с C++ и Python). Она написана на Go, полностью открыта и лицензирована под GNU LGPL v3. Go Ethereum можно скачать или как отдельный клиент, работающий практически в любой ОС, или как баблиотеку для встраивания в проекты Go, Android или iOS.

Для установки geth под Mac OS X мы использовали homebrew. Homebrew устанавливает всё необходимое, о чём не позаботилась Apple. Эта статья предполагает, что homebrew у вас уже установлен. Если нет, следуйте этой инструкции. После установки homebrew следующие команды установят geth.

brew tap ethereum/ethereum brew install ethereum

Установить geth на Ubuntu довольно просто, достаточно запустить следующие команды apt-get.

sudo apt-get install software-properties-common sudo add-apt-repository -y ppa:ethereum/ethereum sudo apt-get update sudo apt-get install ethereum

Для Windows соответствующий инсталлятор лежит здесь. В случае каких-либо сложностей обращайтесь к инструкции.

Сначала нужно создать аккаунт для майнинга Ethereum. Так мы сгенерируем пару приватного и публичного ключей с паролем для защиты. Не потеряйте свой пароль, иначе никогда не сможете восстановить ключи. По умолчанию, ключи хранятся внутри: <datadir>/keystore. Всё, что сохраняет geth, хранится внутри datadir (кроме PoW Ethash DAG). Расположение директории по умолчанию зависит от ОС. Всегда лучше изменить стандартные настройки и задать свой собственный путь для приватного блокчейна.
  • Mac: ~/Library/Ethereum
  • Linux: ~/.ethereum
  • Windows: %APPDATA%\Ethereum
Ethash DAG хранится в ~/.ethash (Mac/Linux) или %APPDATA%\Ethash (Windows), так что его могут использовать все клиенты.

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

geth account new --datadir <path-to-data-directory>

Пример:

geth account new --datadir /path/to/data/dir

Блокчейны Ethereum отличаются друг от друга первичными блоками. Каждый блокчейн начинается с такого блока, а всё остальное строится поверх него, где каждый следующий блок ссылается на предыдущий. В публичном блокчейне Ethereum первичный блок был создан 20 июля 2015 года. Для нашей собственной цепочки нужно создать собственный первичный блок. Инициализация приватного блокчейна с заданным первичным блоком осуществляется следующей командой:

geth -datadir <path-to-data-directory> init <path-to-genesis-block>

Пример:

geth -datadir /path/to/data/dir init /path/to/genesis.json

  • datadir: директория для баз данных и хранилища ключей.
  • init: начальная загрузка и инициализация нового первичного блока  — с соответствующим файлом json.
Ниже показан наш первичный блок, который используется в приватном блокчейне —  нужно сохранить его под именем genesis.json и указать в приведённой выше команде.{ "config": { "chainId": 15, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "difficulty": "0x400", "gasLimit": "0x2100000", "alloc": { "7a69b359e86893efa3d9732e4c65ced51567edd0": { "balance": "0x1337000000000000000000" } } }
  • chainid: обеспечивает способ совершения транзакций в Ethereum без использования ETC (Ethereum Classic) или тестовой сети Morden. EIP 155 предусматривает следующие значения chainid для разных сетей: основная сеть Ethereum (1), основная сеть Morden / Expanse (2), Ropsten (3), Rinkeby (4), основная сеть Rootstock(30), тестовая сеть Rootstock (31), Kovan (42), основная сеть Ethereum Classic (61), тестовая сеть Ethereum Classic (62), приватные цепочки geth (1337 по умолчанию). В нашем примере мы указали идентификатор 15, который не используется ни одной из существующих цепей.
  • homesteadBlock: значение 0 указывает на использование релиза Ethereum Homestead. Это второй из основных релизов Ethereum —  а недавно, 16 октября 2017 года, Ethereum форкнулся на релиз Byzantium.
  • eip155Block: значение 0 указывает, что этот блок поддерживает EIP (Ethereum improvement proposal, предложение об улучшении Ethereum) номер 155. Предложения EIP описывают стандарты для платформы Ethereum, в том числе ключевые спецификации протокола, клиентские API и стандарты контрактов.
  • eip158Block: значение 0 указывает, что этот блок поддерживает EIP 158.
  • difficulty: значение соответствует уровню сложности, которое применяется для поиска случайного значения nonce к этому блоку. В этой статье подробно объясняется, как рассчитывается уровень сложности в Ethereum.
  • gasLimit: газ — это внутренняя единица оплаты для проведения транзакции или контракта в Ethereum. Каждая инструкция, которая отправляется в виртуальную машину Ethereum Virtual Machine (EVM) для обработки транзакции или смарт-контракта стоит определённое количество газа. Если транзакция не получает нужного количества газа, то она не пройдёт. При совершении каждой транзакции в Ethereum вы указываете лимит газа —  максимальное количество, которое могут использовать все сопутствующие операции для этой транзакции. Параметр gasLimit в блоке определяет общий лимит всех транзакций в блоке.
  • alloc: параметр для предварительного распределения Эфира из первичного блока на один или несколько аккаунтов. В вышеприведённом примере первичного блока весь Эфир поступает на аккаунт, созданный с самого начала.
Всё готово! Теперь можно начать майнинг через geth с помощью следующей команды. Здесь параметр networkid выделяет эту сеть Ethereum среди других. Все майнеры, желающие подключиться к этой сети, должны использовать тот же идентификатор networkid с тем же первичным блоком.

geth --mine --rpc --networkid <networkd-id> --datadir <path-to-data-directory>

Пример:

geth --mine --rpc --networkid 1999 --datadir /path/to/data/dir

Можно или начать майнинг как console , или запустить console  отдельно — и подключить её к узлу майнинга командой attach. Сейчас покажу, как это делается, и проверьте, что вы указали параметры в том же порядке.

geth --datadir <path-to-data-directory> attach ipc:<path-to-data-directory>/geth.ipc

Пример:

geth --datadir /path/to/data/dir attach ipc:/path/to/data/dir /geth.ipc

Консоль подключается к узлу майнинга по IPC. IPC (межпрорцессное взаимодействие) работает на локальном компьютере. В этом случае geth создаёт конвейер Geth (который представлен файлом <path-to-data-directory>/geth.ipc) в файловой системе локального компьютера — а консоль подключается к этому узлу по IPC.

Как только вы подключились к консоли geth, можно попробовать запустить следующую команду для отображения всех доступных аккаунтов.> eth.accounts ["0x7a69b359e86893efa3d9732e4c65ced51567edd0"] Следующая команда позволяет просмотреть баланс заданного аккаунта из консоли geth.

> eth.getBalance("0x7a69b359e86893efa3d9732e4c65ced51567edd0") 1.295e+21

MetaMask — это кошелёк Ethereum, работающий как расширение Chrome. Он внедряет Ethereum Web3 API в каждый контекст JavaScript на сайте, так что все эти приложения способны получать информацию из блокчейна. MetaMask также позволяет создавать собственные идентификаторы (identities) и управлять ими, так что когда приложение хочет совершить транзакцию и записать данные в блокчейн, у пользователя есть безопасный интерфейс для просмотра транзакции, прежде чем одобрить или отклонить её.

Для подключения MetaMask к приватному блокчейну Ethereum нужно выбрать правильные имя хоста и порт. Web3 API — это программные интерфейсы JavaScript для Ethereum, реализованные в web3.js. Чтобы JavaScript-приложение обменивалось данными с узлом Ethereum, MetaMask использует библиотеку web3.js с удобным интерфейсом для методов rpc. Она обменивается с локальным узлом вызовами rpc. Библиотека web3.js работает с любым узлом Ethereum, у которого есть слой rpc. Вы могли заметить выше, что при запуске узла майнинга можно передать параметр rpcapi и указать, какие интерфейсы мы хотим использовать на этом узле. По умолчанию, если ничего не указать, будут использоваться интерфейсы eth,net,web3 .

MetaMask создаст аккаунт Ethereum —  секретный ключ и адрес Ethereum. Дальше разберёмся, как передавать Эфир с первого аккаунта, созданного в самом начале, на аккаунт MetaMask из консоли geth. Для передачи средств аккаунта нужно использовать для подписи секретный ключ этого аккаунта. Чтобы его использовать, нужно его сначала разблокировать, как показано ниже.

> personal.unlockAccount( "0x7a69b359e86893efa3d9732e4c65ced51567edd0","password")

personal — это управляющие программные интерфейсы в geth. Кроме personal, geth также предоставляет следующие управляющие API: admin, debug, miner и txpool. Как только мы разблокировали аккаунт, мы можем определить в консоли три переменные: для sender, receiver и amount, то есть получателя, отправителя и количества передаваемых средств. Значение sender — это адрес Ethereum, который мы создали в начале этой статьи, а значение receiver — адрес Ethereum, созданный в MetaMask.

> var sender = "0x7a69b359e86893efa3d9732e4c65ced51567edd0"; > var receiver = "0xA9f28458eE1170F285440990c196c1592D3a73f5" > var amount = web3.toWei(1, "ether")

Следующая команда осуществит передачу средств —  она ссылается на переменные, которые мы определили выше.

> eth.sendTransaction({from:sender, to:receiver, value: amount})

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

Другой способ — через консоль geth, с помощью следующей команды.

< eth.getBalance("0xA9f28458eE1170F285440990c196c1592D3a73f5") 1000000000000000000

Solidity — самый популярный язык программирования для написания смарт-контрактов Ethereum. Remix — это IDE для Solidity со встроенным отладчиком и средой тестирования. Онлайновый редактор remix можно найти здесь. Remix подключается к любой сети Ethereum. Для подключения к нашему локальному блокчейну убедитесь, что вы запустили узел майнинга следующей командой, как показано ниже. О параметре --rpccorsdomain "*" мы уже говорили. Вместо звёздочки (максимальная открытость) в качестве значения этого параметра можно указать “https://remix.ethereum.org”.

geth --mine --rpc --rpccorsdomain "*" --networkid <networkd-id> --datadir <path-to-data-directory>

Для подключения remix к нашей закрытой сети нужно изменить Environment на Web3 Provider, это делается на вкладке Run. При этом изменении remix попросит указать Web3 Provider Endpoint  —  установите значение http://localhost:8545. Пока вы явно не изменили порт, по умолчанию узел для майнинга стартует на порту 8545.

Теперь всё готово для написания самого первого смарт-контракта, который мы запустим в сети Ethereum. Скопируйте следующий код и вставьте его в онлайновый редактор remix. Это очень простой смарт-контракт —  я даже не хочу объяснять его построчно. В следующей статье подробно рассмотрим язык программирования Solidity.pragma solidity ^0.4.11; contract Hello { // a string variable string public greeting; // the function with the same name as the class is a constructor function Hello(string _greeting) { greeting = _greeting; } // change the greeting message function setGreeting(string _greeting) { greeting = _greeting; } // get the greeting message function greet() constant returns (string _greeting) { _greeting = greeting; } } Если вы не меняли настройки по умолчанию в remix, то они установлены на автоматическую компиляцию. Если нет, то надо скомпилировать код.

После компиляции при нажатии кнопки Details вы увидите расчётное количество газа, необходимое для создания этого смарт-контракта.

Теперь можем внедрить смарт-контракт в наш приватный блокчейн. На вкладке Run убедитесь, что у вас выбран правильный аккаунт Ethereum и правильный лимит газа. Значения gas price и value можно указать нулевыми.

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

> personal.unlockAccount( "0x7a69b359e86893efa3d9732e4c65ced51567edd0","password")

Теперь можете нажать кнопку Create, чтобы создать смарт-контракт. У нас в нём конструктор, принимающий строковый параметр, вот почему remix показывает поле ввода вместе с кнопкой Create. Сюда можно ввести какое-нибудь значение (в кавычках, например, “Hi”)  — или просто оставить пустым. В консоли geth при создании смарт-контракта появится следующее сообщение. Также обратите внимание, что если не установлен корректный gas limit, то такая команда приведёт к ошибке.

INFO [10-19|07:31:08] Submitted contract creation fullhash=0xf5511bb9d088672ac0d3896b8590b9a3e25484300f02deecdd739c3a549ed33a contract=0x42b7E903Fb42e191a7D623cbb4b7b4330D329d78

После создания смарт-контракта интерфейс remix немного изменится — как показано ниже, на вкладке Run.

Здесь можно установить некое значение для метода setGreeting — и нажать на него для вызова смарт-контракта. Опять же следует убедиться, что аккаунт разблокирован, потому что при вызове смарт-контракта мы использует транзакции Ethereum и требуется подпись инициатора. Проделав операцию с setGreeting, можно вызвать и другие методы.

Возможно, вы знакомы с сервисом etherscan для сканирования публичного блокчейна Ethereum. Но его нельзя направить на наш локальный блокчейн. Хотя Ethereum Block Explorer даже близко не сравнится по функциональности с etherscan, он вполне подходит для изучения того, что происходит в нашем локальном блокчейне.

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

git clone https://github.com/carsenk/explorer

Затем запустим команду установки из директории Ethereum Block Explorer.

npm install

По окончании установки запустите Ethereum Block Explorer следующей командой — и получите доступ к веб-консоли через http://localhost:8000.

npm start

Перед подключением Ethereum Block Explorer к локальному блокчейну убедитесь, что запустили узел майнинга следующей командой с параметром --rpccorsdomain "*" — его значение мы обсуждали ранее.

geth --mine --rpc --rpccorsdomain "*" --networkid <networkd-id> --datadir <path-to-data-directory>

Обновление: Обсуждение этой статьи на Hacker News см. здесь. Не стесняйтесь присоединяться.

В этой статье мы обсудили, как создать приватный блокчейн Ethereum с помощью geth. Затем настроили кошелёк MetaMask для работы с этим блокчейном и и перевели средства на аккаунт Ethereum, созданный в MetaMask. Для создания, внедрения и вызова смарт-контракта использовалась онлайновая IDE remix. Наконец, мы установили Ethereum Block Explorer для изучения приватного блокчейна.

habr.com

Погружение в разработку на Ethereum. Часть 1 / Хабр

Технология блокчейна завладела умами. Покупаются фермы, ICO собирают миллионы долларов. Наша компания тоже захотела приобщиться. Решили начать с малого. В серии статей будет описан наш путь от новичков в сфере блокчейна до общепризнанных гуру. На момент написания этих слов мы все еще на этапе новичков, предлагаем следить за нашим развитием и развиваться с нами.

Чем хорош блокчейн?

Судя из названия блокчейн — это цепочка блоков. Так и есть. Но что дает эта цепочка? По сути это технология децентрализованного хранения данных с особой структурой, позволяющей быть уверенным, что манипуляции с данными происходили в рамках четко заданных правил. Обеспечивается эта уверенность тем, что массив данных хранится сразу у всех, кто подключился к сети блокчейна — это значит, что недостаточно будет просто подменить весь массив в одном месте. А еще каждая следующая порция данных, так называемый блок, содержит в себе хэш предыдущего блока, это дает два плюса:
  • в готовую цепочку невозможно подставить промежуточный блок,
  • сам блок нельзя изменить, не поменяв при этом его хэш, следовательно это невозможно сделать без нарушения целостности цепочки.
Дерево Меркла — дерево хешей, в данном случае используется для независимого подтверждения валидности отдельных транзакций. Транзакции — это и есть данные в блокчейне Работу по добавлению блоков обеспечивают сами участники сети. Кому будет предоставлено право добавления следующего блока определяется специальным механизмом. Самые распространенные из таких механизмов — это Proof-of-Work и Proof-of-Stake. В первом блоки добавляют майнеры — участники сети, решающие вычислительно сложные задачи, конкурируя друг с другом за право создания блока на основе своего решения, а в награду за успешное создание блока получающие некоторое количество валюты этой сети. В Proof-of-Stake блоки добавляют валидаторы — участники сети, конкурирующие не за счет производительности, а на основе количества внутренней валюты этой сети на их аккаунте. Получают они при этом меньше, но и работы от них требуется меньше. В обоих случаях логика в том, что злоумышленнику для добавления поддельного блока придется потратить больше, чем удастся заработать. В первом случае — на оборудование для майнинга, соизмеримое по мощности с остальными майнерами вместе взятыми. Во втором случае — на покупку 50% валюты сети.

Ethereum

Существуют разные реализации блокчейнов, среди которых самыми популярными сейчас являются Bitcoin и Ethereum. В то время как Bitcoin — это реализация криптовалюты на базе blockchain, целью Ethereum является создание платформы, позволяющей решать самые разные задачи с помощью умных контрактов. Поэтому логично первое знакомство начать именно с Ethereum

Smart Contracts

Манипулирование данными в блокчейне обеспечивается так называемыми умными контрактами (smart contracts). Они описывают какие данные хранить на блокчейне и набор функций для операций над ними. Выполнение функций и получение доступа к данным осуществляется через предоставляемый каждым контрактом интерфейс. Этот интерфейс генерируется из исходного кода отдельно от компиляции и позволяет выполнять бинарный код. Данные для участников сети открыты, и чтение их ничего не стоит, ведь как уже было сказано, данные хранятся у всех участников сети. Изменение данных происходит посредством транзакций. Каждую транзакцию можно представить структурой следующего вида:
  1. Получатель транзакции
  2. Цифровая подпись отправителя
  3. Количество отправляемой валюты
  4. Произвольные данные (необязательно)
  5. Лимит газа на транзакцию
  6. Цена за единицу газа
Что такое газ из пунктов 5 и 6 будет рассказано в следующих пунктах и еще более подробно рассказано в отдельной статье.

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

DApp

DApp — Decentralized Application или децентрализованное приложение. В идеале пишется как ĐApp, но мы будем использовать упрощенное написание. Приложение может быть построено на разных технологиях, но среди них есть и блокчейн со смарт контрактами. Можно сказать, что на данный момент DApp — это логика на смарт контрактах плюс некий пользовательский интерфейс. Хранение более-менее объемных данных и обмен сообщениями в идеальном DApp тоже должны быть децентрализованными, однако эти технологии только начинают появляться и заслуживают отдельной статьи. Блокчейн же обеспечивает хранение текущего состояния и реализует бизнес-логику через смарт-контракты.imageИдеал, к которому стремится развитие децентрализованных приложений. Картинка позаимствована отсюда

Используя DApp, пользователь может получить доступ к блокчейну напрямую на своем компьютере, установив специальное ПО. Блокчейн также может использоваться для каких-то отдельных операций на стороне сервера привычных нам мобильных и веб приложений. Выбор зависит от конкретной задачи. Упрощенный вариант DApp можно представить в таком виде:

Картинка взята и переведена из презентации Игоря Баринова

Фронтенд и бэкенд в данном случае это классические элементы приложения, а функциональность с задействованием блокчейна выполняется на виртуальной машине EVM. Пользователю доступны стандартные функции виртуальной машины — такие как отправка транзакции или просмотр баланса аккаунта, — а также функции, описанные в смарт контрактах, например на языке solidity. Доступ к этой виртуальной машине предоставляется через RPC интерфейс.

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

Первое подключение к блокчейну

Чтобы хоть как-то увидеть что значит быть участником сети мы скачали Mist (на момент написания последняя версия под номером 0.9.0) — кошелек Ethereum. Кошельком Mist называется потому, что в нем можно управлять своими аккаунтами и балансом на них. Основная валюта — ether (эфир), но можно выпускать собственные токены, они также будут отображаться в кошельке. Но Mist — это не только кошелек, а еще и браузер DApp для Ethereum-блокчейна. Он позволяет выкладывать и использовать смарт контракты, а также пользоваться DApp-приложениями.

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

UPD для Windows: Для пользователей Windows следующие пункты несколько осложнены. Требуется установить еще и Geth — клиент командной строки. Перед запуском Mist надо будет выполнить в командной строкеgeth --rinkeby (вместо флага --rinkeby можно использовать --testnet если нужна сеть Ropsten, либо вообще опустить флаг, если нужна главная сеть). Из пользовательского интерфейса уже не получится изменить сеть или начать майнить. Если вы собираетесь подключаться и пробовать майнить на Ropsten — запустите geth такой командойgeth --testnet console 2>nul В geth-консоли можно будет выполнитьminer.setEtherbase("<адрес вашего кошелька>") после чего запуститьminer.start(4) (4 — количество потоков, можно выставить сколько хотите). Имейте в виду, что лучше дождаться окончания синхронизации перед тем, как начинать майнить

1. Во время запуска Mist предлагает выбрать сеть — Main network или Test network. Выбираем Test network.

Для выполнения любых операций на блокчейне требуется валюта этой сети, в данном случае ether. В Main network эфир стоит реальных денег, а в Test network — ничего не стоит и его легче получить. Кроме того, перед запуском к вам на компьютер скачиваются все данные сети, для testnet Ropsten на момент написания статьи это меньше 7 GB, для testnet Rinkeby — 800 MB, для реальной сети — больше 40 GB. Поэтому для начала выбираем Testnet. В реальной сети эфир можно получить купив его на бирже за реальные деньги (на момент написания статьи это около $300), либо намайнить, но для этого требуются довольно большие мощности и затраты времени. В тестовых сетях источники варьируются: это либо майнинг для Ropsten (получение из других источников Ropsten у нас не заработало), либо получение через такие источники как www.rinkeby.io ->Crypto_Faucet для Rinkeby. Майнинг в Testnet занимает значительно меньше времени, чем в реальной сети, например на ноутбучном процессоре i5 6200u мы получали 5 эфиров в зависимости от везения за пару-тройку часов. Скорость майнинга в этом случае была около 50 KH/s (50 KH — 50 килохэшей, или 50 000 хешей в секунду), вы сможете ее увидеть у себя и прикинуть сколько времени потребуется лично вам. Кстати намайнив несколько эфиров на одном клиенте можно будет без проблем передать часть на другой, например если тот майнит медленнее. Стоит упомянуть, что в дальнейшем мы будем использовать только Ropsten, которая является Proof-of-Work сетью, поэтому в ней и используется майнинг. В версиях Mist после 0.9 эта сеть больше не является сетью по умолчанию, поэтому если хотите использовать ее — сначала запустите Mist, нажав Launch Application, затем в пункте меню Develop->Network выберите нужную сеть. В целом надо отметить, что Rinkeby более удобен, так как не требует майнинга, быстрее и легче, поэтому вы не много потеряете используя его. Однако Ropsten более приближен к реальной сети и позволяет почувствовать ее особенности.

2. Итак, запущен Mist, предлагает задать пароль для своего аккаунта. Логин не нужен, так как для идентификации используется файл приватного ключа.

Приватный ключ хранится на линуксе в папке ~/.ethereum/testnet/keystore/ для Ropsten, ~/.ethereum/rinkeby/keystore/ — для Rinkeby. Обратите внимание, что для разных сетей создаются отдельные ключи и если вы собираетесь использовать Ropsten, как и мы, то потребуется создать еще один аккаунт. Имя состоит из даты и времени создания и адреса. Под адресом понимается шестнадцатеричная строка в 20 байтов вида 0xe03269461f7672494fb0dbbe89c00614601b5d24. В названии файла начальный 0x опущен. Адрес используется для идентификации вашего аккаунта в блокчейне, на него можно отправлять ether с других аккаунтов.

3. Как уже говорилось, требуется синхронизация локальной базы, на это для testnet Ropsten может уйти пару часов и больше, но необходимо дождаться завершения процесса. Иначе есть вероятность получить рассинхронизированную базу.

По крайней мере в нашем случае была ситуация, что при запущенном майнинге эфир начал набираться чересчур быстрыми темпами, но при этом его невозможно было использовать — все операции не были видны другим участникам сети. Проблема выяснилась следующим образом — в Mist в левом нижнем углу отображается номер последнего блока (либо сколько блоков остается до окончания синхронизации, в этом случае все нормально и нужно лишь дождаться окончания процесса). Номер последнего блока в локальной копии можно сравнить с реальным значением для данного блокчейна например на ropsten.etherscan.io можно узнать последние номера блоков для сети Ropsten. Если ваше значение намного отличается в меньшую сторону — возможно ваша база не синхронизирована. Итак, что делать если синхронизация в mist дошла до конца, но номер блока неправильный? Мы решали эту проблему удалением данных и скачиванием их заново. Данные на Линуксе для сети Ropsten лежат в папке ~/.ethereum/testnet, нам помогло удаление всего из подпапки chaindata. После чего запустили mist и уже на этот раз терпеливо дождались окончания синхронизации.

4. После окончания синхронизации можно выбрать пункт меню Develop->Start mining. Это необходимо для того, чтобы получить хоть немного эфира. Это актуально только для сети Ropsten. Если хотите использовать сеть Rinkeby — зайдите на www.rinkeby.io, вкладка Crypto Faucet, и следуйте приведенным инструкциям.

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

Простейший Smart Contract

Как только у вас на аккаунте будет какое-то количество эфира — можно начинать эксперименты со смарт контрактами. Язык, на котором пишутся контракты — Solidity, — напоминает С++ и JavaScript. Есть и другие языки, но Solidity самый популярный, активно поддерживаемый и хорошо документированный, поэтому рекомендуем использовать именно его. Рассмотрим простой контракт, единственная цель которого — хранить и обеспечивать возможность менять единственную строку.

Код контракта:

pragma solidity ^0.4.10; contract StringHolder { string savedString; function setString( string newString ) { savedString = newString; } function getString() constant returns( string ) { return savedString; } } Строка pragma solidity ^0.4.10 означает, что минимальный требуемый компилятор для данного контракта — 0.4.10, а символ ^ запрещает использование компилятора начиная с 0.5.0. Это актуально, так как Solidity развивающийся язык и несмотря на желание разработчиков сохранять совместимость — это не всегда возможно.

Имя контракта задается после ключевого слова contract. В теле контракта описываются все хранящиеся данные, в данном случае это поле savedString типа string. Манипуляции с данными осуществляются через сеттеры и геттеры. В данном случае функция setString( string newString ) присваивает в переменную контракта новое значение для строки. Функция getString() constant returns( string ) возвращает значение строки (тип возвращаемого значения задается как returns(<тип>)). Стоит особо отметить ключевое слово constant — оно гарантирует, что никакие из данных не будут изменены при выполнении функции. Если данные не меняются — то не нужно платить за газ. Поэтому геттеры выполняются моментально и бесплатно. Сеттеры требуют оплаты и выполняются не моментально (только в результате включения транзакции в очередной блок блокчейна).

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

Синим отмечаются геттеры (getString), красным — сеттеры (setString). Показано сколько расходуется газа.

Для задания строки в поле setString не забудьте поставить кавычки, иначе получите ошибку

Проверив, что get и set работают как надо можно деплоить контракт в настоящий блокчейн. Для этого переключаемся обратно в Mist, заходим в Contracts и нажимаем Deploy New Contract. Копируем код в поле Solidity Contract Source Code и справа видим выпадающий список Pick a contract. Выбираем StringHolder, единственный пункт в данном случае. Выбираем размер оплаты, от которого будет зависеть время выполнения деплоя, нажимаем Deploy, в окне отобразится примерная стоимость, вводим пароль от аккаунта и нажимаем Send Transaction. В кошельке появится новая транзакция с прогрессом “x of 12 Confirmations” (x из 12 подтверждений). Первое подтверждение будет означать, что транзакция включена майнером в блок, последующие — что создано соответствующее количество блоков после блока с нашей транзакцией. Это дает большую гарантию, что блок с нашей транзакцией не будет отменен. Но для того чтобы контракт стал активным достаточно одного подтверждения. После подтверждения заходим в Contracts → String Holder. В mist отображается интерфейс контракта: слева геттеры (Read from contract), справа сеттеры (Write to contract) в виде выпадающего списка. Работает так же, как в Remix IDE, только задание строки — это уже настоящая транзакция, которая так же, как создание контракта, будет требовать подтверждения паролем и будет ожидать 12 подтверждений от майнеров.

Как другим пользователям увидеть этот контракт? Контракт определяется двумя составляющими: адрес и интерфейс ABI. Все это можно узнать на странице контракта в Mist, по кнопкам “Copy address” и “Show Interface”. Адрес — это такое же 20-байтное шестнадцатеричное число, например в нашем случае это 0x65cA73D13a2cc1dB6B92fd04eb4EBE4cEB70c5eC. А интерфейс — JSON-текст, для нашего смарт контракта он выглядит следующим образом:

[ { "constant": false, "inputs": [ { "name": "newString", "type": "string" } ], "name": "setString", "outputs": [], "payable": false, "type": "function" }, { "constant": true, "inputs": [], "name": "getString", "outputs": [ { "name": "", "type": "string", "value": "Hello World!" } ], "payable": false, "type": "function" } ] Интерфейс генерируется автоматически из кода контракта и не должен меняться после деплоя, адрес контракта возвращается после деплоя и указывает на бинарный код контракта. Mist сохраняет эти данные и предоставляет интерфейс для их получения только если деплой выполнялся через него. Кстати список выполненных/выполняемых транзакций Mist тоже хранит локально и только если они совершались через его интерфейс.

Клиент, желающий использовать контракт, должен получить эти данные, и в случае с Mist выбрать Contracts->Watch Contract. Название можно выбирать любое, оно нужно лишь для удобства. Нажали ОК — контракт появился в списке, можно заходить в него и изменять строку уже с другого клиента. При этом после выполнения транзакции (получения хотя бы одного подтверждения) строка изменится у всех клиентов.

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

В следующей статье мы подробнее рассмотрим как это работает.

habr.com

Блокчейн Эфириум транзакции – где осмотреть и как расшифровать?

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

Как отследить, проверить и посмотреть транзакции блокчейн Эфириум? О каждом переводе вы можете в любой момент проверить данные с помощью специальных сайтов.

Не важно, входящая это операция или исходящая, если есть её номер, то без труда можно посмотреть подробную информацию о переводе.

транзакции блокчейн Эфириум

Что такое транзакция в блокчейне Эфириум?

Перевод Эфиров – это отправка подписанного пакета данных. В нём хранится сообщение, которое передается от одного адреса (кошелька) другому.

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

На нашем блоге есть подробная статья о криптовалюте Ethereum. Узнайте о ней больше – майнинг, курс, кошелек и многое другое.

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

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

Где посмотреть блокчейн Эфириума?

Есть масса сервисов, через которые можно просматривать базу транзакций Ethereum. Называют их Blockchain Explorers, а среди самых популярных выделяются:

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

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

Зачем нужна вся эта информация? Причины могут быть разными, начиная с проверки комиссии или перепроверки адреса получателя, заканчивая вопросами к профессионалам. Чтобы помочь вам, им обязательно потребуется эта информация.

Как расшифровать транзакцию с Эфирами?

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

  1. TxHash – номер транзакции, именно по нему отслеживаются переводы в блокчейне.
  2. TxReceiptStatus – указывает на выполнение транзакции (в нашем случае выполнена).
  3. BlockHeight – номер блока, куда была включена транзакция.
  4. TimeStamp – время добычи блока под транзакцию.
  5. From – откуда переводятся Эфиры.
  6. To – куда переводятся Эфиры.
  7. Value – количество монет в переводе (в скобках сумма в долларах).
  8. GasLimit – максимальный объем комиссии за транзакцию.
  9. GasUsedByTxn – сколько было взято комиссии для проведения операции.
  10. GasPrice – стоимостьgasвEthereumи gwei (1 млрд. gwei = 1 ETH).
  11. ActualTxCost/Fee – актуальная комиссия для проведения транзакции.
  12. CumulativeGasUsed – общееколичествоgas, используемого для открытия блока.
  13. Nonce – порядковый номер операции, выполняемой с кошелька.
  14. InputData – дополнительное сообщение (заполняется не обязательно).
  15. PrivateNote – скрытая информация (доступна только после авторизации).

Теперь вы точно разберетесь со всеми данными по транзакциям и сможете перепроверять информацию. Обратите внимание, выбранная нами операция проводилась больше месяца. А всё потому что было выбрано минимальное количество gas для уплаты комиссии.

Что такое газ в Эфириуме?

В отличие от других криптовалют, при переводе Эфиров комиссия взимается в отдельной валюте Gas. Покупать её не нужно, она автоматически конвертируется из ETH.

Комиссии в блокчейне минимальные, поэтому была введена отдельная единица. Измеряется она в Gwei, это самая маленькая доля Ethereum.

1 ETH = 1000 Finney = 1 миллион Szabo = 1 миллиард Gwei = 1 квинтиллионWei.

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

К примеру, выставляется лимит Gas50 000, а его стоимость 20 Gwei. Таким образом, комиссия составит 0.001 ETH:

Указывая значение «Лимит», выбирается максимальный объем Gas. При выполнении транзакции его может использоваться меньше. В этом случае, «остатки» зачисляются обратно на кошелек в Эфирах.

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

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

Вам также будет интересно:- Обзор биржи криптовалют Bitflip- Биржа Livecoin – торговля криптовалютой на русском языке- Как вывести Биткоин на карту или кошелек (QIWI, Webmoney, Яндекс)

workion.ru


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