
Как смарт-контракты согласуются с технологией блокчейн: BeInCrypto
«Модное слово «web3» подразумевает небрежные привычки программирования веб-страниц с низким уровнем безопасности. Когда криптовалюты или смарт-контракты программируются как веб-страницы, им угрожает провал. Устойчиво успешные блокчейны и их приложения основаны на гораздо более безопасных, осторожных и медленных методах программирования.»
Ник Сабо, криптограф и специалист по информатике: Twitter
Смарт-контракты могут работать с блокчейн-специфическими токенами, такими как ERC-20 для блокчейна Ethereum, стимулируя усилия и перемещая транзакции. Поскольку в этом участвуют код, условия и затраты, вам следует быть осторожным при их чтении, записи и аудите.
Кроме того, существуют последовательные или синхронные смарт-контракты и асинхронные смарт-контрактыгде задачи выполняются параллельно. Поэтому тип и цель смарт-контракта определяют способ его написания, чтения или даже проверки.
Традиционные контракты, свидетельства о собственности, завещания и т. д. являются частным правом, "разработанным частными лицами, а не политиками или государственными чиновниками". Смарт-контракты представляют собой новую форму такого децентрализованного правоприменения.https://t.co/EU2Y28FznK — Ник Сзабо (@NickSzabo4) 15 марта 2018 г.Давайте рассмотрим стандартный пул ликвидности, управляемый смарт-контрактом.
Представьте, что пул токенов можно использовать для торговли, и каждый раз, когда происходит успешная сделка, 0,3% от общей стоимости сделки отправляется поставщику ликвидности, который сделал эту сделку возможной или добавил ликвидность для этого обозначенного объекта торговли. Все условия, выделяющие сценарии сделок, торговые сборы и условия невыполнения и сбоев сделок, закодированы как Смарт-контракт, который хранится в блокчейне в виде кода контракта.

