Что такое calldata? Я узнал, что есть три типа воспоминаний:
В документации Ethereum говорится, что параметры функции по умолчанию имеют тип памяти.
Однако я также читал статью, в которой говорилось, что аргументы функции хранятся в calldata.
Теперь я не знаю, что такое calldata, может кто-нибудь мне помочь?
Спасибо!
Вот пример из Что такое 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
.
calldata
здесь хранятся данные внешних вызовов функций.
Функции можно вызывать внутри, например, из контракта, или извне. Когда видимость функции равна external
, только внешние контракты могут вызывать эту функцию.
Когда происходит такой внешний вызов, данные этого вызова сохраняются в файле calldata
.
Читайте также здесь: «Внешние» и «общедоступные» лучшие практики
Это Calldata
доступное только для чтения пространство с байтовой адресацией, в котором хранится параметр данных транзакции или вызова. В отличие от стека, чтобы использовать эти данные, вы должны указать точное смещение в байтах и количество байтов, которые вы хотите прочитать. Коды операций, связанные с Calldata, предоставляемые EVM:
• CALLDATASIZE возвращает размер данных транзакции.
• CALLDATALOAD импортирует 32 байта данных транзакции в стек.
• CALLDATACOPY копирует транзакционные данные определенного количества байтов в память
calldata
ведет себя примерно так memory
. Это неизменяемая и временная область, которую можно использовать для хранения аргументов функции. Поскольку копирование между памятью и хранилищем может быть довольно дорогим, указание местоположения может иногда быть полезным для контроля расхода газа.
Бадр Беллай