TGViewer
Из Solidity в AI и дальше Из Solidity в AI и дальше @solidityset · 2.49K subscribers
Post #1504 689
Погружение в Core Solidity. Часть 6

Пользовательский ABI-кодировщик в пользовательском пространстве

Рассмотрим, как SAIL можно использовать для реализации высокоуровневых возможностей Core Solidity. Функция abi.encode — сложная и чрезвычайно обобщённая; в классическом Solidity она предоставляется как встроенная в компилятор. Полноценную реализацию этой функции на самом языке Solidity создать невозможно из-за рекурсивной природы спецификации ABI и, как следствие, бесконечного множества выразимых типов. Представленная здесь реализация сравнительно компактна, однако использует некоторые более продвинутые шаблоны и возможности. Мы хотим подчеркнуть, что обычные пользователи Solidity смогут эффективно работать, опираясь на уже имеющиеся знания, и при этом им не придётся сталкиваться с подобными низкоуровневыми внутренними деталями. В то же время мы надеемся, что продвинутые разработчики и авторы библиотек обрадуются новым возможностям, которые открывают эти возможности.

В целях упрощения изложения ограничимся фрагментом, необходимым для кодирования типа uint256.

uint256

Для начала сконструируем тип uint256. В классическом Solidity определение этого типа и всех связанных с ним операций является встроенной языковой конструкцией. В SAIL же этот тип полностью определяется средствами самого языка как простая обёртка над значением типа word. Мы также определяем для него экземпляр Typedef:

data uint256 = uint256(word);

instance uint256:Typedef(word) {
function abs(w : word) -> uint256 {
return uint256(w);
}

function rep(x : uint256) -> word {
match x {
| uint256(w) => return w;
}
}
}


Память и байты

Мы можем создавать типы, представляющие указатели на различные области данных EVM, путём обёртки значения типа word. Обратите внимание, что в приведённом фрагменте параметр типа у указателя memory является фантомным (phantom): он присутствует только в типе, но не упоминается ни в одном конструкторе значений. Такой подход широко используется в языках семейства ML, таких как Haskell или Rust, позволяя обеспечивать ограничения на этапе компиляции без каких-либо накладных расходов во время выполнения.

data memory(T) = memory(word)


Тип bytes в классическом Solidity представляет собой плотно упакованный массив байтов, размер которого известен только во время выполнения. Классический Solidity всегда требует указания области данных для значений типа bytes, поэтому в Core Solidity мы определяем его как пустой тип без конструкторов значений. Пустые типы могут использоваться только для инстанцирования фантомных параметров типов. Это означает, что, как и в классическом Solidity, экземпляры типа bytes не могут находиться в стеке.

data bytes;


Заметьте, что в этой конструкции указателей и областей данных область данных привязана непосредственно к типу (в отличие от классического Solidity, где она привязана к переменной), что позволяет, например, определять структуры в памяти, содержащие ссылки на хранилище (storage).

#core
  • 👍 4
More from @solidityset
  1. Sep 22, 2026Какой язык программирования учить сейчас? На днях в Твиттере увидел небольшой пост о разви…
  2. Sep 18, 2026Интересная модель Jev Буквально пару дней назад в Твиттере многие начали обсуждение новой…
  3. Sep 14, 2026Графы повсюду Если вы также следите за новостями в мире ИИ, то наверняка уже все чаще встр…
  4. Sep 10, 2026GTA6, Cyberleek, блокчейн и безопасность Увидел несколько постов (тут и тут) про Cyberleek…
  5. Sep 9, 2026Работа с чистой энергией Дисклеймер Сегодня ава и название канала, наконец, поменялись. Я…
  6. Sep 9, 2026Channel name was changed to «Из Solidity в AI и дальше»
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →