Saltearse al contenido

SetHook

[Source]

(Añadido por la enmienda [Hooks][].)

{
"TransactionType": "SetHook",
"Account": "rWYkbWkCeg8dP6rXALnjgZSjjLyih5NXm",
"Flags": 0,
"Hooks": [
{
"Hook": {
"HookHash": "610F33B8EBF7EC795F822A454FB852156AEFE50BE0CB8326338A81CD74801864",
"CreateCode": "697066733A2F2F4445414442454546697066733A2F2F44454144424545467878",
"HookGrants": [],
"HookNamespace": "0000000000000000000000000000000000000000000000000000000000000000",
"HookParameters": [],
"HookOn": "0000000000000000000000000000000000000000000000000000000000000000",
"HookApiVersion": 0,
"Flags": 0
}
}
]
}
CampoTipo JSON[Tipo Interno][]Descripción
AccountStringAccountIDLa dirección de la cuenta que poseerá el hook.
HooksArrayArrayEl array de hooks a establecer.

La transacción SetHook tiene un costo de transacción estándar, que es el costo mínimo de transacción requerido para todas las transacciones.

Además de los errores que pueden ocurrir para todas las transacciones, las transacciones SetHook pueden resultar en los siguientes códigos de resultado:

Código de ErrorDescripción
tecDUPLICATEOcurre si ya existe un hook con el mismo hash.
tecDIR_FULLOcurre si el directorio del propietario está lleno y no puede acomodar el nuevo hook.
terNO_ACCOUNTOcurre si la cuenta emisora no existe.
terNO_HOOKOcurre si no existe ningún hook con el hash especificado.
temDISABLEDOcurre si la Enmienda Hooks no está habilitada.
temMALFORMEDOcurre si la transacción está malformada.

Hay seis operaciones posibles: Sin Operación, Crear, Actualizar, Eliminar, Instalar y Eliminar Espacio de Nombres

Cada operación se especifica por la inclusión u omisión de ciertos campos del Objeto HookSet. Esencialmente, las operaciones HookSet son un tipo de diff entre los valores predeterminados, existentes y los campos recién especificados de un Hook específico.

Ocurre cuando:

  • El Objeto HookSet está vacío

Comportamiento:

  • No se realiza ningún cambio.

Ejemplo:

{
Account: "r4GDFMLGJUKMjNhhycgt2d5LXCdXzCYPoc",
TransactionType: "SetHook",
Fee: "2000000",
Hooks:
[
{
Hook: {}
}
]
}

Ocurre cuando todas las condiciones siguientes se cumplen:

  • El Hook Correspondiente no existe o se especifica FLAG_OVERRIDE.
  • El campo CreateCode está especificado y no está en blanco y contiene el bytecode WebAssembly válido para un Hook válido.
  • No existe ninguna instancia del mismo bytecode WebAssembly en el XRPL. (Si existe y todos los demás requisitos se cumplen, se interpreta como una Operación Instalar.)

Comportamiento:

  • Se crea un objeto HookDefinition con conteo de referencias en el XRPL.
  • Se crea un array Hooks en la cuenta ejecutante, si no existe ya.
  • Se crea un objeto Hook en la posición del Hook Correspondiente si no existe ya.
  • El objeto Hook apunta a la HookDefinition.

Ejemplo:

{
Account: "r4GDFMLGJUKMjNhhycgt2d5LXCdXzCYPoc",
TransactionType: "SetHook",
Fee: "2000000",
Hooks:
[
{
Hook: {
CreateCode: fs.readFileSync('accept.wasm').toString('hex').toUpperCase(),
HookOn: '0000000000000000',
HookNamespace: addr.codec.sha256('accept').toString('hex').toUpperCase(),
HookApiVersion: 0
}
}
]
}

Ocurre cuando todas las condiciones siguientes se cumplen:

  • El Hook Correspondiente no existe o se especifica FLAG_OVERRIDE.
  • El campo HookHash está especificado y no está en blanco y contiene el hash de un Hook que ya existe como HookDefinition en el ledger o el campo CreateCode contiene bytecode WebAssembly válido para un hook que ya existe en el ledger como HookDefinition.

Ejemplo:

{
Account: "r4GDFMLGJUKMjNhhycgt2d5LXCdXzCYPoc",
TransactionType: "SetHook",
Fee: "2000000",
Hooks:
[
{
Hook: {
HookHash: "A5663784D04ED1B4408C6B97193464D27C9C3334AAF8BBB4FA5EB8E557FC4A2C",
HookOn: '0000000000000000',
HookNamespace: addr.codec.sha256('accept').toString('hex').toUpperCase(),
}
}
]
}

