Eventos de código de cadena

La versión mejorada de Blockchain App Builder puede generar eventos de código de cadena para operaciones de token.

Los eventos de código de cadena son notificaciones específicas que se emiten cuando se ejecutan las transacciones. Los eventos incluyen información de transacciones que se puede utilizar para notificar a los sistemas externos sobre condiciones específicas o cambios en el estado del libro mayor de blockchain. Puede utilizar eventos de código de cadenas para permitir la integración e interacción en tiempo real con aplicaciones que no están en la cadena de bloques, y para facilitar flujos de trabajo y supervisión basados en eventos en todo el entorno de blockchain. Los eventos de código de cadena tienen dos componentes: el nombre del evento y la carga útil.

Los eventos de código de cadena están soportados para todos los archivos de especificación de Blockchain App Builder. Si activa eventos de código de cadenas, todas las funciones de controlador del proyecto de andamios emitirán eventos, excepto los métodos getter. Por ejemplo, en un caso de token, los eventos de código de cadena se emitirán cuando los tokens se extraigan, transfieran, quemen o bloqueen

Utilice el parámetro booleano events en el archivo de especificación para activar eventos de código de cadenas, como se muestra en el siguiente ejemplo.

assets:
    - name: FiatMoneyTOK # Asset name
      type: token  # Asset type
      events: true  # Generate events for create, update and delete APIs

Si activa eventos, las funciones del controlador en el proyecto de código de cadena de andamios incluirán métodos de creación de eventos, como se muestra en los siguientes ejemplos.

TypeScript:

@Validator(yup.string(), yup.string(), yup.string())
public async createAccount(org_id: string, user_id: string, token_type: string) {
  await this.Ctx.Auth.checkAuthorization("ACCOUNT.createAccount", "TOKEN", { org_id });
  await this.Ctx.Model.createEvent(EVENT_NAME.CREATE_ACCOUNT, { org_id, user_id, token_type });
  return await this.Ctx.Account.createAccount(org_id, user_id, token_type);
}

Ir:

func (t *Controller) CreateAccount(org_id string, user_id string, token_type string, daily_limits ...account.AccountDailyLimits) (interface{}, error) {
    auth, err := t.Ctx.Auth.CheckAuthorization("Account.CreateAccount", "TOKEN", map[string]string{"org_id": org_id})
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    err = t.Ctx.Model.CreateEvent(constants.CreateAccountEventName, map[string]interface{}{"org_id": org_id, "user_id": user_id, "token_type": token_type})
    if err != nil {
        return nil, err
    }
    return t.Ctx.Account.CreateAccount(org_id, user_id, token_type, daily_limits...)
}

Los eventos de código de cadena utilizan los siguientes valores por defecto para los componentes de nombre y carga útil. Puede modificar los valores predeterminados según sea necesario.

EventName
El nombre de la función del controlador.
Carga Útil
Un objeto JSON que contiene todos los parámetros de entrada de la función del controlador.

El marco de taxonomía de token ampliado y los estándares ERC-1155 incluyen un parámetro events en los detalles del token. Si el parámetro events del archivo de especificación se define en true, el parámetro events del token generado se define en true. Si el parámetro events del archivo de especificación se define en false o no se define, el parámetro events del token generado se define en false. Los siguientes ejemplos muestran un token con el nuevo parámetro events tanto para TypeScript como para Go.

TypeScript:

{
    "metadata": {
        "paintingName": "monalisa",
        "description": "monalisa painting",
        "image": "image link",
        "painterName": "Leonardo da Vinci"
    },
    "assetType": "otoken",
    "events": true,
    "quantity": 1,
    "tokenId": "artnft",
    "tokenName": "artcollection",
    "tokenDesc": "artcollection nft",
    "tokenStandard": "erc1155+",
    "tokenType": "nonfungible",
    "tokenUnit": "whole",
    "behaviors": [
        "indivisible",
        "singleton",
        "mintable",
        "transferable",
        "burnable",
        "roles"
    ],
    "roles": {
        "minter_role_name": "minter",
        "burner_role_name": "burner"
    },
    "mintable": {
        "max_mint_quantity": 500
    },
    "owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "createdBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "creationDate": "2022-12-29T04:08:35.000Z",
    "isBurned": false,
    "tokenUri": "tu",
    "price": 10000,
    "onSaleFlag": false
}

Ir:

