Смарт-контракты - это программируемые фрагменты кода, которые выполняются только при выполнении определенного набора условий. Они синонимичны с юридически обязывающими контрактами в реальном мире; только в этом случае код является законом. Поскольку смарт-контракты находятся на блокчейне, они являются неизменяемыми - их нельзя подделать. Именно эта характеристика неизменности делает смарт-контракты особенными, среди прочего.
Смарт-контрактыпредназначены для автоматизации транзакций, специфичных для блокчейна. Поскольку это контракты, зависящие от условий, они не требуют посредников. То, что делает смарт-контракты полезными, это их совместимость с широким спектром случаев использования, включая финансовые услуги, управление цепочкой поставок и многое другое. И в отличие от традиционных фрагментов кода, которые программировались на скорую руку, для смарт-контрактов требуются высокоэффективные и трудоемкие стратегии безопасности.
Как смарт-контракты согласуются с технологией блокчейн: BeInCrypto
«Модное слово «web3» подразумевает небрежные привычки программирования веб-страниц с низким уровнем безопасности. Когда криптовалюты или смарт-контракты программируются как веб-страницы, им угрожает провал. Устойчиво успешные блокчейны и их приложения основаны на гораздо более безопасных, осторожных и медленных методах программирования.»
Ник Сабо, криптограф и специалист по информатике: Twitter
Смарт-контракты могут работать с блокчейн-специфическими токенами, такими как ERC-20 для блокчейна Ethereum, стимулируя усилия и перемещая транзакции. Поскольку в этом участвуют код, условия и затраты, вам следует быть осторожным при их чтении, записи и аудите.
Реальное значение смарт-контрактов заключается в их природе и позиционировании. Для данного сценария — скажем, когда лицо A перемещает средства лицу B после завершения B услуги — копия смарт-контракта сохраняется и выполняется узлами блокчейна. Смарт-контракты сохраняются как коды контрактов внутри цепи. Это многоуровневая проверка — это характерная черта блокчейна, обеспечивающая безопасность.
Кроме того, существуют последовательные или синхронные смарт-контракты и асинхронные смарт-контрактыгде задачи выполняются параллельно. Поэтому тип и цель смарт-контракта определяют способ его написания, чтения или даже проверки.
Традиционные контракты, свидетельства о собственности, завещания и т. д. являются частным правом, "разработанным частными лицами, а не политиками или государственными чиновниками". Смарт-контракты представляют собой новую форму такого децентрализованного правоприменения.https://t.co/EU2Y28FznK
— Ник Сзабо (@NickSzabo4) 15 марта 2018 г.
Давайте рассмотрим стандартный пул ликвидности, управляемый смарт-контрактом.
Представьте, что пул токенов можно использовать для торговли, и каждый раз, когда происходит успешная сделка, 0,3% от общей стоимости сделки отправляется поставщику ликвидности, который сделал эту сделку возможной или добавил ликвидность для этого обозначенного объекта торговли. Все условия, выделяющие сценарии сделок, торговые сборы и условия невыполнения и сбоев сделок, закодированы как Смарт-контракт, который хранится в блокчейне в виде кода контракта.
Мы не можем глубоко погрузиться в чтение, запись и аудит контрактов, если мы не знаем их характеристики. Вот стандартные черты смарт-контрактов, о которых стоит знать:
Несколько характеристик стандартного смарт-контракта: BeInCrypto
Смарт-контракты - это просто куски кода. Вы можете написать смарт-контракты для выполнения команд и сценариев на основе определенных условий. Вот почему разработчики и программисты смарт-контрактов в настоящее время востребованы, так как большинство из DeFiпространство уже полагается на смарт-контракты для обработки сложных случаев, таких как обработка торговых сборов в ликвидности пулов, поддержание APYкоэффициенты и многое другое.
Смарт-контракты, находящиеся на блокчейне, исключают вмешательство человека. Это делает их полностью доверительными. Например, если определенный DeFiпротокол, управляемый смарт-контрактом(ами), соглашается ликвидировать ваши активы, как только их стоимость упадет ниже порога, никакое вмешательство человека не может или не должно остановить это. Код обрабатывает платежи, выполнение, управление и соблюдение правил, делая весь пространство полностью децентрализованным.
Как уже упоминалось ранее, смарт-контракты загружены самовыполняющими наборами инструкций. В терминах кодирования это означает наличие итераций и циклов, встроенных в шаблон. Это гарантирует, что задачи, такие как оплата, вывод средств, депозиты, наказание валидаторов через снижение ставок, а также несколько других задач, обрабатываются автономно.
И, наконец, поскольку смарт-контракты защищены с использованием криптографии, их взломать невероятно сложно. Без встроенной уязвимости обойти смарт-контракт означало бы попытаться взломать его на открытом пространстве, перед всем блокчейном.
Транзакции, обработанные с помощью смарт-контрактов, самопроверяемы. Это означает, что выполнение достаточно доказательством того, что транзакция произошла в первую очередь, так как в ней не участвует человеческий элемент. Механизм самопроверки дает смарт-контрактам преимущество перед традиционными контрактами, регулирующими наследственные банковские установки.
Итак, когда вы планируете читать смарт-контракт в следующий раз, убедитесь, что шаблон или документация содержат все упомянутые характеристики.
Упрощенная версия смарт-контрактов: Reddit
Здесь простой смарт-контракт, представляющий собой счет доверительного управления. Пользователи вносят свои средства на счет доверительного управления, который затем переводит их получателю после определенного временного интервала.
/ SPDX-License-Identifier: MITpragma solidity ^0.8.0;// Базовый смарт-контракт Boilerplatecontract SimpleTrustlessEscrow {// Переменные состояния публичного депонента; // Счет депозита etheraddress кредиторской задолженности публичного бенефициара; // Учетная запись получает etheruint256 public releaseTime; // Временная метка для выпуска эфира// События для проверки активности контрактаevent Deposited(адрес с индексом _from, uint256 _value); event Released(address indexed _to, uint256 _value);// Конструктор контракта инициализирует конструктор смарт-контракта(address payable _beneficiary, uint256 _releaseTime) { require(_releaseTime > block.timestamp, "Время релиза должно быть в будущем"); Безопасно и без доверия: Контракт связывает вкладчика и вкладчика-бенефициара = msg.sender; бенефициар = _beneficiary; releaseTime = _releaseTime;}Функция депозита – автономное исполнение (резервная функция)receive() external payable { emit Deposited(msg.sender, msg.value);}Отпустить эфир бенефициаруфункция release() public { // Программируемый: Может быть выполнен только после releaseTime require(block.timestamp >= releaseTime, "Слишком рано выпускать"); Автономный: Автоматически выполняется на основе условия uint256 amount = address(this).balance; beneficiary.transfer(сумма); emit Released(бенефициар, сумма);}}
Хотя мы перейдем к расшифровке и прочтению этого смарт-контракта в деталях, давайте сначала проверим, соответствует ли он упомянутым характеристикам контракта.
Внимательно рассмотрите контракт на этот участок кода:
require(block.timestamp >= releaseTime, "Слишком рано выпускать");
uint256 amount = address(this).balance;
beneficiary.transfer(amount);
Средства должны быть выпущены только тогда, когда выполнено определенное условие releaseTime, делая эти программные контракты исполнимыми.
Здесь есть быстрый фрагмент кода из вышеупомянутого:
depositor = msg.sender;
beneficiary = _beneficiary;
releaseTime = _releaseTime;
В договоре все закодированы, от вкладчика до лица, получающего средства. Никому не нужно взаимодействовать друг с другом или доверять ему, так как функция перевода средств связана параметром releaseTime — на основе кода.
Вот часть кода "выпуска фонда":
функция release() public {require(block.timestamp >= releaseTime, "Слишком рано выпускать"); uint256 сумма = адрес(это).баланс; beneficiary.transfer(сумма); emit Released(бенефициар, сумма);}
Весь процесс автономен, так как средства выпускаются только тогда, когда время выпуска соответствует определенному критерию. Обратите внимание, что код не является частично программируемым, а полностью автономным.
Другие элементы кода смарт-контракта, включая функцию депозита, также могут быть полностью автономными в зависимости от функций, которые вы хотите включить. Например, вы можете запустить план регулярного депозита каждый раз, когда пользователь кошелекпересекает $100, а излишек переходит бенефициару.
Обеспокоен, какой элемент придаетбезопасностьк контракту? Проверьте эту часть кода:
constructor(адрес к оплате _beneficiary, uint256 _releaseTime) {require(_releaseTime > block.timestamp, "Время релиза должно быть в будущем"); депонент = msg.sender; бенефициар = _beneficiary; releaseTime = _releaseTime;}
Обратите внимание на то, что функция releaseTime имеет установленный приоритет по отношению к метке времени. Ничто не случайно, и условия должны быть соблюдены.
Каждая транзакция, связанная со смарт-контрактом, регистрируется в цепочке благодаря отдельным элементам активности журнала.
событие Deposited(address indexed _from, uint256 _value);
event Released(address indexed _to, uint256 _value);
emit Deposited(msg.sender, msg.value);
emit Released(получатель, сумма);
Теперь, когда мы определили элементы, определяющие характеристики смарт-контракта, вот другие элементы контракта, которые помогут вам лучше понять ситуацию.
Pragma solidity ^0.8.0; – Версия языка программирования Solidity, необходимая для написания этого смарт-контракта.
// SPDX-License-Identifier: MIT – Терминированный программный пакет обмена данными, этот идентификатор указывает лицензию на выпуск кода. Рекомендуется включить это, чтобы люди знали, является ли он открытым и можно ли с ним работать или нет.
Contract TimeLock { – Назначает имя смарт-контракту, как ярлык.
Адрес публичного депозитария; - Поскольку контракт включает в себя депозитария и выгодоприобретателя, здесь упоминается публичный адрес депозитария. Эта переменная -Эфириум кошелекадрес и доступен для общего просмотра.
Адрес, доступный для оплаты, публичный бенефициар; – Это общедоступный адрес бенефициара, куда переводятся средства из доверительного фонда. Он также читаем и придает чувство прозрачности смарт-контрактам на базе блокчейна.
Uint256 публичный релизВремя; – Поскольку это контракт с привязкой ко времени, uint256 присваивает контракту переменную, основанную на времени. Это и будут сроки, в соответствии с которыми будут происходить выпуски фондов.
В Solidity uint (unsigned integer) - это способ присвоения целочисленных значений. Суффикс 256 обозначает большое хранилище чисел.
после 5 лет написания смарт-контрактов я только сегодня понял, что логотип solidity - это логотип ethereum, развернутый 🤯pic.twitter.com/wlM369Eff9
— kaden.eth (@0xKaden) 8 июля 2023 года
Вы можете рассматривать прочтение Документация Solidityознакомиться с синтаксисом, выражениями и другими элементами кода.
constructor(address payable _beneficiary, uint256 _releaseTime) { – The “Constructor” is a one-time special function that gets called when the smart contract is deployed. It sets the contract in motion. Notice how at this point, all the address variables that we previously declared are called and initialized.
Receive() external payable { – Это специальная функция, вызываемая при перемещении средств на адрес контракта извне. External предполагает извне, а «Payable» определяет характер перемещения, то есть получение токенов ERC-20.
Function release() public { – Это публичная функция, которая констатирует движение токенов ERC-20 от адреса контракта до бенефициара. Эта функция зависит от releaseTime.
Все эти элементы являются частями гипотетического контракта Эскроу, о котором мы говорили. Убедитесь, что вы изучили весь документ по Solidity, чтобы лучше понять этот язык.
Знайте элементы, прежде чем планировать написание смарт-контрактов: BeInCrypto
К этому моменту у вас должно быть преимущество в чтении и понимании уже написанного смарт-контракта. И многие смарт-контракты, подобные тем, которые мы обсуждали, составляют бэкенд децентрализованного приложения — Блокчейнверсия стандартного мобильного приложения.
Каждая характеристика смарт-контракта, включая безопасность контракта, автономное и программируемое выполнение, доверительность транзакций и многое другое, легко реализуется при разработке децентрализованного приложения. Так что, когда вы следующий раз наталкиваетесь на DApp, обратите внимание, что это приложение смарт-контрактов, запущенное на блокчейне, помогающее вам инициировать множество задач без участия человека. Смарт-контракты составляют логику DApps.
Мы знаем, что Ethereum позволяет вам разрабатывать смарт-контракты, похожие на масштабное программное решение. Однако это не единственный блокчейн-протокол. Если вы хотите погрузиться в мир разработки смарт-контрактов, вам может захотеться посмотреть на другие блокчейны. Разные блокчейны используют разные термины, когда дело касается составления контрактов.
Но сначала давайте обсудимEthereum— платформа по умолчанию для большинства разработчиков смарт-контрактов.
Смарт-контракты на Ethereum написаны на языке программирования Solidity. И интерфейс токена для этой платформы разработки смарт-контрактов - ERC-20.
Вы можете вернуться к смарт-контракту на основе условного депонирования, который мы обсуждали ранее, чтобы увидеть, как пишется стандартный смарт-контракт на основе эфируема.
Даже запуск токена ERC-20 на блокчейне Ethereum - это функция, интенсивно использующая смарт-контракты, о чем мы подробно обсудим при написании смарт-контракта.
Вот как выглядит базовая структура кода, при условии, что мы планируем запустить новую криптовалюту BIC.
Представьте себе гипотетический сценарий. Не совсем запуск BIC криптовалюты.
твердость прагмы ^0.8.0; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract BICToken is ERC20 { constructor(uint256 initialSupply) ERC20("BIC Token", "BIC") { _mint(msg.sender, initialSupply); }}
Мы обсудим каждый элемент этого кода позже, когда будем писать наш смарт-контракт.
Как и на Ethereum, вы можете создавать смарт-контракты на платформах типа Солана, используя Rust и Cardano, используя Plutus, подмножество Haskell — функционального языка программирования.
«У Кардано вообще есть смарт-контракты?»
Шутки за тобой, приятель. #CardanoADA pic.twitter.com/j8SXCu72Sd
— Willybot 🇦🇺 (@wilbot28) 9 июля 2023 года
Вот как выглядит структура кода на Rust (Solana) выглядит так:
Примечание: Это простой контракт, в котором счетчик увеличивается.
использовать anchor_lang::прелюдия::*;declare_id!(“Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS”);#[программа] публичный мод hello_world {использовать супер::*;публичный fn initialize(ctx: Контекст<Инициализировать>) -> РезультатПрограммы { пусть greeting_account = &mut ctx.accounts.greeting_account; greeting_account.counter = 0; Ok(())}публичный fn increment(ctx: Контекст<Увеличить>) -> РезультатПрограммы { пусть greeting_account = &mut ctx.accounts.greeting_account; greeting_account.counter += 1; Ok(())}}
Вы знали? В то время как Rust - это язык программирования для создания смарт-контрактов на основе Solana, Якорьэто фреймворк разработки смарт-контрактов, который используется. Для создания смарт-контрактов с использованием Rust разработчики должны извлечь модули из фреймворка Anchor — что-то вроде первой строки нашего образца кода (use anchor_lang::*;) означает.
Документация по Solanaпоможет вам понять специфический для Rust язык смарт-контрактов.
Точно так же, Cardano следует за Plutus как выбор языка, за которым следует язык Ink!Polkadot, TEAL для Algorand, C# для NEO и другие. Рекомендуется подробно изучить документацию для каждой цепи перед тем, как приступить к написанию совместимого смарт-контракта.
Возможность писать смарт-контракты высоко ценится, но даже умение читать несет в себе свои преимущества:
Теперь, когда прочтение смарт-контрактов позади, давайте сосредоточимся на написании смарт-контрактов. Прежде чем погружаться глубже, необходимо подчеркнуть, что различные блокчейны могут иметь различные стандарты и языки, связанные с разработкой смарт-контрактов. Важно сосредоточиться на стандартах, установленных любым конкретным блокчейном, чтобы начать писать и развертывать контракты.
Большую часть нашего обсуждения мы сосредоточимся на Ethereum как цепочке и Solidity как языке.
Программирование смарт-контракта является самой важной частью цикла разработки. А чтобы заняться разработкой смарт-контрактов на Ethereum или любом другом блокчейне, у вас должен быть некоторый опыт работы с языками программирования, не относящимися к блокчейну, такими как Javascript.
Различные блокчейны и язык для написания смарт-контрактов: BeInCrypto
Возможность программировать смарт-контракт позволяет вам реализовать логику, обеспечить безопасность элементов, оптимизировать код для комиссия за газ, настроить то же самое и даже сделать его взаимодействующим, если необходимо.
Все, кто планирует писать смарт-контракты на Ethereum, должны понимать, что такое Виртуальная машина Ethereum (EVM) и как она работает с смарт-контрактами. Для начала, EVM - это компонент Ethereum, который предоставляет программам изолированную и контролируемую среду для работы. Можно считать это глобальным компьютером, на котором находится весь код контракта на Ethereum. Каждыйузелна сети Ethereum работает EVM.
Если вы стремитесь стать разработчиком смарт-контрактов, вот что вам следует знать относительно смарт-контрактов и EVM.
После того, как вы напишете программу на Solidity, которая является языком высокого уровня, вам нужно скомпилировать ее в байткод - машинно-понятный формат низкого уровня. Этот байткод попадает в блокчейн Ethereum и остается там. Любой, взаимодействующий со смарт-контрактом, должен отправить транзакцию на адрес контракта.
Каждый узел с установленным EVM может видеть эту транзакцию, и как только валидаторы одобряют ее, выполняется код смарт-контракта. Поскольку у каждого узла есть видимость транзакций, ничего нельзя подделать, и код выполняется так, как он был написан. И как только код будет выполнен, состояние блокчейна изменится, сделав процесс от начала до конца и полностью прозрачным.
Для написания смарт-контрактов требуется техническое мастерство. Но это еще не все. Вам также необходимо тщательно понимать, как работает технология блокчейн, какие языковые особенности необходимы для блокчейна, на который вы нацеливаетесь, взаимодействие, и многое другое. Кроме того, вы также должны знать немало о уязвимостях смарт-контрактов — вещи, которых стоит избегать при написании кода. И, наконец, знание тестирования контрактов и развертывания контрактов также обязательно.
Все это может стать подавляющим. Итак, вот небольшой шпаргалка, чтобы начать:
Здесь краткая информация с несколькими советами по написанию лучших смарт-контрактов:
🥧 FREI-PI
‼️ Почему разработчикам смарт-контрактов НУЖНО знать это!
Функция:
– Требования
– Эффекты
– Взаимодействия
Протокол
– Инварианты
Это образец, о котором вам следует думать, когда вы создаете смарт-контракты.
Вот почему 👇
— Патрик Коллинз ( @PatrickAlphaC) 6 июля 2023 года
Пришло время приступить к техническим аспектам разработки смарт-контрактов. Несмотря на то, что сети, такие как Solana и Cardano, позволяют вам разрабатывать смарт-контракты, Ethereum остается самой популярной платформой для разработки смарт-контрактов.
Вы знали? Только в 2022 году на сеть Ethereum было добавлено более 100 000 децентрализованных приложений.
У Ethereum огромное сообщество разработчиков. Любой ваш проект сразу привлечет внимание. Кроме того, его родной язык, Solidity, довольно прост для тех, кто знает Python или JavaScript. Наконец, глобальное программное обеспечение Ethereum, EVM, помогает обеспечивать беспрепятственное выполнение контрактов.
Если вы в большинстве и предпочитаете использовать Ethereum и Solidity, вот краткий список вещей, которые вам нужно отслеживать, прежде чем приступить к разработке смарт-контрактов:
Теперь, когда мы знаем, как происходят вещи на цепочке, давайте погрузимся в написание и развертывание первого смарт-контракта. Несмотря на то, что «Привет, мир!» остаётся первым шагом, мы начнем с создания смарт-контракта для запуска гипотетического токена BIC с 100% разблокированным общим объемом в 1 миллион.
Первый шаг - установить последнюю версию Node.js и NPM или менеджер пакетов Node. Это позаботится о инструментах разработки и локальной среде для разработки. Кроме того, Node.js и NPM позволяют настроить веб-интерфейс для вашего смарт-контракта.
Теперь вам нужно установить IDE для написания кода контракта. Для этого можно быстро установить Visual Studio Code. Или вы можете избавиться от беспорядка и hopна Альхимию — платформу для разработки блокчейна. С помощью Альхимии вы можете получить немного тестовых ETH. Этого хватит на оплату комиссии за газ при развертывании смарт-контракта на тестовой сети Goerli или даже на тестовой сети Sepolia.
Обратите внимание, что Сеполия - моложе тестовой сети и поэтому занимает меньше дискового пространства при развертывании узла.
На данный момент мы будем продолжать использовать тестовую сеть Goerli, так как в ней развернуто большее количество приложений.
С тестовой сетью и готовым фейковым ETH давайте перейдем к написанию смарт-контракта. Вот фрагмент кода для создания токена BIC с фиксированным запасом в 1 миллион.
Примечание: Мы развернем наш смарт-контракт локально на MacOS, а не на тестовой сети. Для развертывания смарт-контрактов на тестовой сети и основной сети у нас будет отдельный раздел, который выходит за рамки данного обсуждения.
Здесь простой фрагмент кода для гипотетического токена:
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract BICToken is ERC20 { constructor() ERC20("BIC Token", "BIC") { _mint(msg.sender, 1000000 * 10 ** decimals()); }}
Если вы знакомы с синтаксисом, вы будете знать, что означает каждый компонент кода. Что касается Openzepplinв части, это библиотека, к которой обращаются при импорте смарт-контрактов ERC-20. Эта библиотека предлагает базовые стандарты функционирования токенов ERC-20.
Функция mint говорит о начальном предложении, которое развертывается по адресу смарт-контракта или msg.sender.
Для настройки этого кода локально и его тестирования нам понадобятся три компонента:
Если вы прошли через детальный процесс написания смарт-контракта, важно знать немного о выполнении контракта. Это процесс, при котором код смарт-контракта выполняется на цепочке узлами.
Именно единообразие, связанное с исполнением контракта, делает смарт-контракты прозрачными и неизменными. Давайте теперь разберемся в этапно-проницательном процессе, связанном с исполнением контракта:
Фрагменты кода, которые мы пишем, должны быть выполнены где-то. В случае смарт-контрактов это место выполнения - блокчейн. Узлы или участники цепи помогают выполнить контракт.
Узлы принимают на себя ответственность за выполнение блоков кода контракта в обмен на цепочку связанных стимулов. Каждая команда или действие, происходящее в цепочке, руководствуется смарт-контрактами.
У каждого смарт-контракта есть определенный адрес. Для выполнения контракта транзакции отправляются на этот адрес контракта. Обратите внимание, что каждый узел запускает EVM, который затем имеет копию кода смарт-контракта, что облегчает проверку подлинности транзакций.
Транзакции, направленные на смарт-контракт, выбираются валидаторами, которые затем включают их в конкретные блоки.
Как только транзакция будет проведена и успешно подтверждена, она станет частью блокчейна. Затем будет вызвана и выполнена функция смарт-контракта, связанная с транзакцией, по всем узлам блокчейна.
Каждый узел, выполняющий смарт-контракт, должен прийти к детерминированному заключению — к одному и тому же результату для одного и того же набора входных данных — что делает характер контрактов полностью доверительным и прозрачным.
Примечание: Любая ошибка, касающаяся выполнения кода или проблем, связанных с комиссией за газ, отменяет транзакции. Это означает, что транзакция, основанная на определенном коде смарт-контракта, прекратит существование. Вот что происходит с флеш-кредитыкогда неспособность придерживаться определенных норм обращает вспять всю сделку, кажется, что средства вообще не двигались с самого начала.
Каждое изменение состояния, связанное с смарт-контрактами, записывается в блокчейне и становится неизменной частью того же.
Теперь, когда вы знаете немного о смарт-контрактах, вот несколько указателей, чтобы начать разработку контракта:
Каждая из упомянутых выше практик помогает оптимизировать код и реализовывать специфические меры безопасности. Однако есть несколько практик, специфичных для контрактов, которые вы должны соблюдать и реализовывать, чтобы обеспечить устойчивость кода. Это поможет сделать код контракта легким и удобным в использовании, чтобы каждый узел, выполняющий одно и то же, не должен был тратить много вычислительной мощности на то же самое.
Несмотря на то, что при написании и разработке смарт-контрактов следует придерживаться лучших практик, необходимо обращать внимание на уязвимости безопасности контрактов при их развертывании на основную сеть.
Каждый смарт-контракт, который присутствует в основной сети, должен быть оценен на производительность кода, безопасность и другие характеристики. Именно здесь аудит — тщательный процесс тестирования контрактов — выходит на первый план, позволяя вам выявить потенциальные уязвимости и слабые места контракта.
Вот краткий контрольный список аудита, с которого можно начать:
Удивительный список проверки аудита смарт-контрактов😈
Не забудьте проверить их при следующей проверке✅
Буду благодарен за ретвит, распространите знание🫡https://t.co/ILx0C67kf8
— cholakov (@cholakovv)7 июля 2023
В то время как чтение и написание смарт-контрактов взаимосвязаны, когда дело доходит до разработки интеллектуальных фрагментов кода, аудит занимает особое место и включает в себя проверку логики в первую очередь. Когда дело доходит до выполнения кода на основе блокчейна, все неизменно, и любая катастрофа может иметь необратимые последствия при выполнении контракта. Именно поэтому необходима тщательная проверка кода контракта и других аспектов с помощью аудита.
Там может быть целая группа уязвимости контрактовкоторые могут выявить детальный аудит смарт-контрактов. Сюда входит проверка на атаки повторного входа, переполнения или недостатки, проблемы, связанные с контролем доступа и многое другое. Как только точная природа проблемы определена, аудитор даже может предложить лучшие практики для ее исправления.
Все еще не уверены, как аудит смарт-контрактов может помочь? Что ж, давайте вернемся к известному DAOвзлом в 2016 году, который использовал проблему реентранси и привел к потере почти 3,6 миллиона ETH. Точно так же произошел взлом контракта кошелька Parity в 2017 году, приведший к потере почти 500 000 ETH. Эти проблемы могли быть избежаны при правильном наборе проверок.
Схема взлома DAO: BeInCrypto
Существует множество стратегий для аудита смарт-контрактов. Некоторые из наиболее популярных включают:
Эти инструменты действуют как первый набор защиты и наиболее эффективно используются для выявления общих уязвимостей. Некоторые из наиболее популярных инструментов включают Securify, Mythril и другие, способные выполнять статический анализ кода, обнаруживать шаблоны нарушений и помогать начать работу над безопасностью.
Инструменты для проверки смарт-контрактов: BeInCrypto
Именно здесь на сцену выходят ручные проверяющие код, тщательно изучая кодовую базу и выявляя сложные уязвимости, если они есть. Ручной обзор может помочь учесть бизнес-логику, контекст и шаблоны использования.
Вот как ручные кодовые обзоры помогают вам обнаружить угрозы:
Небольшая триффа для наших младших аудиторов!
Давайте пойдем и ретвитнем, если вы нашли ошибку!pic.twitter.com/i14YtweXcz
— CharlesPaladin (@PaladinCharles)8 июля 2023 г.
Инструменты, такие как Snyk и GuardRails, помогают автоматическому сканированию контрактов - это реализация безопасности, которая вызывается каждый раз при обновлении кода. Эта форма аудита гарантирует, что новые изменения, внесенные в код, безопасны и не являются вторжением в природу.
Это сложный процесс, который полностью опирается на проверку бизнес-логики кода. Обратите внимание, что формальная верификация на самом деле не предназначена для проверки синтаксиса, а только логики, чтобы убедиться, что код выполняется по желанию.
Помимо упомянутых стратегий, аудит смарт-контрактов также может быть инициирован с использованием обзоров сверстников, программ вознаграждения за находку ошибок и тестового покрытия с использованием инструментов, таких как Solidity Coverage, для максимизации эффективности.
Простой способ проверки смарт-контрактов: BeInCrypto
Если вы новичок в аудите смарт-контрактов, важно отметить, что существует два способа широкого анализа кода и выявления проблем. К ним относятся:
Такой тип анализа кода помогает выявлять основные уязвимости безопасности, ошибки кодирования и другие проблемы в соответствии с заданными стандартами кодирования и соглашениями. Угрозы, такие как вызовы к внешним источникам без проверки, переполнение целочисленных переменных и другие, могут быть выделены с использованием статического анализа. Лучшее в статическом анализе заключается в том, что код не нужно выполнять для его проверки.
Этот подход к аудиту тестов проверяет соответствие кода ЭВМ. Вместо того чтобы просто проверять код, динамический анализ проверяет ответы смарт-контрактов на широкий спектр входных данных. Динамический анализ может выявить проблемы, такие как несогласованное потребление газа и даже ошибочная логика контракта. Личные блокчейн-среды, такие как Ganache, могут работать как платформы динамического анализа, позволяя разработчикам осуществлять транзакции, выполнять команды и делать гораздо больше с их контрактами.
Вот фрагмент смарт-контракта, который работает как хранилище фондов с функцией вывода:
pragma solidity ^0.6.1;contract VulnerableContract { mapping(address => uint256) public balances; function deposit() public payable { balances[msg.sender] += msg.value; } function withdraw(uint256 _amount) public { require(balances[msg.sender] >= _amount, "Недостаточный баланс."); (bool success, ) = msg.sender.call{value: _amount}(""); require(success, "Перевод не удался."); balances[msg.sender] -= _amount; }}
Если вы внимательно посмотрите на код, то увидите ключевую уязвимость:
В предыдущем случае функцию «withdraw» можно вызвать снова, если пользователь, получающий средства, также является смарт-контрактом, хоть и злонамеренным. Поэтому перед выполнением последней функции или обновлением баланса может быть инициирована атака рекурсии для перевода дополнительных средств. Опытные аудиторы выявляют такого рода уязвимость.
Вот исправленный код для того же:
функция вывода(uint256 _amount) общедоступная { требуется(балансы[msg.sender] >= _amount, "Недостаточный баланс."); балансы[msg.sender] -= _amount; (bool успех, ) = msg.sender.call{value: _amount}("");
require(success, “Перевод не удался.”);
Проверьте, как сначала вызывается функция обновления баланса, а затем первое перемещение к пользователю. Именно изменение порядка операций исправляет контракт.
Мир децентрализованных приложений и смарт-контрактов вышел за пределы Ethereum. Несмотря на то, что большая часть действий все еще происходит в экосистеме Ethereum, существуют и другие цепочки, такие как Cardano, Solana и другие, которые поддерживают смарт-контракты и требуют различных стандартов аудита.
Различные блокчейны используют различные языки программирования. Семантика, синтаксис и свойства кода различны, что делает смарт-контракты отзывчивыми на различные практики написания и аудита. Например, Ethereum использует Solidity, в то время как Polkadotиспользует Ink и Rust — что делает его реактивным по отношению к определенным стандартам аудита.
Теперь, если вы хотите перейти к чему-то, отличному от Ethereum, есть несколько специализированных инструментов аудита, с которых можно начать. Например, у Cardano есть набор Marlowe для формальной верификации и аудита. Что касается Solana, Rust-специфические libfuzzer и cargo-fuzz предназначены для аудита и тестирования контрактов. Мультицепной аудитор должен быть знаком с этими концепциями, чтобы держать уязвимости контрактов под контролем.
Повторюсь, вы можете разделить аудит смарт-контрактов на три типа: ручной, автоматический и гибридный. Обратите внимание, что люди предпочитают гибридные стратегии аудита для сложных контрактов с глубокой бизнес-логикой, поскольку они являются наиболее всесторонними.
Организации и частные лица с минимальными знаниями в области программирования часто передают свои требования к написанию и аудиту на аутсорсинг фирмам с хорошей репутацией. Когда дело доходит до аудита, выбор правильной компании становится еще более важным, так как Инструменты искусственного интеллектакакЧатGPTможет помочь написать код смарт-контракта, проверка требует ручного анализа.
Также вот факторы, на которые следует обратить внимание при аутсорсинге задач аудита:
Прежде чем вы остановитесь на подходящей аутсорсинговой фирме, очень важно проверить прошлые аудиты, оценить опыт и даже сосредоточиться на ключевых членах команды.
Перед тем как нанимать, обратите внимание на затраты и услуги, связанные с аудитами. Прежде всего необходимо понять характер предлагаемых услуг — такие как выявление проблем, их решение и другие. Также следует проверить, предоставляются ли повторные аудиты после внедрения первой линии исправлений. Стоимость аудита смарт-контракта может варьироваться в зависимости от услуг, поэтому необходимо отслеживать каждое требование и предложение перед продолжением.
Если вы хотите отказаться от фирмы и проводить аудит смарт-контрактов самостоятельно, вот лучшие стратегии и практики, о которых следует помнить:
Искусственный интеллект действительно упрощает написание смарт-контрактов. Однако, независимо от инноваций в области искусственного интеллекта, возможность проводить аудит смарт-контрактов наилучшим образом по-прежнему требует вмешательства человека. Поэтому, если вы планируете создать свой следующий продукт web3 с акцентом на смарт-контракты и децентрализованные приложения, крайне важно сосредоточиться на лучших ресурсах аудита для ваших смарт-контрактов. В связи с тем, что взломы и взломы криптовалют всплывают с каждым днем, а хакеры планируют новые стратегии для прорыва, аудит контракта до совершенства, безусловно, является одним из наиболее важных современных наборов навыков.
分享
Смарт-контракты - это программируемые фрагменты кода, которые выполняются только при выполнении определенного набора условий. Они синонимичны с юридически обязывающими контрактами в реальном мире; только в этом случае код является законом. Поскольку смарт-контракты находятся на блокчейне, они являются неизменяемыми - их нельзя подделать. Именно эта характеристика неизменности делает смарт-контракты особенными, среди прочего.
Смарт-контрактыпредназначены для автоматизации транзакций, специфичных для блокчейна. Поскольку это контракты, зависящие от условий, они не требуют посредников. То, что делает смарт-контракты полезными, это их совместимость с широким спектром случаев использования, включая финансовые услуги, управление цепочкой поставок и многое другое. И в отличие от традиционных фрагментов кода, которые программировались на скорую руку, для смарт-контрактов требуются высокоэффективные и трудоемкие стратегии безопасности.
Как смарт-контракты согласуются с технологией блокчейн: BeInCrypto
«Модное слово «web3» подразумевает небрежные привычки программирования веб-страниц с низким уровнем безопасности. Когда криптовалюты или смарт-контракты программируются как веб-страницы, им угрожает провал. Устойчиво успешные блокчейны и их приложения основаны на гораздо более безопасных, осторожных и медленных методах программирования.»
Ник Сабо, криптограф и специалист по информатике: Twitter
Смарт-контракты могут работать с блокчейн-специфическими токенами, такими как ERC-20 для блокчейна Ethereum, стимулируя усилия и перемещая транзакции. Поскольку в этом участвуют код, условия и затраты, вам следует быть осторожным при их чтении, записи и аудите.
Реальное значение смарт-контрактов заключается в их природе и позиционировании. Для данного сценария — скажем, когда лицо A перемещает средства лицу B после завершения B услуги — копия смарт-контракта сохраняется и выполняется узлами блокчейна. Смарт-контракты сохраняются как коды контрактов внутри цепи. Это многоуровневая проверка — это характерная черта блокчейна, обеспечивающая безопасность.
Кроме того, существуют последовательные или синхронные смарт-контракты и асинхронные смарт-контрактыгде задачи выполняются параллельно. Поэтому тип и цель смарт-контракта определяют способ его написания, чтения или даже проверки.
Традиционные контракты, свидетельства о собственности, завещания и т. д. являются частным правом, "разработанным частными лицами, а не политиками или государственными чиновниками". Смарт-контракты представляют собой новую форму такого децентрализованного правоприменения.https://t.co/EU2Y28FznK
— Ник Сзабо (@NickSzabo4) 15 марта 2018 г.
Давайте рассмотрим стандартный пул ликвидности, управляемый смарт-контрактом.
Представьте, что пул токенов можно использовать для торговли, и каждый раз, когда происходит успешная сделка, 0,3% от общей стоимости сделки отправляется поставщику ликвидности, который сделал эту сделку возможной или добавил ликвидность для этого обозначенного объекта торговли. Все условия, выделяющие сценарии сделок, торговые сборы и условия невыполнения и сбоев сделок, закодированы как Смарт-контракт, который хранится в блокчейне в виде кода контракта.
Мы не можем глубоко погрузиться в чтение, запись и аудит контрактов, если мы не знаем их характеристики. Вот стандартные черты смарт-контрактов, о которых стоит знать:
Несколько характеристик стандартного смарт-контракта: BeInCrypto
Смарт-контракты - это просто куски кода. Вы можете написать смарт-контракты для выполнения команд и сценариев на основе определенных условий. Вот почему разработчики и программисты смарт-контрактов в настоящее время востребованы, так как большинство из DeFiпространство уже полагается на смарт-контракты для обработки сложных случаев, таких как обработка торговых сборов в ликвидности пулов, поддержание APYкоэффициенты и многое другое.
Смарт-контракты, находящиеся на блокчейне, исключают вмешательство человека. Это делает их полностью доверительными. Например, если определенный DeFiпротокол, управляемый смарт-контрактом(ами), соглашается ликвидировать ваши активы, как только их стоимость упадет ниже порога, никакое вмешательство человека не может или не должно остановить это. Код обрабатывает платежи, выполнение, управление и соблюдение правил, делая весь пространство полностью децентрализованным.
Как уже упоминалось ранее, смарт-контракты загружены самовыполняющими наборами инструкций. В терминах кодирования это означает наличие итераций и циклов, встроенных в шаблон. Это гарантирует, что задачи, такие как оплата, вывод средств, депозиты, наказание валидаторов через снижение ставок, а также несколько других задач, обрабатываются автономно.
И, наконец, поскольку смарт-контракты защищены с использованием криптографии, их взломать невероятно сложно. Без встроенной уязвимости обойти смарт-контракт означало бы попытаться взломать его на открытом пространстве, перед всем блокчейном.
Транзакции, обработанные с помощью смарт-контрактов, самопроверяемы. Это означает, что выполнение достаточно доказательством того, что транзакция произошла в первую очередь, так как в ней не участвует человеческий элемент. Механизм самопроверки дает смарт-контрактам преимущество перед традиционными контрактами, регулирующими наследственные банковские установки.
Итак, когда вы планируете читать смарт-контракт в следующий раз, убедитесь, что шаблон или документация содержат все упомянутые характеристики.
Упрощенная версия смарт-контрактов: Reddit
Здесь простой смарт-контракт, представляющий собой счет доверительного управления. Пользователи вносят свои средства на счет доверительного управления, который затем переводит их получателю после определенного временного интервала.
/ SPDX-License-Identifier: MITpragma solidity ^0.8.0;// Базовый смарт-контракт Boilerplatecontract SimpleTrustlessEscrow {// Переменные состояния публичного депонента; // Счет депозита etheraddress кредиторской задолженности публичного бенефициара; // Учетная запись получает etheruint256 public releaseTime; // Временная метка для выпуска эфира// События для проверки активности контрактаevent Deposited(адрес с индексом _from, uint256 _value); event Released(address indexed _to, uint256 _value);// Конструктор контракта инициализирует конструктор смарт-контракта(address payable _beneficiary, uint256 _releaseTime) { require(_releaseTime > block.timestamp, "Время релиза должно быть в будущем"); Безопасно и без доверия: Контракт связывает вкладчика и вкладчика-бенефициара = msg.sender; бенефициар = _beneficiary; releaseTime = _releaseTime;}Функция депозита – автономное исполнение (резервная функция)receive() external payable { emit Deposited(msg.sender, msg.value);}Отпустить эфир бенефициаруфункция release() public { // Программируемый: Может быть выполнен только после releaseTime require(block.timestamp >= releaseTime, "Слишком рано выпускать"); Автономный: Автоматически выполняется на основе условия uint256 amount = address(this).balance; beneficiary.transfer(сумма); emit Released(бенефициар, сумма);}}
Хотя мы перейдем к расшифровке и прочтению этого смарт-контракта в деталях, давайте сначала проверим, соответствует ли он упомянутым характеристикам контракта.
Внимательно рассмотрите контракт на этот участок кода:
require(block.timestamp >= releaseTime, "Слишком рано выпускать");
uint256 amount = address(this).balance;
beneficiary.transfer(amount);
Средства должны быть выпущены только тогда, когда выполнено определенное условие releaseTime, делая эти программные контракты исполнимыми.
Здесь есть быстрый фрагмент кода из вышеупомянутого:
depositor = msg.sender;
beneficiary = _beneficiary;
releaseTime = _releaseTime;
В договоре все закодированы, от вкладчика до лица, получающего средства. Никому не нужно взаимодействовать друг с другом или доверять ему, так как функция перевода средств связана параметром releaseTime — на основе кода.
Вот часть кода "выпуска фонда":
функция release() public {require(block.timestamp >= releaseTime, "Слишком рано выпускать"); uint256 сумма = адрес(это).баланс; beneficiary.transfer(сумма); emit Released(бенефициар, сумма);}
Весь процесс автономен, так как средства выпускаются только тогда, когда время выпуска соответствует определенному критерию. Обратите внимание, что код не является частично программируемым, а полностью автономным.
Другие элементы кода смарт-контракта, включая функцию депозита, также могут быть полностью автономными в зависимости от функций, которые вы хотите включить. Например, вы можете запустить план регулярного депозита каждый раз, когда пользователь кошелекпересекает $100, а излишек переходит бенефициару.
Обеспокоен, какой элемент придаетбезопасностьк контракту? Проверьте эту часть кода:
constructor(адрес к оплате _beneficiary, uint256 _releaseTime) {require(_releaseTime > block.timestamp, "Время релиза должно быть в будущем"); депонент = msg.sender; бенефициар = _beneficiary; releaseTime = _releaseTime;}
Обратите внимание на то, что функция releaseTime имеет установленный приоритет по отношению к метке времени. Ничто не случайно, и условия должны быть соблюдены.
Каждая транзакция, связанная со смарт-контрактом, регистрируется в цепочке благодаря отдельным элементам активности журнала.
событие Deposited(address indexed _from, uint256 _value);
event Released(address indexed _to, uint256 _value);
emit Deposited(msg.sender, msg.value);
emit Released(получатель, сумма);
Теперь, когда мы определили элементы, определяющие характеристики смарт-контракта, вот другие элементы контракта, которые помогут вам лучше понять ситуацию.
Pragma solidity ^0.8.0; – Версия языка программирования Solidity, необходимая для написания этого смарт-контракта.
// SPDX-License-Identifier: MIT – Терминированный программный пакет обмена данными, этот идентификатор указывает лицензию на выпуск кода. Рекомендуется включить это, чтобы люди знали, является ли он открытым и можно ли с ним работать или нет.
Contract TimeLock { – Назначает имя смарт-контракту, как ярлык.
Адрес публичного депозитария; - Поскольку контракт включает в себя депозитария и выгодоприобретателя, здесь упоминается публичный адрес депозитария. Эта переменная -Эфириум кошелекадрес и доступен для общего просмотра.
Адрес, доступный для оплаты, публичный бенефициар; – Это общедоступный адрес бенефициара, куда переводятся средства из доверительного фонда. Он также читаем и придает чувство прозрачности смарт-контрактам на базе блокчейна.
Uint256 публичный релизВремя; – Поскольку это контракт с привязкой ко времени, uint256 присваивает контракту переменную, основанную на времени. Это и будут сроки, в соответствии с которыми будут происходить выпуски фондов.
В Solidity uint (unsigned integer) - это способ присвоения целочисленных значений. Суффикс 256 обозначает большое хранилище чисел.
после 5 лет написания смарт-контрактов я только сегодня понял, что логотип solidity - это логотип ethereum, развернутый 🤯pic.twitter.com/wlM369Eff9
— kaden.eth (@0xKaden) 8 июля 2023 года
Вы можете рассматривать прочтение Документация Solidityознакомиться с синтаксисом, выражениями и другими элементами кода.
constructor(address payable _beneficiary, uint256 _releaseTime) { – The “Constructor” is a one-time special function that gets called when the smart contract is deployed. It sets the contract in motion. Notice how at this point, all the address variables that we previously declared are called and initialized.
Receive() external payable { – Это специальная функция, вызываемая при перемещении средств на адрес контракта извне. External предполагает извне, а «Payable» определяет характер перемещения, то есть получение токенов ERC-20.
Function release() public { – Это публичная функция, которая констатирует движение токенов ERC-20 от адреса контракта до бенефициара. Эта функция зависит от releaseTime.
Все эти элементы являются частями гипотетического контракта Эскроу, о котором мы говорили. Убедитесь, что вы изучили весь документ по Solidity, чтобы лучше понять этот язык.
Знайте элементы, прежде чем планировать написание смарт-контрактов: BeInCrypto
К этому моменту у вас должно быть преимущество в чтении и понимании уже написанного смарт-контракта. И многие смарт-контракты, подобные тем, которые мы обсуждали, составляют бэкенд децентрализованного приложения — Блокчейнверсия стандартного мобильного приложения.
Каждая характеристика смарт-контракта, включая безопасность контракта, автономное и программируемое выполнение, доверительность транзакций и многое другое, легко реализуется при разработке децентрализованного приложения. Так что, когда вы следующий раз наталкиваетесь на DApp, обратите внимание, что это приложение смарт-контрактов, запущенное на блокчейне, помогающее вам инициировать множество задач без участия человека. Смарт-контракты составляют логику DApps.
Мы знаем, что Ethereum позволяет вам разрабатывать смарт-контракты, похожие на масштабное программное решение. Однако это не единственный блокчейн-протокол. Если вы хотите погрузиться в мир разработки смарт-контрактов, вам может захотеться посмотреть на другие блокчейны. Разные блокчейны используют разные термины, когда дело касается составления контрактов.
Но сначала давайте обсудимEthereum— платформа по умолчанию для большинства разработчиков смарт-контрактов.
Смарт-контракты на Ethereum написаны на языке программирования Solidity. И интерфейс токена для этой платформы разработки смарт-контрактов - ERC-20.
Вы можете вернуться к смарт-контракту на основе условного депонирования, который мы обсуждали ранее, чтобы увидеть, как пишется стандартный смарт-контракт на основе эфируема.
Даже запуск токена ERC-20 на блокчейне Ethereum - это функция, интенсивно использующая смарт-контракты, о чем мы подробно обсудим при написании смарт-контракта.
Вот как выглядит базовая структура кода, при условии, что мы планируем запустить новую криптовалюту BIC.
Представьте себе гипотетический сценарий. Не совсем запуск BIC криптовалюты.
твердость прагмы ^0.8.0; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract BICToken is ERC20 { constructor(uint256 initialSupply) ERC20("BIC Token", "BIC") { _mint(msg.sender, initialSupply); }}
Мы обсудим каждый элемент этого кода позже, когда будем писать наш смарт-контракт.
Как и на Ethereum, вы можете создавать смарт-контракты на платформах типа Солана, используя Rust и Cardano, используя Plutus, подмножество Haskell — функционального языка программирования.
«У Кардано вообще есть смарт-контракты?»
Шутки за тобой, приятель. #CardanoADA pic.twitter.com/j8SXCu72Sd
— Willybot 🇦🇺 (@wilbot28) 9 июля 2023 года
Вот как выглядит структура кода на Rust (Solana) выглядит так:
Примечание: Это простой контракт, в котором счетчик увеличивается.
использовать anchor_lang::прелюдия::*;declare_id!(“Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS”);#[программа] публичный мод hello_world {использовать супер::*;публичный fn initialize(ctx: Контекст<Инициализировать>) -> РезультатПрограммы { пусть greeting_account = &mut ctx.accounts.greeting_account; greeting_account.counter = 0; Ok(())}публичный fn increment(ctx: Контекст<Увеличить>) -> РезультатПрограммы { пусть greeting_account = &mut ctx.accounts.greeting_account; greeting_account.counter += 1; Ok(())}}
Вы знали? В то время как Rust - это язык программирования для создания смарт-контрактов на основе Solana, Якорьэто фреймворк разработки смарт-контрактов, который используется. Для создания смарт-контрактов с использованием Rust разработчики должны извлечь модули из фреймворка Anchor — что-то вроде первой строки нашего образца кода (use anchor_lang::*;) означает.
Документация по Solanaпоможет вам понять специфический для Rust язык смарт-контрактов.
Точно так же, Cardano следует за Plutus как выбор языка, за которым следует язык Ink!Polkadot, TEAL для Algorand, C# для NEO и другие. Рекомендуется подробно изучить документацию для каждой цепи перед тем, как приступить к написанию совместимого смарт-контракта.
Возможность писать смарт-контракты высоко ценится, но даже умение читать несет в себе свои преимущества:
Теперь, когда прочтение смарт-контрактов позади, давайте сосредоточимся на написании смарт-контрактов. Прежде чем погружаться глубже, необходимо подчеркнуть, что различные блокчейны могут иметь различные стандарты и языки, связанные с разработкой смарт-контрактов. Важно сосредоточиться на стандартах, установленных любым конкретным блокчейном, чтобы начать писать и развертывать контракты.
Большую часть нашего обсуждения мы сосредоточимся на Ethereum как цепочке и Solidity как языке.
Программирование смарт-контракта является самой важной частью цикла разработки. А чтобы заняться разработкой смарт-контрактов на Ethereum или любом другом блокчейне, у вас должен быть некоторый опыт работы с языками программирования, не относящимися к блокчейну, такими как Javascript.
Различные блокчейны и язык для написания смарт-контрактов: BeInCrypto
Возможность программировать смарт-контракт позволяет вам реализовать логику, обеспечить безопасность элементов, оптимизировать код для комиссия за газ, настроить то же самое и даже сделать его взаимодействующим, если необходимо.
Все, кто планирует писать смарт-контракты на Ethereum, должны понимать, что такое Виртуальная машина Ethereum (EVM) и как она работает с смарт-контрактами. Для начала, EVM - это компонент Ethereum, который предоставляет программам изолированную и контролируемую среду для работы. Можно считать это глобальным компьютером, на котором находится весь код контракта на Ethereum. Каждыйузелна сети Ethereum работает EVM.
Если вы стремитесь стать разработчиком смарт-контрактов, вот что вам следует знать относительно смарт-контрактов и EVM.
После того, как вы напишете программу на Solidity, которая является языком высокого уровня, вам нужно скомпилировать ее в байткод - машинно-понятный формат низкого уровня. Этот байткод попадает в блокчейн Ethereum и остается там. Любой, взаимодействующий со смарт-контрактом, должен отправить транзакцию на адрес контракта.
Каждый узел с установленным EVM может видеть эту транзакцию, и как только валидаторы одобряют ее, выполняется код смарт-контракта. Поскольку у каждого узла есть видимость транзакций, ничего нельзя подделать, и код выполняется так, как он был написан. И как только код будет выполнен, состояние блокчейна изменится, сделав процесс от начала до конца и полностью прозрачным.
Для написания смарт-контрактов требуется техническое мастерство. Но это еще не все. Вам также необходимо тщательно понимать, как работает технология блокчейн, какие языковые особенности необходимы для блокчейна, на который вы нацеливаетесь, взаимодействие, и многое другое. Кроме того, вы также должны знать немало о уязвимостях смарт-контрактов — вещи, которых стоит избегать при написании кода. И, наконец, знание тестирования контрактов и развертывания контрактов также обязательно.
Все это может стать подавляющим. Итак, вот небольшой шпаргалка, чтобы начать:
Здесь краткая информация с несколькими советами по написанию лучших смарт-контрактов:
🥧 FREI-PI
‼️ Почему разработчикам смарт-контрактов НУЖНО знать это!
Функция:
– Требования
– Эффекты
– Взаимодействия
Протокол
– Инварианты
Это образец, о котором вам следует думать, когда вы создаете смарт-контракты.
Вот почему 👇
— Патрик Коллинз ( @PatrickAlphaC) 6 июля 2023 года
Пришло время приступить к техническим аспектам разработки смарт-контрактов. Несмотря на то, что сети, такие как Solana и Cardano, позволяют вам разрабатывать смарт-контракты, Ethereum остается самой популярной платформой для разработки смарт-контрактов.
Вы знали? Только в 2022 году на сеть Ethereum было добавлено более 100 000 децентрализованных приложений.
У Ethereum огромное сообщество разработчиков. Любой ваш проект сразу привлечет внимание. Кроме того, его родной язык, Solidity, довольно прост для тех, кто знает Python или JavaScript. Наконец, глобальное программное обеспечение Ethereum, EVM, помогает обеспечивать беспрепятственное выполнение контрактов.
Если вы в большинстве и предпочитаете использовать Ethereum и Solidity, вот краткий список вещей, которые вам нужно отслеживать, прежде чем приступить к разработке смарт-контрактов:
Теперь, когда мы знаем, как происходят вещи на цепочке, давайте погрузимся в написание и развертывание первого смарт-контракта. Несмотря на то, что «Привет, мир!» остаётся первым шагом, мы начнем с создания смарт-контракта для запуска гипотетического токена BIC с 100% разблокированным общим объемом в 1 миллион.
Первый шаг - установить последнюю версию Node.js и NPM или менеджер пакетов Node. Это позаботится о инструментах разработки и локальной среде для разработки. Кроме того, Node.js и NPM позволяют настроить веб-интерфейс для вашего смарт-контракта.
Теперь вам нужно установить IDE для написания кода контракта. Для этого можно быстро установить Visual Studio Code. Или вы можете избавиться от беспорядка и hopна Альхимию — платформу для разработки блокчейна. С помощью Альхимии вы можете получить немного тестовых ETH. Этого хватит на оплату комиссии за газ при развертывании смарт-контракта на тестовой сети Goerli или даже на тестовой сети Sepolia.
Обратите внимание, что Сеполия - моложе тестовой сети и поэтому занимает меньше дискового пространства при развертывании узла.
На данный момент мы будем продолжать использовать тестовую сеть Goerli, так как в ней развернуто большее количество приложений.
С тестовой сетью и готовым фейковым ETH давайте перейдем к написанию смарт-контракта. Вот фрагмент кода для создания токена BIC с фиксированным запасом в 1 миллион.
Примечание: Мы развернем наш смарт-контракт локально на MacOS, а не на тестовой сети. Для развертывания смарт-контрактов на тестовой сети и основной сети у нас будет отдельный раздел, который выходит за рамки данного обсуждения.
Здесь простой фрагмент кода для гипотетического токена:
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract BICToken is ERC20 { constructor() ERC20("BIC Token", "BIC") { _mint(msg.sender, 1000000 * 10 ** decimals()); }}
Если вы знакомы с синтаксисом, вы будете знать, что означает каждый компонент кода. Что касается Openzepplinв части, это библиотека, к которой обращаются при импорте смарт-контрактов ERC-20. Эта библиотека предлагает базовые стандарты функционирования токенов ERC-20.
Функция mint говорит о начальном предложении, которое развертывается по адресу смарт-контракта или msg.sender.
Для настройки этого кода локально и его тестирования нам понадобятся три компонента:
Если вы прошли через детальный процесс написания смарт-контракта, важно знать немного о выполнении контракта. Это процесс, при котором код смарт-контракта выполняется на цепочке узлами.
Именно единообразие, связанное с исполнением контракта, делает смарт-контракты прозрачными и неизменными. Давайте теперь разберемся в этапно-проницательном процессе, связанном с исполнением контракта:
Фрагменты кода, которые мы пишем, должны быть выполнены где-то. В случае смарт-контрактов это место выполнения - блокчейн. Узлы или участники цепи помогают выполнить контракт.
Узлы принимают на себя ответственность за выполнение блоков кода контракта в обмен на цепочку связанных стимулов. Каждая команда или действие, происходящее в цепочке, руководствуется смарт-контрактами.
У каждого смарт-контракта есть определенный адрес. Для выполнения контракта транзакции отправляются на этот адрес контракта. Обратите внимание, что каждый узел запускает EVM, который затем имеет копию кода смарт-контракта, что облегчает проверку подлинности транзакций.
Транзакции, направленные на смарт-контракт, выбираются валидаторами, которые затем включают их в конкретные блоки.
Как только транзакция будет проведена и успешно подтверждена, она станет частью блокчейна. Затем будет вызвана и выполнена функция смарт-контракта, связанная с транзакцией, по всем узлам блокчейна.
Каждый узел, выполняющий смарт-контракт, должен прийти к детерминированному заключению — к одному и тому же результату для одного и того же набора входных данных — что делает характер контрактов полностью доверительным и прозрачным.
Примечание: Любая ошибка, касающаяся выполнения кода или проблем, связанных с комиссией за газ, отменяет транзакции. Это означает, что транзакция, основанная на определенном коде смарт-контракта, прекратит существование. Вот что происходит с флеш-кредитыкогда неспособность придерживаться определенных норм обращает вспять всю сделку, кажется, что средства вообще не двигались с самого начала.
Каждое изменение состояния, связанное с смарт-контрактами, записывается в блокчейне и становится неизменной частью того же.
Теперь, когда вы знаете немного о смарт-контрактах, вот несколько указателей, чтобы начать разработку контракта:
Каждая из упомянутых выше практик помогает оптимизировать код и реализовывать специфические меры безопасности. Однако есть несколько практик, специфичных для контрактов, которые вы должны соблюдать и реализовывать, чтобы обеспечить устойчивость кода. Это поможет сделать код контракта легким и удобным в использовании, чтобы каждый узел, выполняющий одно и то же, не должен был тратить много вычислительной мощности на то же самое.
Несмотря на то, что при написании и разработке смарт-контрактов следует придерживаться лучших практик, необходимо обращать внимание на уязвимости безопасности контрактов при их развертывании на основную сеть.
Каждый смарт-контракт, который присутствует в основной сети, должен быть оценен на производительность кода, безопасность и другие характеристики. Именно здесь аудит — тщательный процесс тестирования контрактов — выходит на первый план, позволяя вам выявить потенциальные уязвимости и слабые места контракта.
Вот краткий контрольный список аудита, с которого можно начать:
Удивительный список проверки аудита смарт-контрактов😈
Не забудьте проверить их при следующей проверке✅
Буду благодарен за ретвит, распространите знание🫡https://t.co/ILx0C67kf8
— cholakov (@cholakovv)7 июля 2023
В то время как чтение и написание смарт-контрактов взаимосвязаны, когда дело доходит до разработки интеллектуальных фрагментов кода, аудит занимает особое место и включает в себя проверку логики в первую очередь. Когда дело доходит до выполнения кода на основе блокчейна, все неизменно, и любая катастрофа может иметь необратимые последствия при выполнении контракта. Именно поэтому необходима тщательная проверка кода контракта и других аспектов с помощью аудита.
Там может быть целая группа уязвимости контрактовкоторые могут выявить детальный аудит смарт-контрактов. Сюда входит проверка на атаки повторного входа, переполнения или недостатки, проблемы, связанные с контролем доступа и многое другое. Как только точная природа проблемы определена, аудитор даже может предложить лучшие практики для ее исправления.
Все еще не уверены, как аудит смарт-контрактов может помочь? Что ж, давайте вернемся к известному DAOвзлом в 2016 году, который использовал проблему реентранси и привел к потере почти 3,6 миллиона ETH. Точно так же произошел взлом контракта кошелька Parity в 2017 году, приведший к потере почти 500 000 ETH. Эти проблемы могли быть избежаны при правильном наборе проверок.
Схема взлома DAO: BeInCrypto
Существует множество стратегий для аудита смарт-контрактов. Некоторые из наиболее популярных включают:
Эти инструменты действуют как первый набор защиты и наиболее эффективно используются для выявления общих уязвимостей. Некоторые из наиболее популярных инструментов включают Securify, Mythril и другие, способные выполнять статический анализ кода, обнаруживать шаблоны нарушений и помогать начать работу над безопасностью.
Инструменты для проверки смарт-контрактов: BeInCrypto
Именно здесь на сцену выходят ручные проверяющие код, тщательно изучая кодовую базу и выявляя сложные уязвимости, если они есть. Ручной обзор может помочь учесть бизнес-логику, контекст и шаблоны использования.
Вот как ручные кодовые обзоры помогают вам обнаружить угрозы:
Небольшая триффа для наших младших аудиторов!
Давайте пойдем и ретвитнем, если вы нашли ошибку!pic.twitter.com/i14YtweXcz
— CharlesPaladin (@PaladinCharles)8 июля 2023 г.
Инструменты, такие как Snyk и GuardRails, помогают автоматическому сканированию контрактов - это реализация безопасности, которая вызывается каждый раз при обновлении кода. Эта форма аудита гарантирует, что новые изменения, внесенные в код, безопасны и не являются вторжением в природу.
Это сложный процесс, который полностью опирается на проверку бизнес-логики кода. Обратите внимание, что формальная верификация на самом деле не предназначена для проверки синтаксиса, а только логики, чтобы убедиться, что код выполняется по желанию.
Помимо упомянутых стратегий, аудит смарт-контрактов также может быть инициирован с использованием обзоров сверстников, программ вознаграждения за находку ошибок и тестового покрытия с использованием инструментов, таких как Solidity Coverage, для максимизации эффективности.
Простой способ проверки смарт-контрактов: BeInCrypto
Если вы новичок в аудите смарт-контрактов, важно отметить, что существует два способа широкого анализа кода и выявления проблем. К ним относятся:
Такой тип анализа кода помогает выявлять основные уязвимости безопасности, ошибки кодирования и другие проблемы в соответствии с заданными стандартами кодирования и соглашениями. Угрозы, такие как вызовы к внешним источникам без проверки, переполнение целочисленных переменных и другие, могут быть выделены с использованием статического анализа. Лучшее в статическом анализе заключается в том, что код не нужно выполнять для его проверки.
Этот подход к аудиту тестов проверяет соответствие кода ЭВМ. Вместо того чтобы просто проверять код, динамический анализ проверяет ответы смарт-контрактов на широкий спектр входных данных. Динамический анализ может выявить проблемы, такие как несогласованное потребление газа и даже ошибочная логика контракта. Личные блокчейн-среды, такие как Ganache, могут работать как платформы динамического анализа, позволяя разработчикам осуществлять транзакции, выполнять команды и делать гораздо больше с их контрактами.
Вот фрагмент смарт-контракта, который работает как хранилище фондов с функцией вывода:
pragma solidity ^0.6.1;contract VulnerableContract { mapping(address => uint256) public balances; function deposit() public payable { balances[msg.sender] += msg.value; } function withdraw(uint256 _amount) public { require(balances[msg.sender] >= _amount, "Недостаточный баланс."); (bool success, ) = msg.sender.call{value: _amount}(""); require(success, "Перевод не удался."); balances[msg.sender] -= _amount; }}
Если вы внимательно посмотрите на код, то увидите ключевую уязвимость:
В предыдущем случае функцию «withdraw» можно вызвать снова, если пользователь, получающий средства, также является смарт-контрактом, хоть и злонамеренным. Поэтому перед выполнением последней функции или обновлением баланса может быть инициирована атака рекурсии для перевода дополнительных средств. Опытные аудиторы выявляют такого рода уязвимость.
Вот исправленный код для того же:
функция вывода(uint256 _amount) общедоступная { требуется(балансы[msg.sender] >= _amount, "Недостаточный баланс."); балансы[msg.sender] -= _amount; (bool успех, ) = msg.sender.call{value: _amount}("");
require(success, “Перевод не удался.”);
Проверьте, как сначала вызывается функция обновления баланса, а затем первое перемещение к пользователю. Именно изменение порядка операций исправляет контракт.
Мир децентрализованных приложений и смарт-контрактов вышел за пределы Ethereum. Несмотря на то, что большая часть действий все еще происходит в экосистеме Ethereum, существуют и другие цепочки, такие как Cardano, Solana и другие, которые поддерживают смарт-контракты и требуют различных стандартов аудита.
Различные блокчейны используют различные языки программирования. Семантика, синтаксис и свойства кода различны, что делает смарт-контракты отзывчивыми на различные практики написания и аудита. Например, Ethereum использует Solidity, в то время как Polkadotиспользует Ink и Rust — что делает его реактивным по отношению к определенным стандартам аудита.
Теперь, если вы хотите перейти к чему-то, отличному от Ethereum, есть несколько специализированных инструментов аудита, с которых можно начать. Например, у Cardano есть набор Marlowe для формальной верификации и аудита. Что касается Solana, Rust-специфические libfuzzer и cargo-fuzz предназначены для аудита и тестирования контрактов. Мультицепной аудитор должен быть знаком с этими концепциями, чтобы держать уязвимости контрактов под контролем.
Повторюсь, вы можете разделить аудит смарт-контрактов на три типа: ручной, автоматический и гибридный. Обратите внимание, что люди предпочитают гибридные стратегии аудита для сложных контрактов с глубокой бизнес-логикой, поскольку они являются наиболее всесторонними.
Организации и частные лица с минимальными знаниями в области программирования часто передают свои требования к написанию и аудиту на аутсорсинг фирмам с хорошей репутацией. Когда дело доходит до аудита, выбор правильной компании становится еще более важным, так как Инструменты искусственного интеллектакакЧатGPTможет помочь написать код смарт-контракта, проверка требует ручного анализа.
Также вот факторы, на которые следует обратить внимание при аутсорсинге задач аудита:
Прежде чем вы остановитесь на подходящей аутсорсинговой фирме, очень важно проверить прошлые аудиты, оценить опыт и даже сосредоточиться на ключевых членах команды.
Перед тем как нанимать, обратите внимание на затраты и услуги, связанные с аудитами. Прежде всего необходимо понять характер предлагаемых услуг — такие как выявление проблем, их решение и другие. Также следует проверить, предоставляются ли повторные аудиты после внедрения первой линии исправлений. Стоимость аудита смарт-контракта может варьироваться в зависимости от услуг, поэтому необходимо отслеживать каждое требование и предложение перед продолжением.
Если вы хотите отказаться от фирмы и проводить аудит смарт-контрактов самостоятельно, вот лучшие стратегии и практики, о которых следует помнить:
Искусственный интеллект действительно упрощает написание смарт-контрактов. Однако, независимо от инноваций в области искусственного интеллекта, возможность проводить аудит смарт-контрактов наилучшим образом по-прежнему требует вмешательства человека. Поэтому, если вы планируете создать свой следующий продукт web3 с акцентом на смарт-контракты и децентрализованные приложения, крайне важно сосредоточиться на лучших ресурсах аудита для ваших смарт-контрактов. В связи с тем, что взломы и взломы криптовалют всплывают с каждым днем, а хакеры планируют новые стратегии для прорыва, аудит контракта до совершенства, безусловно, является одним из наиболее важных современных наборов навыков.