Pular para o conteúdo

SetHook

[Fonte]

(Adicionado pela [emenda 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][]Descrição
AccountStringAccountIDO endereço da conta que será proprietária do hook.
HooksArrayArrayO array de hooks a serem definidos.

A transação SetHook tem um custo de transação padrão, que é o custo mínimo exigido para todas as transações.

Além dos erros que podem ocorrer em todas as transações, as transações SetHook podem resultar nos seguintes códigos de resultado:

Código de ErroDescrição
tecDUPLICATEOcorre se um hook com o mesmo hash já existir.
tecDIR_FULLOcorre se o diretório do proprietário estiver cheio e não puder acomodar o novo hook.
terNO_ACCOUNTOcorre se a conta remetente não existir.
terNO_HOOKOcorre se nenhum hook existir com o hash especificado.
temDISABLEDOcorre se a Emenda Hooks não estiver habilitada.
temMALFORMEDOcorre se a transação estiver malformada.

Existem seis operações possíveis: Sem Operação, Criar, Atualizar, Excluir, Instalar e Exclusão de Namespace

Cada operação é especificada pela inclusão ou omissão de certos campos do objeto HookSet. Isso pode parecer confuso no início, mas ao trabalhar com alguns exemplos, o leitor deve achar intuitivo; Essencialmente, as operações HookSet são um tipo de diff entre os padrões, existentes e campos recém-especificados de um Hook específico.

Como alcançar cada tipo de operação é explicado em uma subseção abaixo.

Ocorre quando:

  • O objeto HookSet está vazio

Comportamento:

  • Nenhuma alteração de qualquer tipo é realizada.

Exemplo:

JSON

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

Ocorre quando:

Todas as seguintes condições são atendidas:

  • O Hook Correspondente não existe ou FLAG_OVERRIDE é especificado.
  • O campo CreateCode é especificado e não está em branco e contém o bytecode web assembly válido para um Hook válido.
  • Nenhuma instância do mesmo bytecode web assembly já existe no XRPL. (Se existir e todos os outros requisitos forem atendidos, interprete como uma Operação de Instalação — veja abaixo.)

Comportamento:

  • Um objeto HookDefinition com contagem de referência é criado no XRPL contendo os campos no objeto HookSet, com todos os campos especificados (Namespace, Parameters, HookOn) tornando-se padrões (mas não Grants).
  • Um array Hooks é criado na conta executante, se ainda não existir. (Esta é a estrutura que contém os Hooks Correspondentes.)
  • Um objeto Hook é criado na posição do Hook Correspondente se não existir.
  • O objeto Hook aponta para a HookDefinition.
  • O objeto Hook não contém campos exceto HookHash que aponta para a HookDefinition criada.
  • Se o flag hsfNSDELETE for especificado, quaisquer entradas HookState no namespace de destino serão excluídas se existirem.

Exemplo:

JSON

{
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
}
}
]
}

Ocorre quando:

Todas as seguintes condições são atendidas:

  • O Hook Correspondente não existe ou FLAG_OVERRIDE é especificado.
  • O campo HookHash é especificado e não está em branco e contém o hash de um Hook que já existe como HookDefinition no ledger ou o campo CreateCode é especificado e não está em branco e contém o bytecode web assembly válido para um hook válido que já existe no ledger como HookDefinition.

Comportamento:

  • A contagem de referência do objeto HookDefinition é incrementada.
  • Um array Hooks é criado na conta executante, se ainda não existir. (Esta é a estrutura que contém os Hooks Correspondentes.)
  • Um objeto Hook é criado na posição do Hook Correspondente se não existir.
  • O objeto Hook aponta para a HookDefinition.
  • O objeto Hook contém todos os campos no objeto HookSet, exceto quando:
  • Um campo ou par chave-valor dentro de um campo é idêntico aos Padrões de Hook definidos na HookDefinition, caso em que é omitido devido aos padrões.
  • Se o flag hsfNSDELETE for especificado, quaisquer entradas HookState no namespace de destino serão excluídas se existirem.

Exemplo:

JSON

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

Ocorre quando:

Todas as seguintes condições são atendidas:

  • O Hook Correspondente existe.
  • HookHash está ausente.
  • CreateCode está ausente.
  • Um ou mais de HookNamespace, HookParameters ou HookGrants está presente.

Comportamento Geral:

  • O Hook Correspondente é atualizado de forma que as alterações desejadas sejam refletidas no Hook Correspondente.

Comportamento Específico:

Se HookNamespace for especificado e diferir do Namespace do Hook Correspondente:

  • O HookNamespace do Hook Correspondente é atualizado, e
  • se o flag hsfNSDELETE for especificado, todas as entradas HookState no namespace antigo são excluídas.

