Codificação de ABI
Similar a abi.encode, mas codifica os argumentos de uma maneira mais compacta, sem preenchimento, o que pode ser útil para certas operações criptográficas. No entanto, a falta de preenchimento pode levar a ambiguidades em certas situações, portanto, deve ser usado com cautela.
Exemplo:
abi.encodeWithSelector(bytes4 selector, ...) returns (bytes memory)
Uso: Codifica os argumentos fornecidos com um seletor de função específico. Útil para chamadas de funções em contratos externos quando o seletor da função é conhecido.
Exemplo:
O seletor de função é essencialmente a assinatura da função codificada em 4 bytes. Essa funcionalidade é particularmente útil ao fazer chamadas de baixo nível ou ao interagir com contratos cujas interfaces podem não estar totalmente definidas no momento da compilação.
Vamos incluir um exemplo de como usar abi.encodeWithSelector
em Solidity para preparar dados para uma chamada de contrato de baixo nível:
Neste exemplo:
Receiver: É um contrato que possui uma função
receiveValue
, que emite um evento quando chamada. Essa função pode conter qualquer lógica que você deseja invocar em outro contrato.Caller: É um contrato que realiza uma chamada ao contrato
Receiver
. Ele usaabi.encodeWithSelector
para preparar os dados da chamada. Isso inclui o seletor da função, que identifica qual função chamar no contratoReceiver
, e os argumentos para essa função.bytes4 selector = bytes4(keccak256("receiveValue(uint256)"));
calcula o seletor da função com base na sua assinatura. A assinatura é simplesmente o nome da função seguido dos tipos de seus parâmetros entre parênteses, codificado em 4 bytes.abi.encodeWithSelector(selector, _value)
codifica esses dados em um formato que o contratoReceiver
pode decodificar e executar.
abi.encodeWithSignature(string memory signature, ...) returns (bytes memory)
Similar a abi.encodeWithSelector
, mas em vez de fornecer o seletor de função como um valor bytes4
, a assinatura da função é fornecida como uma string. O Solidity calcula o seletor de função correspondente.
Exemplo:
Neste exemplo, functionName(uint256,address)
é a assinatura da função.
abi.decode(bytes memory data, (type1, type2, ...)) returns (type1, type2, ...)
Decodifica os dados codificados de acordo com as regras ABI nos tipos especificados. É útil para interpretar os dados de saída de chamadas de funções de baixo nível ou respostas de chamadas a outros contratos.
Exemplo:
Last updated