Номер cip: 90
Название: Новое пространство, полностью совместимое с EVM (A Space Fully EVM compatible)
Авторы: Фан Лонг (Fan Long) [email protected] Ченьсин Ли (Chenxing Li) [email protected]
Статус: Черновик
Кратное описание
Этот CIP направлен на внедрение нового полностью совместимого с EVM пространства. Новое пространство будет называться “Пространство EVM” (EVM Space), а текущее пространство назовем “Нативным пространством” (Native Space). “Пространство EVM” наследует правила существующие в EVM и поддерживает ETH rpc методы, такие как “eth_getBalance”, поэтому инструменты из ethereum economics можно использовать напрямую в сети Conflux.
Учетные записи из двух пространств разделены между собой. Учетная запись из нативного пространства может взаимодействовать только с другими учетными записями нативного пространства с использованием транзакций типа conflux. Учетная запись пространства EVM может взаимодействовать только с другими учетными записями EVM пространства с использованием только транзакций типа Ethereum EIP-155. Будет создан новый специальный внутренний контракт для обмена между учетными записями из разных пространств. В отличие от кросс-чейн операций, “кросс-пространственные” операции являются атомарными и имеют 1 уровень безопасности.
Мотивация
У Conflux есть схожая с EVM виртуальная машина. Однако, между ними существуют некоторые различия. Conflux имеет другой формат транзакций и использует другое правило для генерации адресов из открытых ключей. Это препятствует переносу приложений, совместимых с EVM, на Conflux. Предыдущие CAP-72 и CIP-80 пытались решить эту проблему, но они оказывали влияние на уже существующие приложения. Данный CIP позволяет решить эту проблему созданием нового пространство, полностью совместимого с EVM, без внесения изменений в существующие учетные записи и транзакции.
Спецификация
Адреса
На уровне пользователя в нативном пространстве по-прежнему используется адрес формата base32 (“cfx:aa…”), а в пространстве EVM используется адрес шестнадцатеричной контрольной суммы (0xaAD8…). На системном уровне как нативное пространство, так и пространство EVM имеют адрес состоящий из 160 бит, но одинаковый адрес в двух разных пространствах - это две разные учетные записи. Их балансы и порядковые номера транзакций будут учитываться отдельно.
storage key
Conflux использует Delta MPT в качестве базовой структуры аутентифицированных данных для хранения ключей сопоставления. Delta MPT предоставляет интерфейс ключ-значение для виртуальной машины.
При вычислении storage key для учетных записей в пространстве EVM мы вычисляем storage key для учетной записи с тем же адресом в нативном пространстве и вставляем байт 0x81
в позицию 20 (индекс начинается с 0).
При вычислении “delta set storage key” (подробнее см. раздел 3.2.2) для учетных записей в пространстве EVM мы вычисляем storage key для учетной записи с тем же адресом в нативном пространстве и вставляем байт 0x81
в позицию 32 (индекс начинается с 0).
Виртуальная машина
-
Поддержка предварительно скомпилированных контрактов на Ethereum с адреса "0x00…01` до адреса “0x00…08”.
-
Код операции
NUMBER
вернет номер эпохи. -
- Код операции
BLOCKHASH
может принимать толькоNUMBER-1
в качестве входных данных. (В отличие от Ethereum, который принимает любое целое число отNUMBER-256
доNUMBER-1
в качестве входных данных)
- Код операции
-
- Нет возврата газа в коде операции
SSTORE
и коде операцииSUICIDE
.
- Нет возврата газа в коде операции
-
- Разные затраты на газ при изменении storage entry с нуля на ненулевое значение с использованием кода операции
SSTORE
. (Решение по данному изменению пока не принято)
- Разные затраты на газ при изменении storage entry с нуля на ненулевое значение с использованием кода операции
Кросс-пространственные операции
Сопоставленный аккаунтов
Каждая учетная запись в нативном пространстве имеет сопоставленную учетную запись из пространства EVM. Адрес сопоставленной учетной записи - это последние 160 бит хэш-функции keccak от исходной учетной записи. С учетом предположения о безопасности хэш-функции keccak сопоставленный адрес никогда не будет пересекаться с адресами, сгенерированными в сети Ethereum. Учетная запись из нативного пространства может вывести остаток средств с сопоставленной учетной записи.
Внутренний контракт
Новый внутренний контракт будет назваться CrossSpace
и будет развернут по адресу 0x088800000000000000000000000000000006
. Пользователь/контракт из нативного пространства может взаимодействовать с учетными записями в пространстве EVM и обрабатывать возвращаемое значение в одной и той же транзакции. Таким образом, операции между пространствами могут быть атомарными.
При совершении межпространственного вызова может быть использовано только 1/20 доступного газа в пространстве EVM. Это направлено на ограничение использования газа при межпространственном вызове. (Решение по данному изменению пока не принято)
Код контракта:
pragma solidity >=0.5.0;
interface CrossSpace {
event Call(bytes20 indexed sender, bytes20 indexed receiver, uint256 value, uint256 nonce, bytes data);
event Create(bytes20 indexed sender, bytes20 indexed contract_address, uint256 value, uint256 nonce, bytes init);
event Withdraw(bytes20 indexed sender, address indexed receiver, uint256 value); function createEVM(bytes calldata init) external payable returns (bytes20);
function create2EVM(bytes calldata init, bytes32 salt) external payable returns (bytes20);
function transferEVM(bytes20 to) external payable returns (bytes memory output); function callEVM(bytes20 to, bytes calldata data) external payable returns (bytes memory output);
function staticCallEVM(bytes20 to, bytes calldata data) external view returns (bytes memory output);
function withdrawFromMapped(uint256 value) external; f
unction mappedBalance(address addr) external view returns (uint256); f
unction mappedNonce(address addr) external view returns (uint256);}
Лимит газа
Только блок, высота блока которого кратна 10, может упаковать транзакцию типа Ethereum. Общий лимит газа в этих транзакциях не может превышать половины лимита газа в блоке
О storage key
В текущей реализации 21-й байт закодированного storage key является допустимым символом ascii. Таким образом, установка старшего бита 21-го байта в значение 1 позволяет отличать новые storage key от существующих.
Об интерфейсе внутренних контрактов
Во внутренних контрактах для указания адреса в пространстве EVM используется тип bytes20
. Поскольку адрес пространства EVM может быть недействительным в пространстве Conflux и отклоняться некоторыми интерфейсами в RPC.
Оригинал статьи: https://github.com/Conflux-Chain/CIPs/commit/af30a70a98ee87e1ec4006377b19399c64cd536b