Se HookParameters for especificado, para cada entrada:

  • Se HookParameterName existir, mas HookParameterValue estiver ausente e os Parâmetros do Hook Correspondente (específicos ou via padrões) contiverem este HookParameterName, o parâmetro é marcado como excluído no Hook Correspondente.
  • Se HookParameterName existir e HookParameterValue existir, os Parâmetros do Hook Correspondente são modificados para incluir o parâmetro novo ou atualizado.

Se HookGrants for especificado:

  • O array HookGrants do Hook Correspondente é substituído pelo array.

Exemplo:

JSON

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

Ocorre quando:

Todas as seguintes condições são atendidas:

  • O Hook Correspondente existe.
  • hsfOVERRIDE é especificado.
  • opcionalmente hsfNSDELETE também é especificado.
  • HookHash está ausente.
  • CreateCode está presente, mas vazio.

Comportamento:

  • A contagem de referência do objeto HookDefinition é decrementada.
  • Se a contagem de referência for agora zero, a HookDefintion é removida do ledger.
  • O objeto Hook na posição do Hook Correspondente é excluído, deixando uma posição vazia.
  • Se hsfNSDELETE for especificado, o namespace e todas as entradas HookState também são excluídos.

Exemplo:

JSON

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

Ocorre quando:

Todas as seguintes condições são atendidas:

  • flags está presente e hsfNSDELETE está definido. hsfOVERRIDE também pode opcionalmente ser especificado se o Hook nesta posição deve ser excluído.
  • HookNamespace é especificado.
  • CreateCode está ausente.
  • HookHash está ausente.
  • HookGrants, HookParameters, HookOn e HookApiVersion estão ausentes.

Comportamento:

  • Se o Hook Correspondente existir, ele permanece; nada acontece com ele.
  • Um subconjunto de objetos HookState e o diretório HookState para o namespace especificado são removidos do ledger, até o limite definido (512). Transações adicionais são necessárias para continuar o processo de exclusão até que todos os registros relevantes sejam removidos. Consulte tesPARTIAL.

Exemplo:

JSON

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

Os seguintes campos são usados no objeto hook:

CampoTipo JSONTipo InternoDescrição
HookHashStringHash256O hash do hook.
CreateCodeStringBlobO código WebAssembly para o hook.
HookGrantsArrayArrayAs concessões associadas ao hook.
HookNamespaceStringHash256O namespace do hook.
HookParametersArrayArrayOs parâmetros do hook.
HookOnStringHash256A(s) transação(ões) nas quais o hook é acionado.
HookCanEmitStringHash256A(s) transação(ões) que o hook pode emitir.
HookApiVersionNumberUInt16A versão da API do hook.
FlagsNumberUInt32Flags adicionais para o hook.

O campo Flags no objeto hook especifica flags adicionais para o hook. Os seguintes flags são suportados:

Nome do FlagDescrição
hsfOVERRIDEPermite que o hook seja excluído mesmo que seja referenciado por outros objetos.
hsfNSDELETEExclui um namespace inteiro de hooks.
hsfCOLLECTColeta os objetos associados ao hook.

O campo HookGrants é um array de objetos que especificam as concessões associadas ao hook. Cada objeto de concessão possui os seguintes campos:

CampoTipo JSONTipo InternoDescrição
HookHashStringHash256O hook ao qual aplicar a concessão.
AuthorizeStringAccountIDO endereço da conta à qual o acesso é concedido.
FlagsNumberUint32Flags

O campo HookParameters é um array de objetos que especificam os parâmetros do hook. Cada objeto de parâmetro possui os seguintes campos:

CampoTipo JSONTipo InternoDescrição
HookParameterNameStringBlobO nome do parâmetro.
HookParameterValueStringBlobO valor do parâmetro.

Quando Hooks são executados, eles deixam informações sobre o status dessa execução. Isso aparece nos metadados da Transação de Origem como um bloco sfHookExecutions. Este bloco contém os seguintes campos:

CampoTipo JSONTipo InternoDescrição
HookAccountStringAccountIDA conta na qual o Hook foi executado.
HookEmitCountNumberUInt16O número total de Transações Emitidas produzidas pelo Hook.
HookExecutionIndexNumberUInt16O SHA512H do Hook no momento em que foi executado.
HookHashStringHash256O valor do parâmetro.
HookInstructionCountStringUInt64O número total de instruções webassembly que foram executadas quando o Hook foi executado.
HookResultNumberUInt8

Hooks podem terminar de três maneiras: accept, rollback e error.
Isso não é o mesmo que sfHookReturnCode!

HookReturnCodeStringUInt64O inteiro retornado como terceiro parâmetro de accept ou rollback.
HookReturnStringStringBlobA string retornada nos primeiros dois parâmetros de accept ou rollback, se houver.
HookStateChangeCountNumberUInt16O número de mudanças de Estado do Hook que o Hook fez durante a execução.