¿Qué es calldata? Aprendí que hay tres tipos de recuerdos:
En los documentos de Ethereum, dice que los parámetros de la función son de tipo memoria por defecto.
Sin embargo, también leí un artículo que decía que los argumentos de función se almacenan en calldata.
Ahora, no sé qué es calldata, ¿alguien puede ayudarme?
¡Gracias!
Aquí hay un ejemplo de ¿Qué es una ABI y por qué es necesaria para interactuar con los contratos?
contract Foo {
function baz(uint32 x, bool y) returns (bool r) { r = x > 32 || y; }
}
Si quisiéramos llamar baz()
con los parámetros 69
y true
, pasaríamos 68 bytes en total, que se pueden descomponer en:
0xcdcd77c0: el ID del método. Esto se deriva como los primeros 4 bytes del hash Keccak-256 de la forma ASCII de la firma baz(uint32,bool). 0x00000000000000000000000000000000000000000000000000000000000000045: el primer parámetro, un valor uint32 69 rellenado a 32 bytes. (69 es 0x45 hexadecimal.) 0x00000000000000000000000000000000000000000000000000000000000000001: el segundo parámetro - booleano verdadero, rellenado a 32 bytes
Los 68 bytes son los calldata
: 0xcdcd77c000000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000001
.
calldata
es donde se almacenan los datos de las llamadas externas a las funciones.
Las funciones se pueden llamar internamente, por ejemplo, desde dentro del contrato, o externamente. Cuando la visibilidad de una función es external
, solo los contratos externos pueden llamar a esa función.
Cuando ocurre una llamada externa de este tipo, los datos de esa llamada se almacenan en calldata
.
Lea también aquí: Mejores prácticas `externas` vs `públicas`
El Calldata
es un espacio direccionable por bytes de solo lectura donde se guarda el parámetro de datos de una transacción o llamada. A diferencia de Stack, para usar estos datos, debe especificar un desplazamiento de bytes exacto y la cantidad de bytes que desea leer. Los códigos de operación relacionados con Calldata proporcionados por EVM son:
• CALLDATASIZE devuelve el tamaño de los datos de transacción
• CALLDATALOAD importa 32 bytes de datos de transacciones en la pila
• CALLDATACOPY copia datos de transacciones de un cierto número de bytes a la memoria
calldata
se comporta casi como memory
. Es un área no modificable y temporal que se puede usar para almacenar argumentos de funciones. Dado que la copia entre la memoria y el almacenamiento puede ser bastante costosa, especificar una ubicación puede ser útil para controlar el gasto de gas en ocasiones.
Badr Bellaj