Технология смарт-контрактов появилась в начале 90-х годов. Ее придумал известный криптограф Ник Сабо, которого многие считают создателем биткоина. Смарт-контракты стали массовым явлением только после запуска криптовалюты Ethereum в 2015 году. Сегодня они лежат в основе почти всех проектов, связанных с блокчейном. Базовая информация о том, как именно работает технология — здесь.

Чтобы читать смарт-контракты, нужно понимать их структуру и код блоков. Понимание процесса открывает путь к написанию смарт-контрактов с помощью Solidity или любого другого языка программирования. Рассказываем, как читать смарт-контракты.

Хотите обсудить возможности смарт-контрактов с участниками криптосообщества? Приходите в Телеграм-канал BeInCrypto. У нас не только новости и обзоры, но и живое общение с трейдерами, инвесторами и просто фанатами криптовалюты. Задавайте вопросы экспертам, участвуйте в промоакциях, будьте в курсе вместе с BeInCrypto.

Что такое смарт-контракты

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

Умение читать смарт-контракты позволяет самостоятельно анализировать код и выявлять его особенности. Глубокое погружение в вопрос, в том числе, поможет находить уязвимости и детали, которые разработчики попытались скрыть.

Интересно!

На рынке есть программы, которые могут автоматически проверять смарт-контракты. Например, такой функционал есть в чат-боте для «Телеграма» ChainGPT. Программа может не только аудировать смарт-контракты, но и генерировать NFT, автоматизировать торговлю активами и даже проводить блокчейн-исследования. Чтобы познакомиться с функционалом бесплатного чат-бота ChainGPT, переходите по ссылке. 

Как читать смарт-контракты

Вот простой смарт-контракт, представляющий счет условного депонирования. Пользователи вносят свои средства на условное депонирование. Затем эти средства, по истечении определенного периода времени, передают получателю.

// 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<Initialize>) -> ProgramResult {

        let greeting_account = &mut ctx.accounts.greeting_account;

        greeting_account.counter = 0;

        Ok(())

    }

    pub fn increment(ctx: Context<Increment>) -> ProgramResult {

        let greeting_account = &mut ctx.accounts.greeting_account;

        greeting_account.counter += 1;

        Ok(())

    }

}

Расшифровку деталей смарт-контракта можно получить на официальном сайте Solana.

Пара слов об аудите

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

Напомним, ранее редакция BeInCrypto разбиралась в том, сколько стоит провести аудит смарт-контракта и нужны ли, учитывая негативную статистику, аудиты вообще.

Топ криптоплатформ | Ноябрь 2024
Топ криптоплатформ | Ноябрь 2024
Топ криптоплатформ | Ноябрь 2024

Дисклеймер

Согласно правилам Trust Project, образовательный контент на этом сайте публикуется только для общего ознакомления. Политика BeInCrypto — предоставлять качественную и правдивую информацию, проводить собственные исследования, а также создавать информативный и полезный контент для читателей. BeInCrypto может рассказывать о своих партнерах в своих материалах по обоюдной договоренности, однако эти договоренности не делают контент предвзятым или вводящим в заблуждение. Вся ответственность за любые действия, которые читатель предпринимает на основании информации, размещенной на нашем сайте, лежит на самом читателе. Также обратите внимание, что наши «Условия и положения», «Политика конфиденциальности» и «Дисклеймеры» были обновлены.

evgeniya-likhodey.jpg
Евгения Лиходей
Евгения Лиходей — криптожурналист и новостной корреспондент с десятилетним опытом работы в российских и зарубежных отраслевых СМИ, включая BloomChain и Bits.Media. Считает, что качественный контент крайне важен для популяризации идей децентрализации. Придерживается принципов непредвзятой журналистики и использует ее преимущества для развития криптосообщества.
READ FULL BIO
Sponsored
Sponsored