Resumen
Los contratos se invocan mediante un par de funciones host call
y try_call
:
try_call(contract, function, args)
llama a lafunction
exportada desde elcontract
, pasandoargs
y devolviendo unError
en caso de cualquier error.call(contract, function, args)
simplemente llama atry_call
con sus argumentos y atrapa elError
, propagando esencialmente el error.
En ambos casos, contract
es un objeto host Binary
que contiene el ID del contrato, function
es un Symbol
que guarda el nombre de una función exportada a llamar, y args
es un Vector
de valores para pasar como argumentos.
Estas funciones host pueden invocarse 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 obtiene desde una entrada
CONTRACT_DATA
del libro mayor en el sistema de almacenamiento del host. - Se instancia una VM Wasm por la duración de la invocación.
- Se busca la función y se invoca, pasando los argumentos del llamador al llamado.
Cuando la llamada ocurre desde fuera del host, normalmente los argumentos se proveen en forma serializada XDR que acompaña a la transacción, y se deserializan y convierten automáticamente a objetos host antes de invocar el contrato.
Cuando la llamada ocurre desde dentro del host, los contratos llamador y llamado comparten el mismo host y el llamador puede pasar referencias a objetos host directamente al llamado sin necesidad de serializar o deserializar.
Dado que los objetos host son inmutables, hay un riesgo limitado al pasar una referencia compartida de un contrato a otro: el llamado no puede modificar el objeto de forma que sorprenda al llamador, solo crear nuevos objetos.