Балансы EVM

Модуль «EVM» в Substrate обеспечивает поддержку выполнения контрактов Ethereum в цепочке Substrate. Чтобы выполнять какие-либо действия, связанные с газом или балансом на EVM, на вызывающем счете должен быть баланс. Как работают эти балансы?

Преобразование баланса

Чтобы использовать контракты Ethereum в цепочке Substrate, цепочка должна иметь протокол, поддерживающий следующие предположения:

  1. (32-байтовый) адрес субстрата должен иметь соответствующий (20-байтовый) адрес Ethereum.
  2. Каждый (20-байтовый) адрес Ethereum должен иметь свой баланс.

Модуль EVM выполняет шаг 1, просто усекая исходный адрес субстрата в адрес Ethereum, взяв первые 20 байтов. Чтобы выполнить шаг 2, цепочка использует ранее существовавший модуль балансов Substrate для управления каждым адресом Ethereum путем преобразования адресов Ethereum обратно в «адреса EVM», которые представляют собой 32-байтовые адреса Substrate. Обратите внимание, что эти адреса EVM не имеют внутренней связи с исходным усеченным адресом субстрата.

Возьмем пример:

Обратите внимание, что эти действия необратимы: мы не можем преобразовать адрес EVM обратно в его адрес Ethereum, а также мы не можем преобразовать адрес Ethereum обратно в его «исходный» адрес субстрата.

Управление балансами Ethereum на Substrate

Возможны две операции: мы можем «внести» средства с учетной записи Substrate на соответствующую учетную запись Ethereum, и мы можем «снять» средства со учетной записи Ethereum обратно на исходную учетную запись Substrate.

Депозиты

Поскольку адрес EVM, поддерживающий адрес Ethereum, вычисляется детерминировано, как указано выше, мы можем выполнить стандартный перевод баланса с нашей исходной учетной записи Substrate на адрес EVM, чтобы пополнить счет Ethereum средствами.

Это можно выполнить, вызвав balances::transfer(prefixAndHash(truncate(account)).signAndSend(account), где account — исходная учетная запись субстрата, truncate берет первые 20 байтов в качестве адреса Ethereum, а prefixAndHash применяет префикс evm: и берет хэш as для преобразования обратно в 32-байтовый адрес субстрата.

Снятие

Поскольку адрес EVM вычисляется детерминистически, у нас нет для него приватного ключа, поэтому мы не можем выполнить перенос баланса с него обычными способами. В результате модуль EVM предоставляет специальную функцию «вывод» для перевода средств обратно с учетной записи Ethereum на исходную учетную запись Substrate.

Это можно выполнить, вызвав evm::withdraw(truncate(account), value).signAndSend(account), где account— исходная учетная запись Substrate, аtruncate` берет первые 20 байтов в качестве адреса Ethereum.

Балансы Эфириума

Балансы Ethereum обрабатываются так, как если бы они работали в любой цепочке Ethereum: газ вычитается из баланса (количество использованного газа можно узнать из квитанции транзакции, возвращаемой модулем EVM через web3 или truffle), а переводы работают как ожидал.

Баланс 20-байтового адреса Ethereum и 32-байтового адреса EVM должен быть идентичен при сравнении: web3.eth.getBalance(ethAddress) должен равняться system::balances(prefixAndHash(ethAddress)).freeBalance, где ethAddress — это 20-байтовый адрес Ethereum, а prefixAndHash применяет префикс evm: и берет хеш, как описано выше.

Обратите внимание, что коэффициент преобразования газа EVM в токены субстрата определяется в среде выполнения субстрата как «FeeCalculator», который в случае Edgeware настроен на сопоставление токена wei-to-Substrate 1-к-1.

При преобразовании также обратите внимание, что в вызове EVM указывается gasPrice, как коэффициент преобразования из поля gasUsed в квитанции в wei.

(ниже оригинальная техническая запись)

Адреса:

Балансы:

Gas: