Saltar al contenido principal

Resumen

Los contratos se invocan a través de un par de funciones de host call y try_call:

  • try_call(contract, function, args) llama a function exportada del contract, pasando args y devolviendo un Status en caso de error.
  • call(contract, function, args) solo llama a try_call con sus argumentos y captura el Status, esencialmente propagando el error.

En ambos casos, contract es un objeto de host Binary que contiene el ID del contrato, function es un Symbol que sostiene el nombre de una función exportada para llamar, y args es un Vector de valores a pasar como argumentos.

Estas funciones de host se pueden invocar de dos maneras separadas:

  • Desde fuera del host, como cuando un usuario envía una transacción que llama a un contrato.
  • Desde dentro del host, cuando un contrato llama a otro.

Ambos casos siguen la misma lógica:

  • El bytecode Wasm del contrato se recupera de una entrada de CONTRACT_DATA en el ledger del sistema de almacenamiento del host.
  • Una VM Wasm se instancia durante la duración de la invocación.
  • La función se busca e invoca, con argumentos pasados del llamador al llamado.

Cuando ocurre una llamada desde fuera del host, los argumentos típicamente se proporcionan en forma serializada XDR que acompaña la transacción, y se deserializan y convierten automáticamente en objetos de host antes de invocar el contrato.

Cuando ocurre una llamada desde dentro del host, los contratos llamador y llamado comparten el mismo host y el llamador puede pasar referencias a objetos de host directamente al llamado sin necesidad de serializarlos o deserializarlos.

Dado que los objetos de host son inmutables, hay un riesgo limitado de pasar una referencia compartida de un contrato a otro: el llamado no puede modificar el objeto de una manera que sorprenda al llamador, solo crear nuevos objetos.