{
    "AssetType": "otoken",
    "Behavior": [
        "indivisible",
        "singleton",
        "mintable",
        "transferable",
        "burnable",
        "roles"
    ],
    "CreatedBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "CreationDate": "2022-12-29T09:57:03+05:30",
    "Events": true,
    "IsBurned": false,
    "Mintable": {
        "Max_mint_quantity": 500
    },
    "OnSaleFlag": false,
    "Owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "Price": 100,
    "Quantity": 1,
    "Roles": {
        "burner_role_name": "burner",
        "minter_role_name": "minter"
    },
    "TokenDesc": "token description",
    "TokenId": "monalisa",
    "TokenMetadata": {
        "Description": "Mona Lisa Painting",
        "Image": "monalisa.jpeg",
        "PainterName": "Leonardo_da_Vinci",
        "PaintingName": "Mona_Lisa"
    },
    "TokenName": "artcollection",
    "TokenStandard": "erc1155+",
    "TokenType": "nonfungible",
    "TokenUnit": "whole",
    "TokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg"
}

Generación de eventos

El método stub.setEvent permite que el código de cadena cree y emita un evento cuando se ejecuta una transacción. El siguiente código muestra la versión TypeScript del método.
async setEvent(eventName: string, payload: Buffer): Promise<void>

En este ejemplo, eventName es el nombre que se va a asignar al evento y payload son datos asociados al evento. La carga útil puede contener cualquier información que desee enviar con el evento, normalmente serializada en formato JSON.

Eventos de código de cadena para métodos de lote

El estándar ERC-1155 mejorado admite métodos por lotes. Los métodos por lotes funcionan en varios tokens que se transfieren como parámetros. Para los métodos por lotes, los eventos de código de cadena se emiten solo para los tokens en los que el parámetro events está definido en true en el archivo de especificación.

Para cada transacción completada en el método de lote, se genera un evento de código de cadena correspondiente. La carga útil de cada evento de código de cadena contiene los detalles de la transacción. Por ejemplo, si utiliza el método BatchTransfer para transferir cantidades de cinco tokens diferentes, se emiten cinco eventos de código de cadena correspondientes. La carga útil de cada evento contiene los detalles del token y la cantidad transferida, junto con los parámetros comunes que se aplican a todas las transferencias por lotes.

El siguiente ejemplo muestra el código de eventos utilizando el estándar ERC-1155 mejorado.
@Validator(yup.string(), yup.string(), yup.string(), yup.string(), yup.array().of(yup.string()), yup.array().of(yup.number()))
  public async batchTransferFrom(
    fromOrgId: string,
    fromUserId: string,
    toOrgId: string,
    toUserId: string,
    tokenIds: string[],
    quantity: number[]
  ) {
    const fromAccountId = this.Ctx.ERC1155Account.generateAccountId(fromOrgId, fromUserId, ACCOUNT_TYPE.USER_ACCOUNT);
    const toAccountId = this.Ctx.ERC1155Account.generateAccountId(toOrgId, toUserId, ACCOUNT_TYPE.USER_ACCOUNT);
    let tokenAssets = [];
    for (let i = 0; i < tokenIds.length; i++) {
      const tokenAsset = await this.Ctx.ERC1155Token.get(tokenIds[i]);
      tokenAssets.push(tokenAsset);
    }
    await this.Ctx.Model.createEventForBatch(EVENT_NAME.BATCH_TRANSFER_FROM, { fromOrgId, fromUserId, toOrgId, toUserId }, quantity, tokenAssets);
    return await this.Ctx.ERC1155Token.batchTransferFrom(fromAccountId, toAccountId, tokenIds, quantity);
  }

Eventos de código de cadena para varios activos

El marco de taxonomía de token mejorado y los estándares ERC-1155 admiten la definición de más de un activo de token en un archivo de especificación. El comportamiento del evento de código de cadena es diferente según si un método es específico del token (como crear o actualizar un token) o común (como acuñar o grabar).

Para métodos específicos de token, los eventos de código de cadena se generan solo para los tokens en los que el parámetro events está definido en true en el archivo de especificación.

Para métodos comunes, los eventos de código de cadena se generan en el proyecto de andamios si algún token tiene el parámetro events definido en true en el archivo de especificación. El comportamiento real del evento de código de cadena se basa en el número de parámetros de ID de token transferidos al método.

  • Si se transfiere un único ID de token como parámetro, los eventos de código de cadena se generan solo si el parámetro events de los detalles de token correspondientes está definido en true.
  • Si se transfieren varios ID de token como parámetros, los eventos de código de cadena se generan solo si el parámetro events de cualquiera de los detalles de token está definido en true.
  • Si no se transfiere ningún identificador de token como parámetro, siempre se generan eventos de código de cadena.
La siguiente lista muestra métodos comunes a los que se deben transferir dos tokens. Esta lista se aplica al estándar ampliado de Token Taxonomy Framework.
  • addConversionRate(from_token_id: string, to_token_id: string, token_conversion_rate: number)
  • updateConversionRate(from_token_id: string, to_token_id: string, token_conversion_rate: number)
  • tokenConversion(from_token_id: string, to_token_id: string, to_org_id: string, to_user_id: string,token_quantity: number)
  • exchangeToken(fromTokenId: string, fromOrgId: string, fromUserId: string, fromTokenQuantity: number, toTokenId: string, toOrgId: string,toUserId: string,toTokenQuantity: number)
La siguiente lista muestra métodos comunes que no toman tokens como argumentos. La siguiente lista se aplica al estándar extendido de Token Taxonomy Framework.
  • addTokenAdmin(org_id: string, user_id: string)
  • removeTokenAdmin(org_id: string, user_id: string)
  • addOrgAdmin(org_id: string, user_id: string)
  • removeOrgAdmin(org_id: string, user_id: string)
  • createAccount(org_id: string, user_id: string, token_type: string)
  • deleteHistoricalTransactions(time_to_expiration: Date)
  • initializeExchangePoolUser(org_id: string, user_id: string)
Esta lista muestra métodos comunes que no toman tokens como argumentos para el estándar ERC-1155 extendido.
  • addTokenAdmin(orgId: string, userId: string)
  • removeTokenAdmin(orgId: string, userId: string)
  • createAccount(orgId: string, userId: string, ftAccount: boolean, nftAccount: boolean)
  • createUserAccount(orgId: string, userId: string)
  • createTokenAccount(orgId: string, userId: string, tokenType: TokenType)
  • addTokenSysRole(orgId: string, userId: string, role: string)
  • removeTokenSysRole(orgId: string, userId: string, role: string)
  • transferTokenSysRole(fromOrgId: string, fromUserId: string, toOrgId: string, toUserId: string, role: string)
  • deleteHistoricalTransactions(time_to_expiration: Date)

Métodos de SDK de TypeScript para eventos de código de cadena

createEvent
Este método genera eventos basados en un nombre de evento y carga útil especificados.
public async createEvent(eventName: any, eventPayload: any, assets?: any)
Parámetros:
  • eventName: string: nombre del evento que se va a utilizar al generar eventos.
  • eventPayload: map[string]interface{}: carga útil de evento que se utilizará al generar eventos.
  • assets: opcionalmente, el activo de token se puede transferir como parámetro al método.
createEventForBatch
Este método genera eventos para operaciones por lotes, como los métodos mintBatch o burnBatch.
public async createEventForBatch(eventName: any, eventPayload: any, quantities: number[], assets: any)
Parámetros:
  • eventName: string: nombre del evento que se va a utilizar al generar eventos.
  • eventPayload: map[string]interface{}: carga útil de evento que se utilizará al generar eventos.
  • quantities: number[]: lista de importes, correspondiente a cada ID de token, que representa el número de tokens que se utilizarán en las transacciones de método por lotes.
  • assets: opcionalmente, el activo de token se puede transferir como parámetro al método.

Métodos de SDK de Go para eventos de código de cadena

CreateEvent
Este método genera eventos basados en un nombre de evento y carga útil especificados.
func (m *Model) CreateEvent(eventName string, eventPayload map[string]interface{}, assets ...interface{})
Parámetros:
  • eventName: string: nombre del evento que se va a utilizar al generar eventos.
  • eventPayload: map[string]interface{}: carga útil de evento que se utilizará al generar eventos.
  • assets: opcionalmente, el activo de token se puede transferir como parámetro al método.
CreateEventForBatch
Este método genera eventos para operaciones por lotes, como los métodos mintBatch o burnBatch.
func (m *Model) CreateEventForBatch(eventName string, eventPayload map[string]interface{}, quantities []float64, assets []interface{})
Parámetros:
  • eventName: string: nombre del evento que se va a utilizar al generar eventos.
  • eventPayload: map[string]interface{}: carga útil de evento que se utilizará al generar eventos.
  • quantities: []float64: lista de importes, correspondiente a cada ID de token, que representa el número de tokens que se utilizarán en las transacciones de método por lotes.
  • assets: opcionalmente, el activo de token se puede transferir como parámetro al método.