Saltearse al contenido

Slots y Keylets

Xahau contiene numerosos tipos de objetos heterogéneos a los que un Hook tiene acceso de lectura. Por ejemplo: transacciones, cuentas, ledgers y los subcomponentes de cada uno, entre otros.

Es muy fácil programar de forma descuidada un sistema que realice muchas operaciones de copia innecesarias, cuando un acceso disciplinado a los mismos datos subyacentes (por ejemplo, mediante una vista) sería suficiente. La evitación deliberada de copias en programación se conoce como Zero copy.

Con Hooks se aplica el mismo principio: queremos evitar copias siempre que sea posible. En particular, queremos evitar copiar objetos grandes como ledgers completos, así como serializarlos y deserializarlos innecesariamente.

Los slots forman parte de la API de Hooks y proporcionan un sistema de acceso heterogéneo sin copias a objetos y transacciones en el ledger.

  • Cada Hook tiene acceso a 255 slots durante su ejecución.
  • Cada slot puede estar vacío o contener un objeto asignado (slotted).
  • La API de slots permite navegar dentro de objetos internos y asignarlos también a otros slots.
  • La API permite volcar objetos a buffers o leerlos directamente desde el Hook.

Las APIs disponibles son:

Hook APIQué hace
slotSerializa y devuelve un objeto asignado a un slot
slot_clearLibera un slot ocupado
slot_countCuenta los elementos de un array en un slot
slot_idCalcula el hash canónico del objeto en el slot y lo devuelve
slot_setLocaliza un objeto mediante su keylet y lo coloca en un slot
slot_subarrayIndexa un array en un slot y asigna un subobjeto a otro slot
slot_subfieldIndexa un objeto en un slot y asigna un subobjeto a otro slot
slot_typeObtiene el tipo de campo de un objeto en un slot y otra información opcional
slot_floatConvierte un STI_AMOUNT en el slot a un número XFL
slot_sizeCalcula el tamaño serializado de un objeto en un slot

Los keylets se utilizan para localizar (apuntar a) objetos en el ledger. Básicamente, son un hash de la información identificativa del objeto, que actúa como identificador canónico.

Los Hooks utilizan un formato serializado de 34 bytes para keylets, que puede generarse con la función util_keylet. Sin esto, localizar y asignar objetos sería prácticamente imposible.

En el siguiente ejemplo se genera un keylet de 34 bytes para un objeto signers y se asigna a un slot:

uint8_t keylet[34];
if (util_keylet(SBUF(keylet), KEYLET_SIGNERS, SBUF(hook_accid), 0, 0, 0, 0) != 34)
rollback(SBUF("Notary: Error interno, no se pudo generar el keylet"), 10);
// solicitar a XRPLD que coloque ese keylet en un slot
int64_t slot_no = slot_set(SBUF(keylet), 0);
if (slot_no < 0)
rollback(SBUF("Notary: No se pudo asignar el keylet al slot"), 10);