![]() |
Инструкция: Смарт-Контракты в Эфириум
Инструкция: Смарт-Контракты в Эфириум
Первые шаги в создании Смарт-Контрактов на базе Эфириума 0. Базовые принципы Данное руководство подразумевает, что у вас имеется базовый уровень знаний о технических аспектах работы криптовалют и в частности блокчейнов. Если у вас их нет, я рекомендую прочесть книгу «Mastering Bitcoin» Андреаса Антонопоулоса, работу Consensys «Достаточно Биткойна. Время Эфириума» («Just Enough Bitcoin for Ethereum»), или, хотя бы, посмотрите это короткое видео со Скоттом Дрисколлом. Чтобы продолжать, вам нужно знать, что такое секретный и публичный ключ, почему блокчейну нужны майнеры, как достигается децентрализованный консенсус, что такое транзакция, и какую роль играют скрипты в транзакциях, и конечно же разобраться с концепцией смарт-контрактов. Две другие важные и относящиеся к теме идеи, которые вам нужно понимать перед началом работы с Эфириумом, это Ethereum Virtual Machine (виртуальная машина Эфириума) и топливо. Эфириум был разработан как платформа смарт-контрактов. Его корни тесно вплетены в критику, Виталика Бутерина в сторону Биткойна, согласно которой возможности этой платформы для смарт-контрактов весьма ограничены. Виртуальная Машина Эфириума (EVM) — среда, в которой работают смарт-контракты на базе Эфириума. Для написания скриптов, он предоставляет более выразительный и полный язык, в отличии от Биткойна. По-факту, это Тьюринг-полный программный язык. Хорошая метафора – EVM это распределенный глобальный компьютер, в котором выполняются все смарт-контракты. Учитывая, что смарт-контракты работают в EVM, должен быть механизм ограничения ресурсов для каждого контракта. Каждая отдельная операция, выполняемая внутри EVM, на самом деле выполняется одновременно каждым узлом в сети. Вот почему существует топливо. Код контракта транзакции Эфириума может провоцировать запись и чтение данных, делать дорогие вычисления вроде использования принципов криптографии, делать звонки (отправлять сообщения) другим контрактам, и так далее. Каждая из этих операций имеет стоимость, измеряемую топливом, и каждая потребленная транзакцией единица топлива должна быть оплачена Эфиром, согласно цены на топливо/Эфир, которая изменяется динамически. Эта стоимость отнимается из аккаунта Эфириума, который выполняет транзакцию. Также, транзакции имеют лимит по топливу, этот параметр является верхней планкой того, сколько топлива может израсходовать транзакция, и используется в качестве предохранителя против программных ошибок, которые могут опустошить кошелек пользователя. Вы можете почитать подробнее про топливо здесь. 1. Настройка окружения Так, вы знакомы с основами, теперь давайте перейдем к коду! Чтобы начать создавать Аpps для Эфириума (а точнее — Dapps, т. е. Децентрализованные приложения, как многие любят их называть), вам будет нужен клиент для соединения с сетью. Он будет вашим окном в децентрализованную сеть, и покажет содержимое блокчейна, где отображается полностью состояние EVM. Есть несколько совместимых клиентов для протокола, самый популярный — Geth, приложение, написанное на Go. Так или иначе, он не самый дружественный к разработчику. Самая лучшая опция, найденная мной, это testrpc узел (да, название отстой). Поверьте, он сэкономит вам много времени. Установите его и запустите: Код:
$ sudo npm install -g ethereumjs-testrpc Самый популярный язык программирования смарт-контрактов Эфириума — Solidity, мы будем использовать его. Также мы используем среду разработки Truffle, которая помогает в создании смарт-контрактов, компиляции, запуске и тестировании. Давайте начнем: Код:
# Для начала, запустим Truffle Код:
$ truffle compile 2. Создаем ваш первый контракт в Эфириуме В этом руководстве мы будем писать простой смарт-контракт Proof of Existence. Идея состоит в создании цифрового нотариуса, который сохраняет хэши документов как доказательство того, что они существовали на определенный момент времени. Используйте ‘truffle create:contract’ чтобы начать: Код:
$ truffle create:contract Код:
// Proof of Existence
Эта простая версия хранит только одно доказательство за раз, используя тип данных bytes32, или 32 bytes, что является размером хэша SHA256. Транзакционная функция ‘notarize’ позволяет человеку сохранить хэш заверяемого документа в переменной, записанной в состоянии контракта. Эта переменная — ‘proof’. Итак, эта переменная — публичная, и является единственным способом для пользователя данного контракта нотариально заверить документ. Мы скоро сами начнем это делать, но сначала… Давайте отправим в сеть ProofOfExistence1! На этот раз, вам придется редактировать файл миграции (migrations/2_deploy_contracts.js) чтобы заставить Truffle отправить наш новый контракт. Замените содержимое файла следующим кодом: Код:
/* Код:
truffle migrate --reset 3. Взаимодействие с вашим смарт-контрактом Теперь, когда наш контракт отправлен, давайте с ним поиграем! Мы можем посылать в него сообщения, используя функциональные звонки, а также читать его публичное состояние. Для этой цели, мы будем использовать консоль Truffle: Код:
$ truffle console Первое, что мы делаем, получаем представление про наш отправленный в сеть контракт и сохраняем его в переменной под названием ‘poe‘. Затем, мы вызываем транзакционную функцию ‘notarize’, которая включает изменение в состоянии контракта. Когда мы вызываем транзакционную функцию, мы получаем Обещание, привязанное к ID транзакции, а не к тому, что возвращает сама функция. Помните, что для изменения состояния EVM нам нужно тратить топливо и отправлять транзакцию в сеть. Вот почему мы получаем ID транзакции в качестве результата Обещания; о транзакции, которая и привела к этому изменению состояния. В нашем случае, мы не заинтересованы в ID транзакции, так что мы просто удаляем Обещание. В случае написания реального контракта, мы бы захотели сохранить это, дабы проверить итоговую транзакцию и выловить ошибки. Далее, мы вызываем read-only (constant) функцию, ‘calculateProof’. Не забывайте отмечать ваши read-only функции ключевым словом ‘constant’, иначе Truffle попробует создать транзакцию, чтобы выполнить функцию. Здесь заключен способ сообщить Truffle, что мы не взаимодействуем с блокчейном, а просто читаем из него. Используя эту read-only функцию, мы заполучим SHA256 хэшсумму вашего «Офигенная идея» документа. Теперь нужно сравнить это с состоянием смарт-контракта Эфириума. Чтобы проверить, что состояние изменилось правильно, нам необходимо прочитать ‘proof’ переменную публичного состояния. Чтобы получить значение переменной публичного состояния, мы можем вызвать функцию с таким же именем, которая возвращает Обещание. В нашем случае, выводимый хэш — точно такой же, так что не стоит о чем-то волноваться. За подробной информацией о том, как взаимодействовать со смарт контрактами, обратитесь к этой секции документации Truffle. Как вы можете видеть из нескольких абзацев выше, наше первое видение Proof of Existenсe смарт-контракта действительно работает! Отличная работа! Однако, это удобно только для регистрации одного файла за раз. Давайте создадим улучшенную версию. 4. Повторение кода контракта Давайте так изменим код контракта, чтобы он стал поддерживать запись нескольких файлов одновременно. Скопируйте оригинальны файл с именем contracts/ProofOfExistence2.sol и примените данные изменения. Главные изменения состоят вот в чем: мы изменяем переменную proof в диапазон bytes32, называя ееproofs, мы делаем ее приватной, и мы добавляем функцию проверки, был ли документ уже заверен путем итерации в этом диапазоне. Код:
// Proof of Existence Код:
// выложить контракты Код:
proofs[proof] = true; 5. Размещение контракта в реальной тестовой сети Как только вы протестировали ваш контракт, используя исключительно testrpc в симуляционной сети, вы готовы опробовать его уже и в реальной! Чтобы это сделать, нам нужен реальный testnet/livenet Ethereum клиент. Воспользуйтесь этими инструкциями по установке Geth. Во время разработки, вам нужно запускать узлы в testnet, так чтобы вы могли все протестировать, не рискуя при этом деньгами. Узел Testnet, также известный как Morden в Эфириуме, в основном идентичен реальному Эфириуму, однако токен Ether, который там содержится, не имеет ценности. Не ленитесь, всегда помните, что нужно разрабатывать только в testnet, вы пожалеете, если потеряете настоящий Эфир из-за программной ошибки. Запустите Geth в Testnet, с включенным RPC сервером: Код:
geth --testnet --rpc console Код:
> personal.newAccount() Код:
>eth.getBalance(eth.accounts[0]) Как только узел синхронизирован, вы будете готовы отправлять контракты используя Truffle. Сначала, разблокируйте свой главный geth аккаунт, чтобы Truffle мог его использовать. Также проверьте, что там имеются кое-какие средства, или вам не удастся запустить новый контракт в сеть. Код:
personal.unlockAccount(eth.accounts[0], "mypassword", Код:
$ truffle migrate --reset Отправленная в Testnet версия ProofOfEistence3 может быть найдена по адресу: https://testnet.etherscan.io/address...3325dac3e79e05 Я опущу детали относительно того, как размещать контракт на реальной сети. Вы должны делать это только после того, как в деталях проверили свои контракты в симуляционных и Test сетях. Помните, что любая программная ошибка может привести к потере реальных Эфиров! Ну вот и все! Я надеюсь, вы насладились чтением этого руководства и вашим первым шагам в программировании смарт-контрактов на Эфириуме! Это все еще очень новая индустрия, и сейчас полно пространства для новых приложений и инструментов. Можете писать мне о ваших идеях и представлять прототипы. |
Текущее время: 00:00. Часовой пояс GMT +2. |
Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2025, vBulletin Solutions, Inc. Перевод: vica.pro