Как читать смарт-контракты: инструкция
Технология смарт-контрактов появилась в начале 90-х годов. Ее придумал известный криптограф Ник Сабо, которого многие считают создателем биткоина . Смарт-контракты стали массовым явлением только после запуска криптовалюты Ethereum в 2015 году. Сегодня они лежат в основе почти всех проектов, связанных с блокчейном . Базовая информация о том, как именно работает технология — здесь .
Чтобы читать смарт-контракты, нужно понимать их структуру и код блоков. Понимание процесса открывает путь к написанию смарт-контрактов с помощью Solidity или любого другого языка программирования. Рассказываем, как читать смарт-контракты.
Хотите обсудить возможности смарт-контрактов с участниками криптосообщества? Приходите в Телеграм-канал BeInCrypto . У нас не только новости и обзоры, но и живое общение с трейдерами, инвесторами и просто фанатами криптовалюты. Задавайте вопросы экспертам, участвуйте в промоакциях, будьте в курсе вместе с BeInCrypto.
- Что такое смарт-контракты
- Характеристики смарт-контрактов
- Как читать смарт-контракты
- Блокчейны для смарт-контрактов
- Пара слов об аудите
Что такое смарт-контракты
Смарт-контракты — это программируемые биты кода, которые запускают запрограммированные действия только при выполнении набора условий. Они являются цифровыми аналогами реальных контрактов, только в этом случае законом является код. Поскольку смарт-контракты работают на блокчейне, они защищены от фальсификаций — их нельзя подделать.
Умение читать смарт-контракты позволяет самостоятельно анализировать код и выявлять его особенности. Глубокое погружение в вопрос, в том числе, поможет находить уязвимости и детали, которые разработчики попытались скрыть.
Интересно! На рынке есть программы, которые могут автоматически проверять смарт-контракты. Например, такой функционал есть в чат-боте для Телеграм ChainGPT . Программа может не только аудировать смарт-контракты, но и генерировать NFT, автоматизировать торговлю активами и даже проводить блокчейн-исследования. Чтобы познакомиться с функционалом бесплатного чат-бота ChainGPT, переходите по ссылке>>>
Предназначение смарт-контрактов
Смарт-контракты предназначены для автоматизации транзакций, связанных с блокчейном. Поскольку речь идет о цифровых контрактах, схема позволяет упразднить посредников.
Технология универсальна. Смарт-контракты используют в сфере финансовых услуг, в логистике и многих других направлениях. Чтобы технология работала эффективно, при формировании смарт-контракта нужно просчитывать стратегию его работы и анализировать возможные угрозы безопасности.
Схема взаимодействия смарт-контракта с блокчейном: BeInCryptoСмарт-контракты могут работать с токенами различных блокчейнов. В том числе, они способны взаимодействовать с монетами популярного стандарта ERC-20 Ethereum.
Некоторые смарт-контракты могут выполнять несколько задач параллельно. Такой вид цифровых контрактов называют ассинхронным.
Смарт-контракты, в том числе, используют для создания различных децентрализованных приложений и платформ, работа с которыми подразумевает автоматизацию действий. Самой популярной платформой для развертывания смарт-контрактов стал Ethereum.
Характеристики смарт-контрактов
Программируемость. Условия смарт-контракта могут быть гибкими — сформулированными под требования определенного проекта.
Не требует доверия. Смарт-контракты на блокчейне исключают вмешательство человека. Обход человеческого фактора повышает надежность и устраняет необходимость формирования доверия, так как все автоматизировано.
Автономность. Смарт-контракты автоматически исполняют заложенные в них требования. Особенность гарантирует автономность работы таких систем.
Безопасность. Смарт-контракты, вернее прописанные в них условия и схемы их исполнения, защищены криптографией. Взломать систему можно только если в ней изначально были допущены ошибки.
Поддающийся проверке. Проведение операции в рамках смарт-контракта доказывает факт предварительной проверки ее условий. В случае, если бы условия не соответствовали заложенному в смарт-контракт шаблону, операцию бы не удалось провести.
Как читать смарт-контракты
Вот простой смарт-контракт, представляющий счет условного депонирования. Пользователи вносят свои средства на условное депонирование. Затем предства, по истечении определенного периода времени, передают получателю.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// Basic Smart Contract Boilerplate
contract SimpleTrustlessEscrow {
// State variables
address public depositor; // Account depositing ether
address payable public beneficiary; // Account receiving ether
uint256 public releaseTime; // Timestamp to release ether
// Events for verifying contract activity
event Deposited(address indexed _from, uint256 _value);
event Released(address indexed _to, uint256 _value);
// The contract constructor initializes the smart contract
constructor(address payable _beneficiary, uint256 _releaseTime) {
require(_releaseTime > block.timestamp, “Release time must be in the future”);
// Secure and Trustless: Contract binds depositor and beneficiary
depositor = msg.sender;
beneficiary = _beneficiary;
releaseTime = _releaseTime;
}
// Deposit function – autonomous execution (fallback function)
receive() external payable {
emit Deposited(msg.sender, msg.value);
}
// Release the ether to the beneficiary
function release() public {
// Programmable: Can only be executed after releaseTime
require(block.timestamp >= releaseTime, “Too early to release”);
// Autonomous: Automatically executes based on condition
uint256 amount = address(this).balance;
beneficiary.transfer(amount);
emit Released(beneficiary, amount);
}
}
Приступим к расшифровке и подробному чтению этого смарт-контракта. Давайте сначала проверим, соответствует ли он упомянутым характеристикам.
Программируемость
Посмотрите на эту часть кода:
require(block.timestamp >= releaseTime, “Too early to release”);
uint256 amount = address(this).balance;
beneficiary.transfer(amount);
В ней указаны особые условия перевода средств. Смарт-контракт соответствует характеристике.
Не требует доверия
Обратите внимание на фрагмент кода:
depositor = msg.sender;
beneficiary = _beneficiary;
releaseTime = _releaseTime;
В контракте все связаны кодом: от вкладчика до лица, получающего средства. Никому не нужно взаимодействовать с третьими лицами или доверять другому человеку, так как функция перевода средств привязана к параметру, основанному на коде.
Автономность
Теперь обратим внимание на эту часть кода:
function release() public {
require(block.timestamp >= releaseTime, “Too early to release”);
uint256 amount = address(this).balance;
beneficiary.transfer(amount);
emit Released(beneficiary, amount);
}
Весь процесс автономен. Средства высвобождаются только тогда, когда запросы соответствует заданным критериям. Обратите внимание на то, что код полностью автономен.
Другие элементы кода смарт-контракта, включая функцию депозита, также можно сделать полностью автономными, если это потребуется (еще одно доказательство программируемости контракта). Например, можно прописать код таким образом, чтобы система переводила получателю средства каждый раз, когда объем средств на кошельке превышает $100.
Безопасность
За безопасность средств и гарантию исполнения договора отвечает вот эта часть кода:
constructor(address payable _beneficiary, uint256 _releaseTime) {
require(_releaseTime > block.timestamp, “Release time must be in the future”);
depositor = msg.sender;
beneficiary = _beneficiary;
releaseTime = _releaseTime;
}
В нем, в том числе, прописаны приоритеты, которые исключают рандомность исполнения смарт-контракта.
Поддающийся проверке
Каждая транзакция, связанная со смарт-контрактом, регистрируется в блокчейне. За действие отвечает вот эта часть кода:
event Deposited(address indexed _from, uint256 _value);
event Released(address indexed _to, uint256 _value);
emit Deposited(msg.sender, msg.value);
emit Released(beneficiary, amount);
К другим частям смарт-контракта
Pragma solidity ^0.8.0; – Версия языка программирования Solidity, необходимая для написания этого смарт-контракта.
// SPDX-License-Identifier: MIT – Идентификатор обмена данными о пакетах программного обеспечения. Дает представление о наличии лицензии на выпуск кода. Его включают, чтобы люди знали, является ли интересующий их исходный код открытым.
Contract TimeLock { – Элемент, который присваивает смарт-контракту имя (лейбл).
Address public depositor; – Поскольку в договоре участвуют вкладчик и бенефициар, в этом пункте упомянут его публичный адрес. Эта переменная представляет собой адрес кошелька Ethereum.
Address payable public beneficiary; – Это публичный адрес бенефициара, куда с эскроу переводят средства. Он нужено, чтобы придать смарт-контракту прозрачность исполнения функций.
Uint256 public releaseTime; – Поскольку контракт работает с привязкой ко времени, нужен элемент, который бы присваивал контракту временную переменную. В нашем случае, эту роль выполняет uint256. Элемент задает временные рамки, в соответствии с которыми будут осуществляться операции с активами.
Прочие элементы
constructor(address payable _beneficiary, uint256 _releaseTime) { – «Конструктор» представляет собой одноразовую специальную функцию, которая начинает работать при развертывании смарт-контракта. Она приводит контракт в действие. С ее помощью система забирает в работу все адресные переменные.
Receive() external payable { – Это специальная функция, которая становится активной при движении средств на адрес контракта извне. External указывает на движение активов извне, а «Payable» определяет характер перемещения. В нашем случае, указывает на получение токенов ERC-20.
Function release() public { – Эта функция констатирует движение токенов ERC-20 от адреса контракта к бенефициару. Она привязана ко времени проведения операции.
Блокчейны для смарт-контрактов
Самым популярным блокчейном для развертывания смарт-контрактов оказался Ethereum. Выше мы разобрали пример смарт-контракта, написанного для работы на его основе. При этом Ethereum — не единственный блокчейн, который можно рассмотреть для работы. Популярные альтернативы — Solana , с языком программирования Rust и Cardano , с языком программирования Plutus.
Вот, например, как выглядит код смарт-контракта на Rust для Solana:
Note: It is a simple contract where a counter gets incremented.
use anchor_lang::prelude::*;
declare_id!(“Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS”);
#[program]
pub mod hello_world {
use super::*;
pub fn initialize(ctx: Context ) -> ProgramResult {
let greeting_account = mut ctx.accounts.greeting_account;
greeting_account.counter = 0;
Ok(())
}
pub fn increment(ctx: Context ) -> ProgramResult {
let greeting_account = mut ctx.accounts.greeting_account;
greeting_account.counter += 1;
Ok(())
}
}
Расшифровку деталей смарт-контракта можно получить на официальном сайте Solana .
Пара слов об аудите
Для самостоятельного аудирования смарт-контракта нужен большой опыт разработок. Статистика взломов показывает, что иногда даже самые именитые аудиторские конторы допускают ошибки. При этом умение распознать в смарт-контракте признаки мошенничества не будет лишним.
Напомним, ранее редакция BeInCrypto разбиралась в том, сколько стоит провести аудит смарт-контракта и нужны ли, учитывая негативную статистику, аудиты вообще .
Дисклеймер: содержание этой статьи отражает исключительно мнение автора и не представляет платформу в каком-либо качестве. Данная статья не должна являться ориентиром при принятии инвестиционных решений.
Вам также может понравиться
Чистый приток в спотовые ETF на базе биткоина и Ethereum превысил $379 млн
Команда Incrypted объявила о старте продаж образовательного курса по аирдропам
Zoniqx и Hedera: Новая эра токенизации