Почему не все контракты составлены?

Есть много предложений по добавлению предварительно скомпилированных контрактов по разным причинам. Однако я не понимаю, почему предварительно скомпилированный контракт будет более эффективным, чем реальный контракт. Если это так, не означает ли это, что EVM недостаточно оптимизирован? Что мешает Эфириуму составлять каждый контракт; возможно, используя LLVM?

Ответы (2)

Предварительно скомпилированный контракт, как я понимаю, фактически субсидируется протоколом . То есть, пока технически по заданному адресу есть код, цена на газ гораздо меньше, чем если бы он запускался вручную. Если я правильно понимаю желтую бумагу, ECDSARECOVER стоит всего 3000 газа.

Это работает, потому что более эффективный внешний код может быть написан для различных реализаций (если он еще не существует), а затем просто подключен при запуске контракта. Но это не обязательно относится к случайному контракту вне блокчейна.

Я считаю, что у geth есть ограниченный JIT-компилятор для смарт-контрактов, что приводит к другой проблеме при компиляции каждого контракта: пробелу. Места для кэширования скомпилированных контрактов не так много, особенно с учетом потенциальных злоумышленников. В настоящее время geth, по-видимому, ограничивает его до 64 контрактов по умолчанию, и я слышал серьезное обсуждение алгоритмов (не обязательно связанных с geth), чтобы выбрать, какие из них.

Устойчивы ли контракты предварительной компиляции к декомпиляции, скажем, из Porosity github.com/comaeio/porosity ?
Я не уверен, на каком языке написаны прекомпиляторы (возможно, LLL?), но они с открытым исходным кодом. Кроме того, только самая наивная реализация фактически выполнила бы код, если бы там была ошибка, а не просто использовала бы уже существующий код вне EVM.

Ответ Мэтью правильный. Однако я добавлю, что одна из целей Ethereum 2.0 — избавиться от этих предварительно скомпилированных контрактов. Поскольку они должны быть реализованы всеми клиентами, велик риск столкнуться с проблемами сегментации. Этот риск снижается за счет того, что количество предварительно скомпилированных контрактов остается крайне небольшим (4 на данный момент; еще 4 в грядущем январском обновлении IIRC).

Предварительно скомпилированных контрактов можно избежать, если контракты в цепочке реализуют их или вызывают контракты в библиотеке в цепочке, которые их реализуют. Я считаю, что это одна из многих целей разработки — переход от устаревшего кода EVM к eWASM, который будет иметь достаточно быструю виртуальную машину для поддержки этой функции.