Несколько характеристик стандартного смарт-контракта: BeInCrypto
Итак, когда вы планируете читать смарт-контракт в следующий раз, убедитесь, что шаблон или документация содержат все упомянутые характеристики.
Упрощенная версия смарт-контрактов: 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(бенефициар, сумма);}
Другие элементы кода смарт-контракта, включая функцию депозита, также могут быть полностью автономными в зависимости от функций, которые вы хотите включить. Например, вы можете запустить план регулярного депозита каждый раз, когда пользователь [кошелек](https://beincrypto.com/learn/crypto-wallets/)пересекает $100, а излишек переходит бенефициару.
### Часть "secured"Обеспокоен, какой элемент придает[безопасность](https://beincrypto.com/learn/top10-must-have-cryptocurrency-security-tips/)к контракту? Проверьте эту часть кода:
constructor(адрес к оплате _beneficiary, uint256 _releaseTime) {require(_releaseTime > block.timestamp, "Время релиза должно быть в будущем"); депонент = msg.sender; бенефициар = _beneficiary; 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 { – Назначает имя смарт-контракту, как ярлык.
Адрес публичного депозитария; - Поскольку контракт включает в себя депозитария и выгодоприобретателя, здесь упоминается публичный адрес депозитария. Эта переменная -[Эфириум кошелек](https://beincrypto.com/learn/getting-started-with-ethereum-wallets/)адрес и доступен для общего просмотра.
Адрес, доступный для оплаты, публичный бенефициар; – Это общедоступный адрес бенефициара, куда переводятся средства из доверительного фонда. Он также читаем и придает чувство прозрачности смарт-контрактам на базе блокчейна.
Uint256 публичный релизВремя; – Поскольку это контракт с привязкой ко времени, uint256 присваивает контракту переменную, основанную на времени. Это и будут сроки, в соответствии с которыми будут происходить выпуски фондов.
В Solidity uint (unsigned integer) - это способ присвоения целочисленных значений. Суффикс 256 обозначает большое хранилище чисел.
после 5 лет написания смарт-контрактов я только сегодня понял, что логотип solidity - это логотип ethereum, развернутый 🤯[pic.twitter.com/wlM369Eff9](https://t.co/wlM369Eff9)
— kaden.eth ([@0xKaden](https://github.com/0xKaden)) [8 июля 2023 года](https://twitter.com/0xKaden/status/1677712133646319616?ref_src=twsrc%5Etfw)Вы можете рассматривать прочтение [Документация Solidity](https://docs.soliditylang.org/en/v0.8.20/)ознакомиться с синтаксисом, выражениями и другими элементами кода.
### Другие элементы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
## DApps и смарт-контракты: взаимосвязьК этому моменту у вас должно быть преимущество в чтении и понимании уже написанного смарт-контракта. И многие смарт-контракты, подобные тем, которые мы обсуждали, составляют бэкенд децентрализованного приложения — [Блокчейн](https://beincrypto.com/learn/beginners-guide-to-blockchain/)версия стандартного мобильного приложения.
Каждая характеристика смарт-контракта, включая безопасность контракта, автономное и программируемое выполнение, доверительность транзакций и многое другое, легко реализуется при разработке децентрализованного приложения. Так что, когда вы следующий раз наталкиваетесь на DApp, обратите внимание, что это приложение смарт-контрактов, запущенное на блокчейне, помогающее вам инициировать множество задач без участия человека. Смарт-контракты составляют логику DApps.
## Блокчейны для смарт-контрактовМы знаем, что Ethereum позволяет вам разрабатывать смарт-контракты, похожие на масштабное программное решение. Однако это не единственный блокчейн-протокол. Если вы хотите погрузиться в мир разработки смарт-контрактов, вам может захотеться посмотреть на другие блокчейны. Разные блокчейны используют разные термины, когда дело касается составления контрактов.
Но сначала давайте обсудим[Ethereum](https://beincrypto.com/price/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, вы можете создавать смарт-контракты на платформах типа [Солана](https://beincrypto.com/learn/what-is-solana/), используя Rust и Cardano, используя Plutus, подмножество Haskell — функционального языка программирования.
«У Кардано вообще есть смарт-контракты?»
Шутки за тобой, приятель. [#CardanoADA](https://twitter.com/hashtag/CardanoADA?src=hash&ref_src=twsrc%5Etfw) [pic.twitter.com/j8SXCu72Sd](https://t.co/j8SXCu72Sd)
— Willybot 🇦🇺 ([@wilbot28](https://github.com/wilbot28)) [9 июля 2023 года](https://twitter.com/wilbot28/status/1677951174472007680?ref_src=twsrc%5Etfw)Вот как выглядит структура кода на Rust ([Solana](https://beincrypto.com/learn/what-is-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(())}}
[Документация по Solana](https://docs.solana.com/developing/on-chain-programs/developing-rust)поможет вам понять специфический для Rust язык смарт-контрактов.
Точно так же, Cardano следует за Plutus как выбор языка, за которым следует язык Ink, TEAL для Algorand, C# для NEO и другие. Рекомендуется подробно изучить документацию для каждой цепи перед тем, как приступить к написанию совместимого смарт-контракта.
## Зачем вам нужно учиться читать смарт-контракты?Возможность писать смарт-контракты высоко ценится, но даже умение читать несет в себе свои преимущества:
- Возможность узнать о сложностях автоматизации, связанных с приложениями DeFi.- Анализ стандартов владения, связанных с активом[токенизация](https://beincrypto.com/learn/blockchain-tokenization/).- Понимание того, как [децентрализованные автономные организации (DAOs)](https://beincrypto.com/learn/decentralized-autonomous-organization/)функция.- Понимание и реализация логики, ориентированной на использование случаев, связанных с страхованием, монетизацией контента, [голосование](https://beincrypto.com/learn/how-can-blockchain-be-used-for-voting-in-2020/)система, роялти и другие вертикали.## Как написать смарт-контрактыТеперь, когда прочтение смарт-контрактов позади, давайте сосредоточимся на написании смарт-контрактов. Прежде чем погружаться глубже, необходимо подчеркнуть, что различные блокчейны могут иметь различные стандарты и языки, связанные с разработкой смарт-контрактов. Важно сосредоточиться на стандартах, установленных любым конкретным блокчейном, чтобы начать писать и развертывать контракты.
Большую часть нашего обсуждения мы сосредоточимся на Ethereum как цепочке и Solidity как языке.
### Роль программированияПрограммирование смарт-контракта является самой важной частью цикла разработки. А чтобы заняться разработкой смарт-контрактов на Ethereum или любом другом блокчейне, у вас должен быть некоторый опыт работы с языками программирования, не относящимися к блокчейну, такими как Javascript.

Различные блокчейны и язык для написания смарт-контрактов: BeInCrypto
Возможность программировать смарт-контракт позволяет вам реализовать логику, обеспечить безопасность элементов, оптимизировать код для [комиссия за газ](https://beincrypto.com/learn/ethereum-gas-fees-lowest/), настроить то же самое и даже сделать его взаимодействующим, если необходимо.
#### EVM и смарт-контракты: обзор ситуацииВсе, кто планирует писать смарт-контракты на Ethereum, должны понимать, что такое Виртуальная машина Ethereum (EVM) и как она работает с смарт-контрактами. Для начала, EVM - это компонент Ethereum, который предоставляет программам изолированную и контролируемую среду для работы. Можно считать это глобальным компьютером, на котором находится весь код контракта на Ethereum. Каждый[узел](https://beincrypto.com/learn/what-are-nodes/)на сети Ethereum работает EVM.
Если вы стремитесь стать разработчиком смарт-контрактов, вот что вам следует знать относительно смарт-контрактов и EVM.
После того, как вы напишете программу на Solidity, которая является языком высокого уровня, вам нужно скомпилировать ее в байткод - машинно-понятный формат низкого уровня. Этот байткод попадает в блокчейн Ethereum и остается там. Любой, взаимодействующий со смарт-контрактом, должен отправить транзакцию на адрес контракта.
Каждый узел с установленным EVM может видеть эту транзакцию, и как только валидаторы одобряют ее, выполняется код смарт-контракта. Поскольку у каждого узла есть видимость транзакций, ничего нельзя подделать, и код выполняется так, как он был написан. И как только код будет выполнен, состояние блокчейна изменится, сделав процесс от начала до конца и полностью прозрачным.
## Может ли кто-нибудь написать смарт-контракт?Для написания смарт-контрактов требуется техническое мастерство. Но это еще не все. Вам также необходимо тщательно понимать, как работает технология блокчейн, какие языковые особенности необходимы для блокчейна, на который вы нацеливаетесь, [взаимодействие](https://beincrypto.com/learn/blockchain-interoperability/), и многое другое. Кроме того, вы также должны знать немало о уязвимостях смарт-контрактов — вещи, которых стоит избегать при написании кода. И, наконец, знание тестирования контрактов и развертывания контрактов также обязательно.
Все это может стать подавляющим. Итак, вот небольшой шпаргалка, чтобы начать:
- Начните с выбора платформы или цепочки, с которой вы хотите работать.- Изучите язык программирования, связанный с цепью, например, Solidity для Ethereum.- Изучите использование средств разработки, таких как интегрированная среда разработки, например, Remix.- Начните с написания вашего первого контракта, а затем протестируйте его, используя тестовые сети.- Когда вы удовлетворены элементами кода, вы можете развернуть его на цепочке. Помните, что развертывание контракта на цепочке будет стоить в виде газовых сборов.Здесь краткая информация с несколькими советами по написанию лучших смарт-контрактов:
🥧 FREI-PI
‼️ Почему разработчикам смарт-контрактов НУЖНО знать это!
Функция:
– Требования
– Эффекты
– Взаимодействия
Протокол
– Инварианты
Это образец, о котором вам следует думать, когда вы создаете смарт-контракты.
Вот почему 👇
— Патрик Коллинз ( [@PatrickAlphaC](https://github.com/PatrickAlphaC)) [6 июля 2023 года](https://twitter.com/PatrickAlphaC/status/1676969198663401472?ref_src=twsrc%5Etfw)## Погружение в программированиеПришло время приступить к техническим аспектам разработки смарт-контрактов. Несмотря на то, что сети, такие как Solana и Cardano, позволяют вам разрабатывать смарт-контракты, Ethereum остается самой популярной платформой для разработки смарт-контрактов.
Вы знали? Только в 2022 году на сеть Ethereum было добавлено более 100 000 децентрализованных приложений.
### Почему Ethereum?У Ethereum огромное сообщество разработчиков. Любой ваш проект сразу привлечет внимание. Кроме того, его родной язык, Solidity, довольно прост для тех, кто знает Python или JavaScript. Наконец, глобальное программное обеспечение Ethereum, EVM, помогает обеспечивать беспрепятственное выполнение контрактов.
Если вы в большинстве и предпочитаете использовать Ethereum и Solidity, вот краткий список вещей, которые вам нужно отслеживать, прежде чем приступить к разработке смарт-контрактов:
- Прагмы или версия компилятора- Определение контракта для маркировки- Переменные состояния для хранения данных- События для ведения журнала EVM- Модификаторы для предоставления конкретных прав определенным органам- Функции или активности смарт-контракта в игре- Наследование для взаимодействия- Понимание структур управления, таких как if, else, циклы for, типы данных, такие как строка, целое число и многое другое.## Написание и развертывание первого смарт-контрактаТеперь, когда мы знаем, как происходят вещи на цепочке, давайте погрузимся в написание и развертывание первого смарт-контракта. Несмотря на то, что «Привет, мир!» остаётся первым шагом, мы начнем с создания смарт-контракта для запуска гипотетического токена BIC с 100% разблокированным общим объемом в 1 миллион.
### ОсновыПервый шаг - установить последнюю версию Node.js и NPM или менеджер пакетов Node. Это позаботится о инструментах разработки и локальной среде для разработки. Кроме того, Node.js и NPM позволяют настроить веб-интерфейс для вашего смарт-контракта.
Теперь вам нужно установить IDE для написания кода контракта. Для этого можно быстро установить Visual Studio Code. Или вы можете избавиться от беспорядка и [hop](https://beincrypto.com/learn/hop-protocol/)на Альхимию — платформу для разработки блокчейна. С помощью Альхимии вы можете получить немного тестовых 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()); }}
Функция mint говорит о начальном предложении, которое развертывается по адресу смарт-контракта или msg.sender.
Для настройки этого кода локально и его тестирования нам понадобятся три компонента:
- Node.js и NPM (уже обсуждали): Работает как двигатель для ваших смарт-контрактов- [Truffle](https://beincrypto.com/learn/what-is-ethereum-truffle/): Работает как ящик с инструментами, помогающий вам организовать код, сценарии и другие части контракта- Ganache: Работает как виртуальная, на устройстве площадка. Представьте это как личный блокчейн.### Что такое выполнение контракта?Если вы прошли через детальный процесс написания смарт-контракта, важно знать немного о выполнении контракта. Это процесс, при котором код смарт-контракта выполняется на цепочке узлами.
Именно единообразие, связанное с исполнением контракта, делает смарт-контракты прозрачными и неизменными. Давайте теперь разберемся в этапно-проницательном процессе, связанном с исполнением контракта:
#### Шаг 1Фрагменты кода, которые мы пишем, должны быть выполнены где-то. В случае смарт-контрактов это место выполнения - блокчейн. Узлы или участники цепи помогают выполнить контракт.
#### Шаг 2Узлы принимают на себя ответственность за выполнение блоков кода контракта в обмен на цепочку связанных стимулов. Каждая команда или действие, происходящее в цепочке, руководствуется смарт-контрактами.
#### Шаг 3У каждого смарт-контракта есть определенный адрес. Для выполнения контракта транзакции отправляются на этот адрес контракта. Обратите внимание, что каждый узел запускает EVM, который затем имеет копию кода смарт-контракта, что облегчает проверку подлинности транзакций.
#### Шаг 4Транзакции, направленные на смарт-контракт, выбираются валидаторами, которые затем включают их в конкретные блоки.
#### Шаг 5Как только транзакция будет проведена и успешно подтверждена, она станет частью блокчейна. Затем будет вызвана и выполнена функция смарт-контракта, связанная с транзакцией, по всем узлам блокчейна.
#### Шаг 6Каждый узел, выполняющий смарт-контракт, должен прийти к детерминированному заключению — к одному и тому же результату для одного и того же набора входных данных — что делает характер контрактов полностью доверительным и прозрачным.
Примечание: Любая ошибка, касающаяся выполнения кода или проблем, связанных с комиссией за газ, отменяет транзакции. Это означает, что транзакция, основанная на определенном коде смарт-контракта, прекратит существование. Вот что происходит с [флеш-кредиты](https://beincrypto.com/learn/flash-loan/)когда неспособность придерживаться определенных норм обращает вспять всю сделку, кажется, что средства вообще не двигались с самого начала.
Каждое изменение состояния, связанное с смарт-контрактами, записывается в блокчейне и становится неизменной частью того же.
## Разработка смарт-контрактов и лучшие практикиТеперь, когда вы знаете немного о смарт-контрактах, вот несколько указателей, чтобы начать разработку контракта:
- При написании контрактов рекомендуется полагаться на надежные библиотеки, такие как те, которые представлены в OpenZeppelin, чтобы соблюдать желаемую оптимизацию кода и стандарты безопасности.- Идея заключается в том, чтобы сделать контракт модульным и проще — это облегчит тестирование и рецензирование.- Хорошей идеей является внедрение специфического контроля доступа к контракту. Это означает объявление кодовых фрагментов, где только определенное лицо или сущность может изменять критические характеристики контракта. Контроль доступа упрощает обеспечение безопасности смарт-контрактов.- При написании контракта всегда предусмотрите возможность обработки крайних случаев и исключений — и все это при написании нескольких тестов. ### Забота о устойчивости кодаКаждая из упомянутых выше практик помогает оптимизировать код и реализовывать специфические меры безопасности. Однако есть несколько практик, специфичных для контрактов, которые вы должны соблюдать и реализовывать, чтобы обеспечить устойчивость кода. Это поможет сделать код контракта легким и удобным в использовании, чтобы каждый узел, выполняющий одно и то же, не должен был тратить много вычислительной мощности на то же самое.
- Эффективно управляйте хранилищем, используя более маленькие наборы данных. Например, при написании контракта используйте uint8 в качестве операционного значения вместо uint256.- При написании контракта рекомендуется оптимизировать код, объединяя несколько операций в одну. Мы более подробно рассмотрим это в нашей подробной статье о «написании смарт-контрактов».- Хорошей идеей является использование отложенной оценки в отношении выполнения смарт-контрактов. Таким образом, вам нужно выполнять функцию только тогда, когда это необходимо, а не каждый раз, когда что-то отправляется на адрес смарт-контракта.- Наконец, полагаться на вычисления вне цепи также является хорошим способом сосредоточиться на устойчивости. Это помогает снизить требования к комиссии за газ и даже может ускорить исполнение контракта.Несмотря на то, что при написании и разработке смарт-контрактов следует придерживаться лучших практик, необходимо обращать внимание на уязвимости безопасности контрактов при их развертывании на основную сеть.
## Как проводить аудит смарт-контрактов?Каждый смарт-контракт, который присутствует в основной сети, должен быть оценен на производительность кода, безопасность и другие характеристики. Именно здесь аудит — тщательный процесс тестирования контрактов — выходит на первый план, позволяя вам выявить потенциальные уязвимости и слабые места контракта.
Вот краткий контрольный список аудита, с которого можно начать:
Удивительный список проверки аудита смарт-контрактов😈
Не забудьте проверить их при следующей проверке✅
Буду благодарен за ретвит, распространите знание🫡[https://t.co/ILx0C67kf8](https://t.co/ILx0C67kf8)
— cholakov ([@cholakovv](https://github.com/cholakovv))[7 июля 2023](https://twitter.com/cholakovv/status/1677235477361876992?ref_src=twsrc%5Etfw)### Взаимосвязь между чтением, записью и аудитом: зачем вообще аудитировать смарт-контракты?В то время как чтение и написание смарт-контрактов взаимосвязаны, когда дело доходит до разработки интеллектуальных фрагментов кода, аудит занимает особое место и включает в себя проверку логики в первую очередь. Когда дело доходит до выполнения кода на основе блокчейна, все неизменно, и любая катастрофа может иметь необратимые последствия при выполнении контракта. Именно поэтому необходима тщательная проверка кода контракта и других аспектов с помощью аудита.
### Уязвимости контрактов и исправленияТам может быть целая группа [уязвимости контрактов](https://beincrypto.com/learn/smart-contract-vulnerabilities/)которые могут выявить детальный аудит смарт-контрактов. Сюда входит проверка на атаки повторного входа, переполнения или недостатки, проблемы, связанные с контролем доступа и многое другое. Как только точная природа проблемы определена, аудитор даже может предложить лучшие практики для ее исправления.
### Нарушения проливаются изучения и урокиВсе еще не уверены, как аудит смарт-контрактов может помочь? Что ж, давайте вернемся к известному [DAO](https://beincrypto.com/learn/decentralized-autonomous-organization/)взлом в 2016 году, который использовал проблему реентранси и привел к потере почти 3,6 миллиона ETH. Точно так же произошел взлом контракта кошелька Parity в 2017 году, приведший к потере почти 500 000 ETH. Эти проблемы могли быть избежаны при правильном наборе проверок.

Схема взлома DAO: BeInCrypto## Стратегии аудита смарт-контрактовСуществует множество стратегий для аудита смарт-контрактов. Некоторые из наиболее популярных включают:
### Инструменты аудитаЭти инструменты действуют как первый набор защиты и наиболее эффективно используются для выявления общих уязвимостей. Некоторые из наиболее популярных инструментов включают Securify, Mythril и другие, способные выполнять статический анализ кода, обнаруживать шаблоны нарушений и помогать начать работу над безопасностью.

Инструменты для проверки смарт-контрактов: BeInCrypto
### Просмотр кодаИменно здесь на сцену выходят ручные проверяющие код, тщательно изучая кодовую базу и выявляя сложные уязвимости, если они есть. Ручной обзор может помочь учесть бизнес-логику, контекст и шаблоны использования.
Вот как ручные кодовые обзоры помогают вам обнаружить угрозы:
Небольшая триффа для наших младших аудиторов!
Давайте пойдем и ретвитнем, если вы нашли ошибку
— CharlesPaladin ([@PaladinCharles](https://github.com/PaladinCharles))[8 июля 2023 г.](https://twitter.com/PaladinCharles/status/1677698219923439617?ref_src=twsrc%5Etfw)### Автоматические сканированияИнструменты, такие как 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. Несмотря на то, что большая часть действий все еще происходит в экосистеме Ethereum, существуют и другие цепочки, такие как Cardano, Solana и другие, которые поддерживают смарт-контракты и требуют различных стандартов аудита.
### Почему каждая платформа уникальна?Различные блокчейны используют различные языки программирования. Семантика, синтаксис и свойства кода различны, что делает смарт-контракты отзывчивыми на различные практики написания и аудита. Например, Ethereum использует Solidity, в то время как [Polkadot](https://beincrypto.com/learn/dot-price-prediction/)использует Ink и Rust — что делает его реактивным по отношению к определенным стандартам аудита.
### Инструменты для перехода не на EthereumТеперь, если вы хотите перейти к чему-то, отличному от Ethereum, есть несколько специализированных инструментов аудита, с которых можно начать. Например, у Cardano есть набор Marlowe для формальной верификации и аудита. Что касается Solana, Rust-специфические libfuzzer и cargo-fuzz предназначены для аудита и тестирования контрактов. Мультицепной аудитор должен быть знаком с этими концепциями, чтобы держать уязвимости контрактов под контролем.
## Какие существуют типы аудита смарт-контрактов?Повторюсь, вы можете разделить аудит смарт-контрактов на три типа: ручной, автоматический и гибридный. Обратите внимание, что люди предпочитают гибридные стратегии аудита для сложных контрактов с глубокой бизнес-логикой, поскольку они являются наиболее всесторонними.
### Аутсорсинг ваших аудитовОрганизации и частные лица с минимальными знаниями в области программирования часто передают свои требования к написанию и аудиту на аутсорсинг фирмам с хорошей репутацией. Когда дело доходит до аудита, выбор правильной компании становится еще более важным, так как [Инструменты искусственного интеллекта](https://beincrypto.com/learn/ai-productivity-tools/)как[ЧатGPT](https://beincrypto.com/learn/chatgpt-review/)может помочь написать код смарт-контракта, проверка требует ручного анализа.
Также вот факторы, на которые следует обратить внимание при аутсорсинге задач аудита:
### Выбор правильной фирмыПрежде чем вы остановитесь на подходящей аутсорсинговой фирме, очень важно проверить прошлые аудиты, оценить опыт и даже сосредоточиться на ключевых членах команды.
### Понимание обязанностей, затрат и накладных расходовПеред тем как нанимать, обратите внимание на затраты и услуги, связанные с аудитами. Прежде всего необходимо понять характер предлагаемых услуг — такие как выявление проблем, их решение и другие. Также следует проверить, предоставляются ли повторные аудиты после внедрения первой линии исправлений. Стоимость аудита смарт-контракта может варьироваться в зависимости от услуг, поэтому необходимо отслеживать каждое требование и предложение перед продолжением.
## Лучшие практики аудита смарт-контрактовЕсли вы хотите отказаться от фирмы и проводить аудит смарт-контрактов самостоятельно, вот лучшие стратегии и практики, о которых следует помнить:
- Всегда уделяйте внимание тщательному обзору кода, включая синтаксис и логику- Начните с выявления распространенных уязвимостей с использованием инструментов, таких как Slither, MythX и другие- Просматривайте Реестр классификации уязвимостей смарт-контрактов или SWC, чтобы найти известные уязвимости и проверить их заранее.- Тщательно тестируйте смарт-контракты, включая интеграционные тесты, модульные тесты и многое другое, чтобы провести стресс-тестирование кода в широком диапазоне сценариев.- Важно проверить возможность атаки на повторный вход. Лучший способ борьбы с этим - проверить рекурсивные вызовы, которые хакеры могут сделать до вызова первой функции смарт-контракта.- Сосредоточьтесь на функциях, которые приводят к внешним вызовам. Ошибка в этом отношении может изменить состояние и управление потоком, что не желательно.- Всегда следите за кодовыми фрагментами, указывающими на использование газа. Вы не хотите, чтобы ваш смарт-контракт инициировал взаимодействия, которые являются чрезмерно дорогими.## Разработка смарт-контрактов и искусственный интеллект: будущееИскусственный интеллект действительно упрощает написание смарт-контрактов. Однако, независимо от инноваций в области искусственного интеллекта, возможность проводить аудит смарт-контрактов наилучшим образом по-прежнему требует вмешательства человека. Поэтому, если вы планируете создать свой следующий продукт web3 с акцентом на смарт-контракты и децентрализованные приложения, крайне важно сосредоточиться на лучших ресурсах аудита для ваших смарт-контрактов. В связи с тем, что взломы и взломы криптовалют всплывают с каждым днем, а хакеры планируют новые стратегии для прорыва, аудит контракта до совершенства, безусловно, является одним из наиболее важных современных наборов навыков.
### Отказ от ответственности:- Эта статья воспроизведена с [ [Beincrypto](https://beincrypto.com/learn/write-smart-contracts/)] и авторские права принадлежат оригинальному автору [Ananda Banerjee]. Если есть возражения к воспроизведению, пожалуйста, свяжитесь с командой Gate Learn, и команда обработает это оперативно в соответствии с соответствующими процедурами.- Отказ от ответственности: Взгляды и мнения, высказанные в этой статье, представляют только личное мнение автора и не являются инвестиционной рекомендацией.- Другие языковые версии статьи переведены командой Gate Learn. Без упоминания Gate.com запрещается копировать, распространять или плагиатировать переведенные статьи.





