Что такое calldata?

Что такое calldata? Я узнал, что есть три типа воспоминаний:

  1. Хранилище
  2. объем памяти
  3. Куча

В документации Ethereum говорится, что параметры функции по умолчанию имеют тип памяти.

Однако я также читал статью, в которой говорилось, что аргументы функции хранятся в calldata.

Теперь я не знаю, что такое calldata, может кто-нибудь мне помочь?

Спасибо!

проще говоря, данные вызова — это данные, предоставленные в рамках вызова, сделанного для смарт-контракта. как объяснил @eth, это подпись функции и предоставленные параметры.

Ответы (3)

Вот пример из Что такое ABI и зачем он нужен для взаимодействия с контрактами?

contract Foo {
  function baz(uint32 x, bool y) returns (bool r) { r = x > 32 || y; }
}

Если бы мы хотели вызвать baz()с параметрами 69и true, мы бы передали всего 68 байт, которые можно разбить на:

0xcdcd77c0: идентификатор метода. Это получается как первые 4 байта хэша Keccak-256 формы ASCII подписи baz(uint32,bool). 0x00000000000000000000000000000000000000000000000000000000000000045: первый параметр, значение uint32 69, дополненное до 32 байт. (69 — шестнадцатеричное значение 0x45.) 0x0000000000000000000000000000000000000000000000000000000000000000001: второй параметр — логическое значение true, дополненное до 32 байт.

68 байт это calldata: 0xcdcd77c000000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000001.

Я хотел бы оставить комментарий для тех, кто, как и я, сначала был сбит с толку: дополненные значения могут быть перенесены из-за вашего разрешения экрана, значения (как было объяснено), поэтому конкатенация 0xcdcd77c0 , 0x00... .0045, 0x00........01

calldataздесь хранятся данные внешних вызовов функций.

Функции можно вызывать внутри, например, из контракта, или извне. Когда видимость функции равна external, только внешние контракты могут вызывать эту функцию.

Когда происходит такой внешний вызов, данные этого вызова сохраняются в файле calldata.

Читайте также здесь: «Внешние» и «общедоступные» лучшие практики

Внешние вызовы функций! Я должен знать, что мы можем вызывать функцию, но эта терминология мне непонятна.
Не могли бы вы объяснить немного
Я отредактировал ответ, чтобы включить дополнительную информацию

Это Calldataдоступное только для чтения пространство с байтовой адресацией, в котором хранится параметр данных транзакции или вызова. В отличие от стека, чтобы использовать эти данные, вы должны указать точное смещение в байтах и ​​количество байтов, которые вы хотите прочитать. Коды операций, связанные с Calldata, предоставляемые EVM:

• CALLDATASIZE возвращает размер данных транзакции.

• CALLDATALOAD импортирует 32 байта данных транзакции в стек.

• CALLDATACOPY копирует транзакционные данные определенного количества байтов в память

calldataведет себя примерно так memory. Это неизменяемая и временная область, которую можно использовать для хранения аргументов функции. Поскольку копирование между памятью и хранилищем может быть довольно дорогим, указание местоположения может иногда быть полезным для контроля расхода газа.