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
Os desenvolvedores escrevem contratos inteligentes para invocar outros contratos, o que permite que programas na rede Ethereum sejam reutilizados, construindo assim um ecossistema próspero. Muitos projetos web3 dependem da invocação de outros contratos, como a agricultura de rendimento. Nesta palestra, mostraremos como chamar a função do contrato de destino quando o código do contrato (ou interface) e o endereço são conhecidos.
Vamos começar escrevendo um contrato simples, OtherContract, para chamá-lo.
Este contrato contém uma variável de estado x, um log de eventos que é acionado quando o ETH é recebido e três funções:
getBalance(): Devolve o saldo ETH do contrato.
setX(): função externa a pagar, que pode definir o valor de x e enviar ETH para o contrato.
getX(): Lê o valor de x.
Podemos criar uma referência ao contrato usando o endereço do contrato e o código do contrato (ou interface): _Name(_Address), onde _Name é o nome do contrato e _Address é o endereço do contrato. Em seguida, chame sua função com uma referência ao contrato: _Name(_Address).f(), onde f() é a função a ser chamada.
Aqui estão 4 exemplos de invocar contratos:
Podemos passar o endereço do contrato de destino para a função, gerar uma referência ao contrato de destino e, em seguida, chamar a função de destino. Por exemplo, escrevemos uma função callSetX no novo contrato, passando o endereço do contrato OtherContract implantado _Address e o parâmetro x do setX:
Podemos passar diretamente a referência de contrato na função, e só precisamos alterar o tipo de endereço do parâmetro acima para o nome do contrato de destino, que é melhor do que OtherContract. O exemplo a seguir implementa a função getX() que chama o contrato de destino.
Podemos criar uma variável de contrato e, em seguida, usá-la para chamar a função objetiva. No exemplo a seguir, armazenamos uma referência ao contrato OtherContract para a variável oc:
Se a função do contrato alvo for pagável, então podemos transferir dinheiro para o contrato chamando-o: _Name(_Address).f{value: _Value}(), onde _Name é o nome do contrato, _Address é o endereço do contrato, f é o nome da função objetiva e _Value é a quantidade de ETH a ser transferida (em wei).
A função setX do contrato OtherContract é pagável e, no exemplo a seguir, transferimos dinheiro de e para o contrato de destino chamando setX.
Após a transferência, podemos observar a alteração do saldo ETH do contrato alvo através do evento Log e da função getBalance().
Nesta palestra, mostraremos como criar uma referência ao contrato através do código do contrato de destino (ou interface) e endereço, de modo a chamar as funções do contrato de destino.