Ocurre cuando todas las condiciones siguientes se cumplen:

  • El Hook Correspondiente existe.
  • HookHash está ausente.
  • CreateCode está ausente.
  • Uno o más de HookNamespace, HookParameters o HookGrants está presente.

Ejemplo:

{
Account: "r4GDFMLGJUKMjNhhycgt2d5LXCdXzCYPoc",
TransactionType: "SetHook",
Fee: "2000000",
Hooks:
[
{
Hook: {
HookNamespace: addr.codec.sha256('new_accept').toString('hex').toUpperCase(),
}
}
]
}

Ocurre cuando todas las condiciones siguientes se cumplen:

  • El Hook Correspondiente existe.
  • Se especifica hsfOVERRIDE.
  • Opcionalmente hsfNSDELETE también está especificado.
  • HookHash está ausente.
  • CreateCode está presente pero vacío.

Ejemplo:

{
Account: "r4GDFMLGJUKMjNhhycgt2d5LXCdXzCYPoc",
TransactionType: "SetHook",
Fee: "2000000",
Hooks:
[
{
Hook: {
CreateCode: "",
Flags: 1,
}
}
]
}

Ocurre cuando todas las condiciones siguientes se cumplen:

  • flags está presente y hsfNSDELETE está activado.
  • HookNamespace está especificado.
  • CreateCode está ausente.
  • HookHash está ausente.

Ejemplo:

{
Account: "r4GDFMLGJUKMjNhhycgt2d5LXCdXzCYPoc",
TransactionType: "SetHook",
Fee: "2000000",
Hooks:
[
{
Hook: {
HookNamespace: addr.codec.sha256('accept').toString('hex').toUpperCase(),
Flags: 3,
}
}
]
}
CampoTipo JSONTipo InternoDescripción
HookHashStringHash256El hash del hook.
CreateCodeStringBlobEl código WebAssembly del hook.
HookGrantsArrayArrayLas concesiones asociadas con el hook.
HookNamespaceStringHash256El espacio de nombres del hook.
HookParametersArrayArrayLos parámetros del hook.
HookOnStringHash256Las transacciones en las que se activa el hook.
HookCanEmitStringHash256Las transacciones que el hook puede emitir.
HookApiVersionNumberUInt16La versión de API del hook.
FlagsNumberUInt32Indicadores adicionales para el hook.
Nombre del IndicadorDescripción
hsfOVERRIDEPermite que el hook sea eliminado aunque esté referenciado por otros objetos.
hsfNSDELETEElimina un espacio de nombres completo de hooks.
hsfCOLLECTRecopila los objetos asociados del hook.

El campo HookGrants es un array de objetos que especifican las concesiones asociadas con el hook:

CampoTipo JSONTipo InternoDescripción
HookHashStringHash256El hook al que aplicar la concesión.
AuthorizeStringAccountIDLa dirección de la cuenta a la que se concede acceso.
FlagsNumberUint32Indicadores

El campo HookParameters es un array de objetos que especifican los parámetros del hook:

CampoTipo JSONTipo InternoDescripción
HookParameterNameStringBlobEl nombre del parámetro.
HookParameterValueStringBlobEl valor del parámetro.

Cuando los Hooks se ejecutan, dejan información sobre el estado de esa ejecución. Esto aparece en los metadatos de la Transacción Originadora como un bloque sfHookExecutions:

CampoTipo JSONTipo InternoDescripción
HookAccountStringAccountIDLa cuenta en la que se ejecutó el Hook.
HookEmitCountNumberUInt16El número total de Transacciones Emitidas producidas por el Hook.
HookExecutionIndexNumberUInt16El SHA512H del Hook en el momento en que fue ejecutado.
HookHashStringHash256El valor del parámetro.
HookInstructionCountStringUInt64El número total de instrucciones WebAssembly que se ejecutaron cuando se ejecutó el Hook.
HookResultNumberUInt8Los Hooks pueden terminar de tres maneras: accept, rollback y error. ¡Esto no es lo mismo que sfHookReturnCode!
HookReturnCodeStringUInt64El entero devuelto como tercer parámetro de accept o rollback.
HookReturnStringStringBlobLa cadena devuelta en los dos primeros parámetros de accept o rollback, si la hay.
HookStateChangeCountNumberUInt16El número de cambios de Estado de Hook que el Hook realizó durante la ejecución.