Solidity — это язык программирования для реализации смарт-контрактов [6] [7] на различных блокчейн- платформах, в частности, Ethereum . [8] Solidity лицензирован в соответствии с GNU General Public License v3.0 . [9] Solidity был разработан Гэвином Вудом [10] [ необходим неосновной источник ] и разработан Кристианом Рейтвиснером, Алексом Берегсаси и несколькими бывшими основными участниками Ethereum . [11] Программы на Solidity запускаются на виртуальной машине Ethereum или на совместимых виртуальных машинах. [12]
Solidity был предложен в августе 2014 года Гэвином Вудом [13] [ необходим неосновной источник ] Позднее язык был разработан командой Solidity проекта Ethereum под руководством Кристиана Райтвиснера.
Solidity — основной язык, используемый для разработки смарт-контрактов для Ethereum , а также других частных блокчейнов , таких как ориентированный на предприятия блокчейн Hyperledger Fabric. SWIFT развернул доказательство концепции с использованием Solidity, работающего на Hyperledger Fabric. [14] [15]
Solidity — это статически типизированный язык программирования , предназначенный для разработки смарт-контрактов , работающих на виртуальной машине Ethereum (EVM) или совместимых виртуальных машинах. [16]
Solidity использует синтаксис, подобный ECMAScript , что делает его знакомым для существующих веб-разработчиков; [17] однако, в отличие от ECMAScript, он имеет статическую типизацию и вариативные типы возвращаемых данных. Solidity отличается от других языков, ориентированных на EVM, таких как Serpent и Mutan, в некоторых важных отношениях. Он поддерживает сложные переменные-члены для смарт-контрактов , включая произвольные иерархические отображения и структуры . Смарт-контракты Solidity поддерживают наследование , включая множественное наследование с линеаризацией C3 . Solidity представляет двоичный интерфейс приложения (ABI), который упрощает несколько типобезопасных функций в рамках одного смарт-контракта (это также позже было поддержано Serpent ). Предложение Solidity также включает «Спецификацию естественного языка», систему документирования для указания ориентированных на пользователя описаний разветвлений вызовов методов . [18] [19] [ необходим неосновной источник ]
Пример программы Solidity: [20] [21]
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^ 0.8.4 ; contract Coin { // Ключевое слово "public" делает переменные // доступными из других контрактов address public minter ; mapping ( address => uint ) public balances ; // События позволяют клиентам реагировать на определенные // изменения контракта, которые вы объявляете event Sent ( address from , address to , uint amount ); // Код конструктора запускается только при создании // контракта constructor () { minter = msg.sender ; } // Отправляет сумму вновь созданных монет на адрес // Может быть вызвана только функцией создателя контракта mint ( address receiveer , uint amount ) public { require ( msg.sender == minter ); balances [ receiveer ] += amount ; } // Ошибки позволяют предоставить информацию о // причине сбоя операции. Они возвращаются // вызывающей функции. error InsufficientBalance ( uint asked , uint available ); // Отправляет сумму существующих монет // от любого вызывающего абонента на адрес function send ( address receiveer , uint amount ) public { if ( summation > balances [ msg.sender ]) revert InsufficientBalance ({ requested : amount , available : balances [ msg.sender ] }); балансы [ сообщ.отправитель ] -= сумма ; балансы [ получатель ] += сумма ; отправить Отправлено ( сообщ.отправитель , получатель , сумма ); } }
Solidity доступен на:
Многие свойства безопасности смарт-контрактов изначально трудно поддаются прямому рассуждению, а полнота Тьюринга в Solidity означает, что проверка произвольных свойств не может быть разрешимо автоматизирована. Текущие автоматизированные решения для анализа безопасности смарт-контрактов могут пропускать критические нарушения, давать ложные срабатывания и не обеспечивать достаточного покрытия кода в реалистичных контрактах. [29] Solidity обвиняют в подверженной ошибкам реализации смарт-контрактов Ethereum из-за его контринтуитивной природы, отсутствия конструкций для работы с аспектами, специфичными для домена блокчейна, и отсутствия централизованной документации известных уязвимостей. [30]
В 2016 году исследователь из Корнеллского университета заявил, что Solidity частично виноват во взломе The DAO , который произошел в том году. Он заявил: «на самом деле это не было недостатком или эксплойтом в самом контракте DAO: технически виртуальная машина Ethereum (EVM) работала так, как и предполагалось, но Solidity вносила недостатки безопасности в контракты, которые не только не заметило сообщество, но и не заметили сами разработчики языка». [31]
Сообщество разработчиков часто ссылается на то, что Solidity требует большого количества сторонних интерфейсов и API, а также на его неспособность создавать критически важные информационно-интенсивные смарт-контракты.
Solidity является основным языком программирования для разработки смарт-контрактов на виртуальной машине Ethereum (EVM). [32] Однако Rust стал сильной альтернативой в экосистеме блокчейнов, особенно для блокчейнов, поддерживающих WebAssembly (Wasm) , таких как Polkadot , Klever и Solana .
Rust предлагает встроенные функции безопасности памяти, которые предотвращают распространенные ошибки программирования, такие как разыменование нулевого указателя и переполнение буфера, которые не так строго соблюдаются в Solidity. Это делает контракты Rust потенциально менее подверженными уязвимостям безопасности, которые могут быть использованы в средах смарт-контрактов.
Rust поддерживает параллельное программирование, что позволяет разработчикам писать высокопроизводительный код, который может обрабатывать несколько задач одновременно. Это особенно полезно для высокопроизводительных блокчейнов, таких как Solana, [33], которым необходимо обрабатывать тысячи транзакций в секунду. Solidity, с другой стороны, изначально не поддерживает параллелизм, что может ограничить его производительность в определенных приложениях. [34]
В то время как Solidity глубоко интегрирован с экосистемой Ethereum и ее многочисленными инструментами разработки, [35] Rust универсален и может использоваться на различных блокчейн-платформах, использующих Wasm. Растущая популярность Rust отражается в его принятии новыми блокчейн-проектами, которые отдают приоритет производительности и безопасности.
Различные исходные языки компилируются в семантику EVM, преобладающим из них является Solidity
{{cite journal}}
: CS1 maint: числовые имена: список авторов ( ссылка ){{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка )