Recentemente, tenho reaprendido a solidez, consolidado os detalhes e escrito uma “Cartilha Minimalista de Solidez” para iniciantes usarem (os caras da programação podem encontrar outro tutorial), atualizada 1-3 vezes por semana.
Todos os códigos e tutoriais são de código aberto no github:github.com/AmazingAng/WTFSolidity
Quando chamamos uma função de um contrato inteligente, os primeiros 4 bytes do bytecode enviado são o seletor. Nesta palestra, abordaremos o que é um seletor e como usá-lo.
msg.data é uma variável global no Solidity com o valor de calldata completo (o bytecode que chama a função).
No código a seguir, podemos usar o evento Log para gerar os dados de chamada que chamam a função hortelã:
Quando o parâmetro é 0x2c44b726ADF1963cA47Af88B284C06f30380fC78, os dados de chamada de saída são
Este bytecode confuso pode ser dividido em duas partes:
Na verdade, calldata diz ao contrato inteligente qual função eu quero chamar e quais são os parâmetros.
Um seletor é definido como os primeiros 4 bytes do hash da assinatura da função, então o que é uma assinatura de função?
Na verdade, na Aula 21, introduzimos brevemente a assinatura da função, que é “nome da função (tipo de parâmetro separado por vírgula)”. Por exemplo, a assinatura da função para casa da moeda no código acima é “casa da moeda (endereço)”. Em contratos inteligentes, diferentes funções têm assinaturas de função diferentes, para que possamos determinar qual função chamar através da assinatura de função.
Observe que na assinatura da função, uint e int devem ser escritos como uint256 e int256.
Vamos escrever uma função para verificar se o seletor da função hortelã está 0x6a627842. Você pode executar a seguinte função e ver o resultado.
Podemos usar o seletor para chamar a função de destino. Por exemplo, se eu quiser chamar a função hortelã, eu só preciso usar abi.encodeWithSelector para codificar o seletor e os parâmetros da função hortelã e passá-la para a função de chamada:
No log, podemos ver que a função hortelã é chamada com êxito e o evento Log é saída.
Nesta palestra, apresentamos o que é um seletor de função, como ele se relaciona com msg.data, assinaturas de função e como usá-lo para chamar uma função objetiva.