Понимание основ смарт контрактов
В рамках разработки смарт контракт состоит из трех разделов: баланс, хранения и коды. Баланс представляет, сколько Ethereum имеет умный контракт. Хранилище содержит данные, такие как строки и массивы, которые являются специфическими для каждого приложения. Раздел кода содержит необработанный машинный код, который скомпилирован из того, что мы пишем в Solidity.
В отличие от учетных записей пользователей, учетные записи смарт-контракта не являются внешними по отношению к соответствующим сетям. Другими словами, вы можете использовать свой кошелек в различных сетях, таких как Kovan и Ropsten, но вы не можете сделать это с помощью умного контракта. Умные контракты являются внутренними.
Каждый смарт-контракт имеет источник, который хранится на устройстве автора и экземпляры, которые хранятся в блокчейне. Чтобы создать экземпляр (учетную запись) умного контракта, нам нужно развернуть его в сети. Он очень напоминает отношения между классами и экземплярами в традиционном объектно-ориентированном программировании (ООП) и представляющих его языках (JS, Ruby). Чтобы дать вам более наглядное представление, давайте создадим класс Bike и добавим его экземпляр.
Bike class & instance
Мы напишем определение контракта, которое затем будет запускаться через компилятор, который создаст два файла: байт-код и двоичный интерфейс приложения (ABI). Байт-код — это то, что будет фактически передано в EVM, а ABI — это слой между байт-кодом и обычным кодом JavaScript, который позволяет создавать пользовательский интерфейс (UI).
Uniswap
Uniswap – DeFi-протокол, созданный для обмена ERC-20 токенов и обеспечения ликвидности (yield farming
) и основанный на платформе Ethereum. Платформа функционирует как
автоматический маркет-мейкер
(
AMM
), обладающим функциями децентрализованной биржи (
DEX
).
В отличие от централизованных криптобирж, Uniswap не зависит от посредника, а ликвидность децентрализованной платформе предоставляют поставщики ликвидности (liquidity providers
). Это позволяет пользователям одновременно безопасно обменивать цифровые токены на бирже и получать доход от майнинга ликвидности, добавляя токены в пулы.
Основная проблема Uniswap в том, что платформа зависит от экосистемы Ethereum. Это значит, что она будет сталкиваться с теми же проблемами, что и основной блокчейн. И чем больше будет спрос на платформу, тем сильнее будут проявляться проблемы с масштабированием, что заставит пользователей искать альтернативные платформы. Так произошло с Binance Smart Chain: из-за высоких комиссий многие пользователи перешли на сеть BSC, что, в свою очередь, также привело к проблемам с масштабируемостью.
Выбор IDE и версии Solidity
Прежде чем мы начнем, нам нужна надлежащая интегрированная среда разработки (IDE). Другими словами, нам нужен удобный терминал с необходимыми инструментами для написания нашего кода. Для целей данного руководства мы выберем Remix, IDE, созданную фондом Ethereum, которая позволяет писать, тестировать, отлаживать, запускать умные контракты и многое другое. Вы можете использовать его либо прямо в браузере, либо скачать его локально, если хотите.
После запуска Remix вы увидите редактор кода в центре, файловый менеджер слева и компилятор справа.
Initial Remix window
Будет какой-то заранее написанный код — он нам не понадобится. Чтобы создать первый уникальный умный контракт, давайте нажмем на значок плюса в верхнем левом углу терминала и дадим ему имя.
Creating a new project in Remix
Поскольку у нас есть пустой документ. sol, мы должны указать версию Solidity, которую будет запускать компилятор. На момент написания данного руководства последняя версия была 0.5.7. Если вы не уверены, какую версию использовать, вы можете указать диапазон версий.
2 типа указания версии Solidity
Давайте дадим нашему умному контракту имя, а затем круглые скобки.
Именование контракта
Как работают модификаторы?
Давайте начнем с базовых примеров, приведенных ниже.
modifier OnlyOwner { require(msg.sender == owner); _; }
Символ _;
Символ _; называется подстановочным знаком. Он объединяет код функции с кодом модификатора.
Другими словами, тело функции (к которой присоединен модификатор) будет вставлено туда, где в определении модификатора появляется специальный символ _;.
Используя термины документации Solidity, этот символ «возвращает поток выполнения к исходному коду функции».
Модификатор должен содержать символ _; в своем теле. Это обязательно.
Куда поместить _; ?
Вместо _; будет подставлена функция, поэтому выполнение функции зависит от того места, где вы укажите этот символ: до, посредине или после основного кода модификатора.
modifier SomethingBefore { require(/* сначала проверьте что-нибудь */); _; // возобновить выполнение функции } modifier SomethingAfter { _; // запускаем сперва функцию require(/* затем проверяем что-нибудь */) }
Как показано в примере выше, вы можете поместить символ _; в начало, середину или конец тела модификатора.
На практике наиболее безопасной схемой использования является размещение _; в конце. В этом сценарии модификатор служит для последовательной проверки условий, то есть для того, чтобы сначала проверить условие, а затем продолжить выполнение функции. Приведенный ниже код демонстрирует это на примере:
function isOkay() public view returns(bool) { // выполнить проверку истинности return true; } function isAuthorised(address _user) public view returns(bool) { // логика проверки авторизации _user return true; } modifier OnlyIfOkAndAuthorised { require(isOkay()); require(isAuthorised(msg.sender)); _; }
Написание вашего первого смарт контракта
Как только у нас будет готов холст, пришло время определить основные строительные блоки — переменные. Хотя у опытных разработчиков программного обеспечения не возникнет проблем с пониманием этой концепции, мы кратко представим ее новичкам. Переменные являются заполнителями для порций информации, на которые впоследствии ссылается программа, которая их запускает.
Давайте создадим пару переменных: строку (последовательность символов) и целое число (число). В случае Ethereum переменные хранятся в блокчейне вместе с остальными частями контрактов и следовательно могут быть доступны и обновлены из любого места. Другой ключевой характеристикой переменных Solidity является то, что вы можете сделать их приватными, написав «private» рядом с переменными. Наконец, для целых чисел Solidity имеет два типа: подписанный (может быть положительным и отрицательным) и беззнаковый (может быть только положительным). Чтобы указать неподписанную переменную, мы должны просто поставить ‘u’ перед ней.
A private string and an integer
Когда у нас есть переменная name, нам нужно написать методы установки и получения. Это похоже на функцию JS. Помните, что Solidity имеет статическую типизацию, поэтому мы должны определить типы переменных. Теперь любое значение, которое мы помещаем в ‘setName’, будет определять строку ‘name’. Для получения мы будем использовать getName и указать, какую переменную мы ожидаем увидеть. Теперь пришло время сделать то же самое для переменной age. Метод построен аналогично getName.
Name/age setters and getters
Давайте проверим наш маленький кусок кода. Перейдите на вкладку «Выполнить» (Run) компилятора и нажмите «Развернуть» (Deploy) под именем вашего контракта. В самом низу компилятора вы увидите раздел «Развернутые контракты» (Deployed Contracts), в котором доступны наши методы. Чтобы передать имя в значение «newName», нам нужно убедиться, что наша строка записана в JSON, в противном случае «getName» ничего не вернет. Для «setAge» просто укажите свой возраст без кавычек. Как вы видите, теперь мы можем устанавливать и получать переменные name и age через наш умный контракт.
Компилятор, с именем и возрастом
Тело контракта
Описание контракта начинается со слов contract и имени контракта. По правилам хорошего тона, следом идет блок объявление переменных контракта, описывающие его состояние, а вообще их можно разместить где угодно в теле контракта. У нас это лишь переменная возраста uint age; с типом беззнакового целого числа.
Здесь uint это синоним для uint256 (как вы поняли 256 это разрядность числа). Согласно документации в Solidity целых типов достаточно много, от 8 до 256 разрядов с шагом в 8, да еще и знаковые int8 и беззнаковые uint8.
Что такое Wei и Gas
Одна из самых замечательных особенностей смарт контрактов заключается в том, что для развертывания их в сети Ethereum вам потребуется инициировать транзакцию, которая стоит определенную сумму денег, которая выплачивается в Ether. Крайне важно понимать, как используются сборы в системе, так как они будут вычитаться при каждом взаимодействии с EVM.
Что такое Wei?
Давайте предположим, что читая наш урок, вы хотя бы раз использовали Биткоин. Вы, вероятно, сделали небольшую транзакцию, стоимость которой была меньше 1 BTC. В этом случае вы использовали сатоши, что-то вроде центов за доллар. Wei похож на сатоши — это самая маленькая часть 1 эфира. Если мы думаем об этом с точки зрения программирования, это самое низкое целое число без знака в сети. Взаимодействуя с сетью, вы чаще всего сталкиваетесь с Gwei, который относится к Gigawei и равен 1 млрд. Wei.
Что такое Gas?
Gas является неотъемлемой частью механизма умного исполнения контракта. Он имеет два значения для каждой транзакции: потребляемый газ и его цена. Стоит отметить, что пользователь инициирующий транзакцию, определяет сам эти значения. Однако, если установленного значения Gas недостаточно для выполнения определенной операции, то Gas будет потреблен, но транзакция не будет выполнена. Более того, если цена на газ будет установлена слишком низкой для сети в данный момент времени, транзакция не будет обрабатываться узлами, что в конечном итоге сделает ее неудачной. Существует несколько сервисов для проверки оптимальных значений для ваших транзакций, одна из которых — ethgasstation.info. Чтобы лучше понять Gas и то, почему он стоит каких-то денег, давайте начнем кодирование некоторых из них сами.
Вернитесь в окно Remix и создайте новый файл. В нашем примере мы назовем его «Gas» и создадим контракт с таким же именем. Имейте в виду, что чем больше данных нам потребуется хранить на блокчейне, тем больше газа нам понадобится. При этом для целей данного урока мы создадим дешевый контракт; Чем больше вы добавите к нему, тем выше будет плата.
Есть функция, которая возвращает целое число, которое является суммой двух входных данных. Чтобы сделать его как можно более легкой, мы укажем, что наш контракт ничего не будет хранить в блокчейне и для этого мы добавим «pure» рядом с функцией.
Дешевый контракт
Теперь вы можете развернуть его в компиляторе и ввести любые два числа, чтобы получить целое число «c». Чтобы проверить цену нашей транзакции, мы должны взглянуть на терминал, расположенный под разделом кода. Существует стоимость транзакции и стоимость исполнения. Первый относится к тому, сколько данных имеет транзакция. Второй относится к тому, сколько энергии EVM потребовалось для транзакции.
Дешевый контракт
Это очень простая транзакция, которая почти ничего не стоит для сети. При написании значимых умных контрактов вы добавите больше деталей, что увеличит их вес и следовательно комиссионные за транзакции.
Настройка web3.js
Откройте файл с именем web3.js в папке контрактов , затем вставьте его как следующий код:
// web3.js import Web3 from ‘web3’; if (window.ethereum) { window.web3 = new Web3(ethereum); try { // Request account access if needed ethereum.enable(); } catch (error) { // User denied account access… } } else if (window.web3) { // Legacy dapp browsers… window.web3 = new Web3(web3.currentProvider); } else { // Non-dapp browsers… console.log(‘Non-Ethereum browser detected. You should consider trying MetaMask!’); } console.log(web3); export default web3;
По сути, это получает web3экземпляр, который инициализирует расширение Metamask, поэтому мы можем использовать его и в нашем приложении. Нам нужно вызвать это позже при получении экземпляра нашего смарт-контракта.
Вы можете встретить всплывающее окно MetaMask в вашем браузере, которое запрашивает разрешение на доступ. Вам нужно просто нажать кнопку «Подключиться» прямо здесь:
Создание и развертывание собственного токена ERC20. Выпуск токенов и создание ICO.
Посмотрим правде в глаза, большинство разработчиков блокчейнов, которые только начинают стремятся играть по-крупному и создавать свои собственные блокчейны и токены. Хотя это чрезвычайно сложная тема, которая привлекла некоторых из лучших разработчиков программного обеспечения из других областей, создание базового токена ERC20 — не является сложной задачей.
Сначала нам нужно создать еще один файл в Remix и загрузить интерфейс ERC20, а именно:
Как использовать Солидность
/// Определить умный контакт contract Business1{ uint256 публичный депозит; // Определяем количество выплаченных депозитов. адрес общественного плательщика; // определить, кто платит депозит // deposite реализует код для оплаты депозита, потому что эту функцию нужно вызывать, она определяется как общедоступная, а подлежащая оплате функция приема платежей function payDeposite() public payable{ deposite=mag.value; payer=mag.sender; } } miner.start () начинает майнинг miner.start (1) или начать майнинг miner.stop () прекратить майнинг miner.setEtherbase (addr) Установить основной аккаунт personal.unlockAccount (eth.accounts [0]) разблокировать аккаунт personal.newAccount () Создать аккаунт eth.accounts запрашивает все учетные записи главный счет eth.coinbase транзакция eth.sendTransaction ({от: eth.accounts [0], до: eth.accounts [1], значение: сумма}) eth.getBalance (addr) запрос баланса аккаунта eth.blockNumber Просмотр общего количества блоков eth.getTransaction («actionAddr «) Просмотреть транзакцию eth.getBlock (blockNumber) Просмотр блока по номеру блока web3.fromWei (eth.getBalance (eth.accounts [0]), ‘ether’) Конвертировать из wei в ether web3.toWei (1) Конвертировать эфир в Вэй самостоятельно уничтожить (получателя) уничтожить договор и передать остаток получателю Статьи по Теме
Солидность развивает детальную стратегию ETH Solidity: https://solidity.readthedocs.io/en/v0.4.21/ Truffle: https://truffleframework.com/docs/ Security: https://github.com/OpenZeppelin/zeppelin- solidity:https://solidity.readthedocs.io/en/v0.4.21/security-considerations.html
ETH ETH: https://github.comiethereum/go-ethereum; https://github.com/ethereum/go-ethereum/wiki
Стандарт ERC20
Функция totalSupply позволяет нам увидеть, сколько у нас всего токенов. Функция balanceOf используется для получения количества токенов по определенным адресам. Функция transfer позволяет пользователям выполнять транзакции между собой. Функции «TransferFrom», «allowance» и «Approve» позволяют пользователям разрешать другим пользователям инициировать транзакции от их имени. События являются инструментами регистрации для главной книги.
В дополнение к самому интерфейсу нам понадобится отдельный файл. sol для нашего нового токена. Здесь мы импортируем интерфейс ERC20 и указываем символ, имя и десятичные числа нашего токена.
uToday token
Прежде чем мы скомпилируем его, нам нужно указать ограничения.
- Давайте начнем с общего предложения — это постоянная целочисленная переменная, которую мы сделаем приватной. Общий запас наших токенов составит 1 миллион, мы также напишем функцию для возврата этого значения.
- Во-вторых, нам нужно где-то хранить наш токен. Для этого нам нужно будет указать сопоставление, которое будет возвращать баланс для любого указанного адреса.
- В-третьих, должна быть функция для передачи токенов, которая по существу будет иметь адрес получателя и количество переданных токенов. Эта функция также должна быть в состоянии проверить, достаточно ли у отправителя количества токенов на его балансе, что можно реализовать с помощью простого оператора if / then. Кроме того, мы установим условия для ‘_value’ таким образом, чтобы пользователи не могли отправлять транзакции с «0» токенами, так как это приведет к засоренью сети разным мусором.
- В-четвертых, мы должны создать отображение для остальных функций, которое представляет собой отображение целого числа.
Затем мы укажем несколько проверок в функциях «утверждение» (approve) и «допуск» (allowance) и установим условия для ‘transferFrom’. Наконец, не все токены будут доступны на рынке. Некоторые из токенов обычно оставляются для команд, фондов, консультантов и других целей. Следовательно важно, чтобы мы ясно дали понять, сколько токенов будет циркулировать в системе. Когда мы создали токены, оборотное предложение равняется нашему балансу.
uToday token constraints
Код готов, поэтому давайте проверим его. Перейдите на вкладку «Выполнить» (Run) компилятора и разверните наш токен-контракт. Вы увидите, что у нас есть данные токена, а также общее предложение, остатки и надбавки. Поздравляю, вы создали свой первый токен. Чтобы наш токен действительно работал в сети, нам нужно развернуть умный контракт (обратите внимание, что это отличается от развертывания его для тестирования в Remix). Для этого урока мы будем использовать Remix и Metamask, но есть и другие способы сделать это. Metamask — это простая, но эффективная программа-кошелек Ethereum с приятным пользовательским интерфейсом, который интегрируется как расширение в некоторые из самых популярных браузеров. В нашем случае мы будем использовать Opera. Сначала перейдите на metamask.io и загрузите расширение. Как только это будет сделано, вы увидите значок лисы в правом верхнем углу вашего браузера.
Загрузка metamask и расположение иконки
Нажмите на значок и выполните предложенные инструкции для создания кошелька. Не забудьте сохранить секретную фразу! Когда у вас есть кошелек, нажмите на иконку Metamask и измените сеть на «Ropsten», потому что мы не хотим связываться с основной сетью Ethereum.
Изменение metamask на Ropsten
Последним шагом является создание некоторого Ether (к сожалению, вы не сможете использовать его для каких-либо реальных покупок, но они необходимы для тестирования). Зайдите на faucet.metamask.io и запросите 1 эфир. Теперь у вас все готово. Вернитесь в окно Remix и измените среду на «Injected Web3» в компиляторе. Взгляните также на вкладку учетной записи — ваш адрес должен совпадать с адресом, который вы создали в Metamask. Выберите смарт-контракт, который вы хотите развернуть, который является вашим токен-контрактом, но не интерфейсом ERC20 и нажмите соответствующую кнопку. Появится окно metamask с транзакцией, ее деталями и опциями для взаимодействия с ней. Отправьте транзакцию и наш токен оживет.
Metamask всплывающее окно
Теперь вы можете поиграть со всеми функциями, которые мы указали ранее. Давайте посмотрим на наш контракт с другой стороны, чтобы убедиться, что он работает правильно. Как и любой другой блокчейн, в Ethereum есть несколько block explorers, которые служат основной целью мониторинга того, что происходит в сети. В нашем случае мы будем использовать etherscan , хотя есть несколько других замечательных альтернатив. Обратите внимание, что если вы просто зайдете в etherscan, вы увидите Основную сеть. Поскольку нам нужно увидеть сеть Ropsten, вам нужно будет поставить «ropsten» перед адресом сайта. Найдите свой адрес и вы увидите две транзакции — одна для бесплатного эфира, который вы получили, а другая для развертывания контракта.
Адрес пользователя в Etherscan
Чтобы найти адрес вашего контракта, нажмите на TxHash и перейдите в поле «To». Здесь вы можете проверить транзакции, код и события вашего смарт-контракта. На данный момент нам нужно проверить и опубликовать наш контракт. Перейдите в раздел «Code» и нажмите ссылку «Проверить и опубликовать» ‘Verify and Publish’ . Здесь вам нужно будет снова указать имя вашего токена, версию компилятора (в нашем случае последняя использованная нами версия Solidity была 0.5.7, поэтому мы будем придерживаться соответствующей версии компилятора). Теперь вам нужно скопировать код смарт-контракта токена вместе с кодом интерфейса ERC20 из окна Remix в etherscan и нажать «Подтвердить и опубликовать» ‘Verify and Publish’ в нижней части экрана.
Проверка смарт контракта
Пришло время вернуться к адресу вашего контракта. Код на вкладке «Code» теперь будет подвержен проверке. Кроме того, теперь у вас появятся еще две вкладки: «Читать договор» и «Написать договор» ‘Read contract’ & ‘Write contract’. В разделе чтения мы можем проверить функциональность нашего токена. Введите свой адрес (не адрес контракта) в поле ‘balanceOf’, чтобы увидеть, сколько у вас токенов; должно показать 1 миллион, который мы жестко закодировали как общий запас и передали его в наш кошелек. Это означает, что наш токен теперь корректно работает в тестовой сети.
Получение баланса
Книга «Создание смарт-контрактов Solidity для блокчейна Ethereum. Практическое руководство»
Цель урока:
познакомиться с принципами работы блокчейна Ethereum, областями его применения и основной терминологией.
Практические задания:
в этом уроке не предусмотрены. Едва ли сегодня есть разработчик программного обеспечения (ПО), который бы ничего не слышал о технологии блокчейн (Blockchain), криптовалютах (Cryptocurrency или Crypto Currency), биткоинах (Bitcoin), первичном размещение монет (ICO, Initial coin offering), смарт-контрактах (Smart Contract), а также других понятиях и терминах, имеющих отношение к блокчейну.
Технология блокчейна открывает новые рынки и создает рабочие места для программистов. Если вы постигнете все тонкости криптовалютных технологий и технологий смарт-контрактов, то у вас не должно быть проблем с применением этих знаний на практике.
Надо сказать, что вокруг криптовалют и блокчейнов возникает много спекуляций. Мы оставим в стороне рассуждения об изменениях курсов криптовалют, о создании пирамид, о тонкостях криптовалютного законодательства и т.п. В нашем учебном курсе мы сосредоточимся главным образом на технических аспектах применения смарт-контрактов блокчейна Ethereum (эфириум, эфир) и разработки так называемых децентрализованных приложений (Distributed Application, DApp).
Что такое блокчейн
Блокчейн (Blockchain, Block Chain) представляет собой цепочку блоков данных, связанных друг с другом определенным образом. В начале цепочки находится первый блок, который называется первичным блоком (genesis block) или блоком генезиса. За ним следует второй, потом третий и так далее.
Все эти блоки данных автоматически дублируются на многочисленных узлах сети блокчейна. Таким образом обеспечивается децентрализованное хранение данных блокчейна. Вы можете представить себе систему блокчейна как большое количество узлов (физических или виртуальных серверов), объединенных в сеть и реплицирующих все изменения в цепочке блоков данных. Это как бы гигантский мультисерверный компьютер, причем узлы такого компьютера (серверы) могут быть разбросаны по всему миру. И вы тоже можете добавить свой компьютер в сеть блокчейна.
Распределенная база данных
Блокчейн можно представить себе как распределенную базу данных, реплицируемую на все узлы сети блокчейна. В теории блокчейн будет работоспособен до тех пор, пока работает хотя бы один узел, хранящий все блоки блокчейна.
Распределенный реестр данных
Блокчейн можно представить себе как это распределенный реестр данных и операций (транзакций). Еще одно название такого реестра — гроссбух.
В распределенный реестр можно добавлять данные, но невозможно их изменять или удалять. Такая невозможность достигается, в частности, применением криптографических алгоритмов, специальных алгоритмов добавления блоков в цепочку и децентрализованным хранением данных.
При добавлении блоков и выполнении операций (транзакций) используются приватные и публичные ключи. Они ограничивают пользователей блокчейна, предоставляя им доступ только к своим блокам данных.
Транзакции
Блокчейн хранит информацию об операциях (транзакциях) в блоках. При этом старые, уже выполненные транзакции, невозможно откатить или изменить. Новые транзакции хранятся в новых, добавленных блоках.
Таким образом в блокчейне может быть записана в неизменном виде вся история транзакций. Поэтому блокчейн может быть использован, например, для надежного хранения банковских операций, сведений об авторском праве, историю изменений владельцев объектов недвижимости и т.п.
Блокчейн Ethereum содержит так называемые состояния системы. По мере выполнения транзакций состояние изменяется от начального до текущего. Транзакции записываются в блоки.
Публичные и приватные блокчейны
Тут нужно отметить, что все сказанное верно только для так называемых публичных сетей блокчейн, которые не могут контролироваться никакими отдельными физическими или юридическими лицами, государственными органами или правительствами. Так называемые приватные сети блокчейн находятся под полным контролем их создателей, и там возможно все, например, полная замена всех блоков цепочки.
Практические применения блокчейна
Для чего может пригодится блокчейн?
Если кратко, блокчейн позволяет безопасным образом проводить операции (сделки) между не доверяющими друг другу персонами или компаниями. Записанные в блокчейн данные (транзакции, персональные данные, документы, свидетельства, договоры, накладные и т.п.) невозможно подделать или заменить после записи. Поэтому на базе блокчейна можно создавать, например, доверенные распределенные реестры различного рода документов.
Конечно, вы знаете, что на базе блокчейнов создаются криптовалютные системы, призванные заменить обычные бумажные деньги. Бумажные деньги еще называют фиатными (от Fiat Money). Блокчейн обеспечивает хранение и неизменность транзакций, записанных в блоки, поэтому его и можно использовать для создания криптовалютных систем. Он содержит всю историю передачи крипто-средств между различными пользователями (аккаунтами), причем любая операция может быть отслежена.
Хотя операции внутри криптовалютных систем могут быть анонимными, вывод криптовалюты и обмен ее на фиатные деньги обычно приводит к раскрытию личности владельца криптовалютного актива.
Так называемые смарт-контракты, представляющие собой программное обеспечение, работающее в сети Ethereum, позволяют автоматизировать процесс заключения сделок и контроль их выполнения. Особенно это эффективно, если оплата по сделке проводится криптовалютой Ether (эфир).
Блокчейн Ethereum и смарт-контракты Ethereum, написанные на языке программирования Solidity, могут использоваться, например, в таких областях:
- альтернатива нотариальному заверению документов;
- хранение реестра объектов недвижимости и сведений об операциях с объектами недвижимости;
- хранение сведений об авторских правах на объекты интеллектуальной собственности (книги, изображения, музыкальные произведения и т.п.);
- создание систем независимого голосования;
- сфера финансов и банковская деятельность;
- логистика в международных масштабах, отслеживание перемещения грузов;
- хранение персональных данных как аналог системе удостоверений личности;
- безопасные сделки в коммерческой области;
- хранение результатов медицинских обследований, а также истории назначенных процедур
Проблемы с блокчейном
Но, разумеется, не все так просто, как могло бы показаться!
Есть проблемы с верификацией данных перед их добавлением в блокчейн (например, не поддельные ли они?), проблемы в безопасности системного и прикладного ПО, применяемого для работы с блокчейном, проблемы с возможностью использования методов социальной инженерии для похищения доступа к кошелькам с криптовалютой и т.п.
Опять же, если речь идет не о публичном блокчейне, узлы которого разбросаны по всему миру, а о приватном блокчейне, принадлежащем персоне или организации, то уровень доверия здесь будет не выше чем уровень доверия к этой персоне или этой организации.
Также следует учитывать, что данные, записанные в блокчейн, становятся доступны для всех. В этом смысле блокчейн (особенно публичный) не подходит для хранения конфиденциальной информации. Однако тот факт, что информацию в блокчейне невозможно изменить, может помочь предотвратить или расследовать различного рода мошеннические действия.
Децентрализованные приложения Ethereum будут удобны, если платить за их использование криптовалютой. Чем больше людей, владеющих криптовалютой или готовых ее приобрести, тем большую популярность получат приложения DApp и смарт-контракты.
Среди общих проблем блокчейна, затрудняющих его практическое применение, можно упомянуть ограниченную скорость добавления новых блоков и относительно высокую стоимость транзакций. Но технологии в этой области активно развиваются, и есть надежды, что технические проблемы со временем будут решены.
Еще одна проблема заключается в том, что смарт-контракты блокчейна Ethereum работают в изолированной среде виртуальных машин, и не имеют доступа к данным реального мира. В частности, программа смарт-контракта не может сама прочитать данные с сайтов или каких-либо физических устройств (датчики, контакты и т.п.), а также не может вывести данные на какие-либо внешние устройства. Эту проблему и способы ее решения мы будем обсуждать на уроке, посвященным так называемым Оракулам — информационным посредникам смарт-контрактов.
Также есть ограничения в области законодательства. В некоторых странах, например, запрещается использовать криптовалюту как платежное средство, но можно владеть ей как неким цифровым активом, наподобие ценных бумаг. Такие активы можно покупать и продавать на бирже. В любом случае, при создании проекта, работающего с криптовалютами, необходимо ознакомиться с законодательством той страны, под юрисдикцию которой попадает ваш проект.
Как формируется цепочка блокчейна
Как мы уже говорили, блокчейн представляет собой простую цепочку блоков данных. Сначала формируется первый блок этой цепочки, потом к нему добавляется второй и так далее. Предполагается, что данные транзакций хранятся в блоках, и добавляются в самый последний блок.
На рис. 1.1 мы показали простейший вариант последовательности блоков, где первый блок ссылается на следующий.
Рис. 1.1. Простая последовательность блоков
В таком варианте, однако, можно очень легко подделать содержимое любого блока цепочки, так как блоки не содержат никакой информации для защиты от изменений. Учитывая, что блокчейн предназначен для использований людей и компаний, между которыми нет доверия, можно сделать вывод, что такой способ хранения данных для блокчейна не подходит.
Давайте займемся защитой блоков от подделки. На первом этапе мы попробуем защитить каждый блок контрольной суммой (рис. 1.2).
Рис. 1.2. Добавляем защиту данных блоков контрольной суммой
Теперь злоумышленник не может просто так изменить блок, так как в нем находится контрольная сумма данных блока. Проверка контрольной суммы покажет, что данные были изменены.
Для вычисления контрольной суммы можно использовать одну из функций хеширования, такую как MD-5, SHA-1, SHA-256 и т.п. Хеш-функции вычисляют некоторое значение (например, в виде текстовой строки постоянной длины) в результате выполнения необратимых операций над блоком данных. Операции зависят от вида хеш-функции.
Даже при небольшом изменении содержимого блока данных значение хеш-функции также изменится. Анализируя значение хеш-функции, невозможно восстановить блок данных, для которого она была вычислена.
Будет ли достаточна такая защита? К сожалению, нет.
В этой схеме контрольная сумма (хеш-функция) защищает только отдельные блоки, но не всю цепочку блоков. Зная алгоритм вычисления хеш-функции, злоумышленник может легко подменить содержимое блока. Также ничто не помешает ему удалить блоки из цепочки или добавить новые.
Чтобы защитить всю цепочку в целом, можно хранить в каждом блоке вместе с данными еще и хеш данных предыдущего блока (рис. 1.3).
Рис. 1.3. Добавляем в блок данных хеш предыдущего блока
В этой схеме чтобы изменить какой-нибудь блок, нужно пересчитать хеш-функции всех последующих блоков. Казалось бы, в чем проблема?
В реальных блокчейнах дополнительно созданы искусственные трудности для добавления новых блоков —используются алгоритмы, требующие много вычислительных ресурсов. С учетом того, что для внесения изменений в блок пересчитать нужно не один этот блок, а все последующие, сделать это будет крайне сложно.
Вспомним также, что данные блокчейна хранятся (дублируются) на многочисленных узлах сети, т.е. используется децентрализованное хранение. А это многократно усложняет подделку блока, т.к. изменения требуется внести на все узлы сети.
Так как блоки хранят информацию о предыдущем блоке, то можно проверить содержимое всех блоков цепочки.
Блокчейн Ethereum
Блокчейн Ethereum представляет собой платформу, на базе которой можно создавать распределенные приложения DApp. В отличие от других платформ, Ethereum позволяет использовать так называемые умные контракты (смарт-контракты, smart contracts), написанные на языке программирования Solidity.
Эта платформа была создана в 2013 году Виталиком Бутериным, основателем журнала Bitcoin Magazine, и запущена в 2015 году. Все, что мы будем изучать или делать в нашем учебном курсе, имеет отношение именно к блокчейну Ethereum и смарт-контрактам Solidity.
Майнинг или как создаются блоки
Майнинг (mining) представляет собой довольно сложный и ресурсоемкий процесс добавления новых блоков в цепочку блокчейна, а вовсе не «добычу криптовалют». Майнинг обеспечивает работоспособность блокчейна, т.к. именно этот процесс отвечает за добавление транзакций в блокчейн Ethereum.
Люди и организации, занимающиеся добавлением блоков, называются майнерами (miner). Программное обеспечение (ПО), работающее на узлах майнеров, пытается подобрать для последнего блока параметр хеширования с названием Nonce, чтобы получилось определенное значение хеш-функции, заданной сетью. Алгоритм хеширования Ethash, применяемый в Ethereum, позволяет получить значение Nonce только путем последовательного перебора.
Если узел майнера нашел правильное значение Nonce, то это является так называемым доказательством работы (PoW, Proof-of-work). В этом случае, если блок будет добавлен в сеть Ethereum, майнер получает определенное вознаграждение в валюте сети — Ether. На момент подготовки нашей книги вознаграждение составляет 5 Ether, однако со временем оно будет снижено.
Таким образом, майнеры Ethereum обеспечивают работу сети, добавляя блоки, и получают за это криптовалютные деньги. В интернете вы найдете массу информации о майнерах и майнинге, а мы сосредоточимся на создании контрактов Solidity и децентрализованных приложений DApp в сети Ethereum.
Итоги урока
На первом уроке вы познакомились с блокчейном и узнали, что он представляет собой особым образом составленную последовательностью блоков. Содержимое ранее записанных блоков невозможно изменить, так как для этого придется пересчитать все последующие блоки на многих узлах сети, на что нужно очень много ресурсов и времени.
Блокчейн может применяться для сохранения результатов выполнения транзакций. Его главное назначение — организация безопасного выполнения транзакций между сторонами (персонами и организациями), между которыми нет доверия. Вы узнали, в каких конкретно областях бизнеса и в каких сферах можно использовать блокчейн Ethereum и смарт-контракты Solidity. Это банковская сфера, регистрация прав собственности, документов и т.п.
Вы также узнали, что при использовании блокчейна могут возникать различные проблемы. Это проблемы верификации информации, добавляемой в блокчейн, скорость работы блокчейна, стоимость транзакций, проблема обмена данными между смарт-контрактами и реальным миром, а также потенциально возможные атаки злоумышленников, направленные на похищение криптовалютных средств с аккаунтов пользователей.
Также мы кратко рассказали о майнинге как о процессе добавления новых блоков в блокчейн. Майнинг необходим для выполнения транзакций. Те, кто занимается майнингом, обеспечивают работоспособность блокчейна и получают за это вознаграждение в криптовалюте.
Послесловие
Если вы хотите начать карьеру в криптоиндустрии в кчестве разработчика, вы должны понимать что, несмотря на свою относительную простоту в основе, блокчейн обладает невероятной гибкостью и функциональностью. С 2022 года блокчейны значительно эволюционировали и их варианты использования выходили за рамки просто финансовых транзакций. С появлением Ethereum появился целый новый уровень сетей, на котором размещены различные приложения dApps и решения на основе блокчейна. Инструментом этой эволюции был смарт контракт и если вы хотите расширить свой опыт, сделать его более ценным и ориентированным на будущее, вы должны знать как он работает.
Если вы можете кодировать смарт контракты, используя другие языки, Solidity все таки лучше подходит для этих целей. Более того, если вы хотите стать разработчиком Ethereum или создавать токены ICO / ERC20 для своего проекта, это безусловно ваш выбор. Если у вас есть некоторый опыт работы с C ++ или JavaScript, кодирование на Solidity должно быть для вас относительно простым. Вам, однако, придется понимать некоторые различия между клиент-серверной и децентрализованной моделями запуска программного обеспечения. Благодаря Ethereum Foundation и некоторым сторонним организациям разработчикам предоставляется набор удобных инструментов, таких как Remix и Etherscan, для кодирования и развертывания интеллектуальных контрактов.
Мы надеемся, что наш учебник помог вам разобраться с большинством концепций Solidity, чтобы начать увлекательное путешествие по изучению технологии блокчейн. Помните, что вы всегда можете проверить с последней документацией Solidity
Модификаторы доступа
По умолчанию, методы без модификаторов объявляются публичными public. Так же для определения области видимости метода или переменной есть external, internal и private. External и internal это о том можно ли вызывать метод из вне (транзакцией или другим контрактом) или только из кода (контракта и наследников). Public и private это о наследовании, в случае методов. Подробнее в документации о встроеных модификаторах.
Для переменной состояния модификатор public имеет дополнительный смысл. При компиляции для этой переменной создается external геттер с ее именем. Поэтому следующие два контракта эквивалентны по своему интерфейсу:
contract Foo {uint public data = 42;}contract Foo2 {uint data = 42; // нельзя назвать data() так как имя уже занято переменнойfunction getData() public returns (uint) { return data; }}
Так же можно описать свои модифиакторы. И в хороших практиках так и делается. В них можно описать дополнительные проверки состояния при вызове метода. Такой пример рассмотрим позже.