Digamos que tenemos dos opciones para definir un token como variable de almacenamiento:
un :
address token = 0xc0ffee...;
...
for(...) {
IERC20(token).transfer(...);
}
segundo :
IERC20 token = IERC20(0xc0ffee...);
...
for(...) {
token.transfer(...);
}
De las dos opciones anteriores, ¿cuál sería la opción más eficiente en gas para acceder e interactuar con el contrato de token? ¿Y por qué?
De las dos opciones anteriores, ¿cuál sería la opción más eficiente en gas para acceder e interactuar con el contrato de token? ¿Y por qué?
Son exactamente lo mismo.
No hay diferencia entre address
y cualquier interfaz o contrato para el caso. El verdadero tipo subyacente es siempre la dirección. IERC20
o cualquier otra cosa es solo una forma de interpretar an address
como el identificador de un tipo específico de contrato.
Vea el siguiente ejemplo:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface iToken {
function transfer() external view;
}
contract Token is iToken {
function transfer() public override view {
return;
}
}
contract Test1 {
address token;
constructor(address _token) {
token = _token;
}
function test() public view {
iToken(token).transfer();
}
}
contract Test2 {
iToken token;
constructor(iToken _token) {
token = _token;
}
function test() public view {
token.transfer();
}
}
contract Test3 {
Token token;
constructor(Token _token) {
token = _token;
}
function test() public view {
token.transfer();
}
}
Llamar a la test
función en Test1, Test2 o Test3 cuesta 26277
gas en todos los casos (Remix - configuración predeterminada).
También puede verificar la ranura de almacenamiento 0 de todos los contratos TestX y ver que todos tienen el mismo valor: el address
del contrato Token. No hay diferencia en los niveles inferiores.
Pablo Razvan Berg