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
seletor
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
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.
Assinaturas e seletores de função
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.
Use o seletor
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.
Resumo
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.
Ver original
Esta página pode conter conteúdo de terceiros, que é fornecido apenas para fins informativos (não para representações/garantias) e não deve ser considerada como um endosso de suas opiniões pela Gate nem como aconselhamento financeiro ou profissional. Consulte a Isenção de responsabilidade para obter detalhes.
Introdução ao Solidity|Aula 29: Seletor de Funções
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
seletor
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
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.
Assinaturas e seletores de função
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.
Use o seletor
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.
Resumo
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.