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 afunction
exportada delcontract
, pasandoargs
y devolviendo unStatus
en caso de error.call(contract, function, args)
solo llama atry_call
con sus argumentos y captura elStatus
, 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.