Événements de code de chaîne

La version améliorée de Blockchain App Builder peut générer des événements de code de chaîne pour les opérations de jeton.

Les événements de code de chaîne sont des avis particuliers émis lors de l'exécution des transactions. Les événements comprennent des informations de transaction qui peuvent être utilisées pour aviser les systèmes externes de conditions spécifiques ou de modifications de l'état du livre de la chaîne de blocs. Vous pouvez utiliser des événements de code de chaîne pour permettre une intégration et une interaction en temps réel avec des applications qui ne sont pas sur la chaîne de blocs, et pour faciliter les flux de travail axés sur les événements et la surveillance dans l'environnement de chaîne de blocs. Les événements de chaîne de code comportent deux composants : le nom de l'événement et les données utiles.

Les événements de chaîne de code sont pris en charge pour tous les fichiers de spécification Blockchain App Builder. Si vous activez des événements de code de chaîne, toutes les fonctions de contrôleur de votre projet échafaudé émettront des événements, à l'exception des méthodes get. Par exemple, dans un scénario de jeton, des événements de code de chaîne sont émis lorsque des jetons sont frappés, transférés, brûlés ou verrouillés

Vous utilisez le paramètre events booléen dans le fichier de spécification pour activer les événements de code de chaîne, comme illustré dans l'exemple suivant.

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

Si vous activez des événements, les fonctions du contrôleur dans votre projet de code de chaîne échafaudé incluront des méthodes de création d'événement, comme illustré dans les exemples suivants.

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);
}

Go :

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...)
}

Les événements de chaîne de code utilisent les valeurs par défaut suivantes pour le nom et les composants de données utiles. Vous pouvez modifier les valeurs par défaut au besoin.

EventName
Nom de la fonction de contrôleur.
Données utiles
Objet JSON qui contient tous les paramètres d'entrée de la fonction de contrôleur.

Le cadre de taxonomie de jeton étendu et les normes ERC-1155 incluent un paramètre events dans les détails du jeton. Si le paramètre events dans le fichier de spécification est réglé à Vrai, le paramètre events dans le jeton généré est réglé à Vrai. Si le paramètre events dans le fichier de spécification est réglé à Faux ou non défini, le paramètre events dans le jeton généré est réglé à Faux. Les exemples suivants montrent un jeton avec le nouveau paramètre events pour TypeScript et 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
}

Go :

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

Génération d'événements

La méthode stub.setEvent permet au code de chaîne de créer et d'émettre un événement lors de l'exécution d'une transaction. Le code suivant affiche la version TypeScript de la méthode.
async setEvent(eventName: string, payload: Buffer): Promise<void>

Dans cet exemple, eventName est le nom à affecter à l'événement et payload est les données associées à l'événement. Les données utiles peuvent contenir toutes les informations que vous souhaitez envoyer avec l'événement, généralement sérialisées au format JSON.

Événements de code de chaîne pour les méthodes par lots

La norme améliorée ERC-1155 prend en charge les méthodes par lots. Les méthodes par lots fonctionnent sur plusieurs jetons qui sont transmis en tant que paramètres. Pour les méthodes par lots, les événements de code de chaîne sont émis uniquement pour les jetons pour lesquels le paramètre events est réglé à true dans le fichier de spécification.

Pour chaque transaction terminée dans la méthode par lots, un événement de code de chaîne correspondant est généré. Les données utiles de chaque événement de code de chaîne contiennent les détails de transaction. Par exemple, si vous utilisez la méthode BatchTransfer pour transférer des quantités de cinq jetons différents, cinq événements de code de chaîne correspondants sont émis. Les données utiles de chaque événement contiennent les détails du jeton et la quantité transférée, ainsi que les paramètres communs applicables à tous les transferts par lots.

L'exemple suivant montre un code d'événement utilisant la norme améliorée ERC-1155.
@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);
  }

Événements de code de chaîne pour ressources multiples

Les normes améliorées Token Taxonomy Framework et ERC-1155 prennent en charge la définition de plusieurs ressources de jeton dans un fichier de spécification. Le comportement de l'événement de code de chaîne est différent selon qu'une méthode est propre au jeton (comme la création ou la mise à jour d'un jeton) ou commune (comme la frappe ou la gravure).

Pour les méthodes propres au jeton, les événements de code de chaîne sont générés uniquement pour les jetons pour lesquels le paramètre events est réglé à true dans le fichier de spécification.

Pour les méthodes communes, des événements de code de chaîne sont générés dans le projet échafaudé si le paramètre events est réglé à true dans le fichier de spécification pour un jeton. Le comportement réel de l'événement de code de chaîne est basé sur le nombre de paramètres d'ID jeton transmis à la méthode.

  • Si un ID jeton unique est transmis en tant que paramètre, les événements de code de chaîne ne sont générés que si le paramètre events dans les détails du jeton correspondant est réglé à Vrai.
  • Si plusieurs ID jeton sont transmis en tant que paramètres, les événements de code de chaîne ne sont générés que si le paramètre events dans l'un des détails du jeton est réglé à Vrai.
  • Si aucun ID jeton n'est transmis en tant que paramètre, les événements de code de chaîne sont toujours générés.
La liste suivante présente les méthodes communes qui doivent être transmises à deux jetons. Cette liste s'applique à la norme étendue 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 liste suivante présente les méthodes courantes qui ne prennent pas de jetons comme arguments. La liste suivante s'applique à la norme étendue 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)
Cette liste présente les méthodes courantes qui ne prennent pas les jetons comme arguments pour la norme ERC-1155 étendue.
  • 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)

TypeScript Méthodes de la trousse SDK pour les événements de code de chaîne

createEvent
Cette méthode génère des événements en fonction d'un nom d'événement et de données utiles spécifiés.
public async createEvent(eventName: any, eventPayload: any, assets?: any)
Paramètres :
  • eventName: string – Nom de l'événement à utiliser lors de la génération d'événements.
  • eventPayload: map[string]interface{} – Données utiles d'événement à utiliser lors de la génération d'événements.
  • assets – Facultativement, la ressource de jeton peut être transmise en tant que paramètre à la méthode.
createEventForBatch
Cette méthode génère des événements pour des opérations par lots telles que les méthodes mintBatch ou burnBatch.
public async createEventForBatch(eventName: any, eventPayload: any, quantities: number[], assets: any)
Paramètres :
  • eventName: string – Nom de l'événement à utiliser lors de la génération d'événements.
  • eventPayload: map[string]interface{} – Données utiles d'événement à utiliser lors de la génération d'événements.
  • quantities: number[] – Liste des montants, correspondant à chaque ID jeton, qui représentent le nombre de jetons à utiliser dans les transactions de méthode par lots.
  • assets – Facultativement, la ressource de jeton peut être transmise en tant que paramètre à la méthode.

Aller aux méthodes de la trousse SDK pour les événements de code de chaîne

CreateEvent
Cette méthode génère des événements en fonction d'un nom d'événement et de données utiles spécifiés.
func (m *Model) CreateEvent(eventName string, eventPayload map[string]interface{}, assets ...interface{})
Paramètres :
  • eventName: string – Nom de l'événement à utiliser lors de la génération d'événements.
  • eventPayload: map[string]interface{} – Données utiles d'événement à utiliser lors de la génération d'événements.
  • assets – Facultativement, la ressource de jeton peut être transmise en tant que paramètre à la méthode.
CreateEventForBatch
Cette méthode génère des événements pour des opérations par lots telles que les méthodes mintBatch ou burnBatch.
func (m *Model) CreateEventForBatch(eventName string, eventPayload map[string]interface{}, quantities []float64, assets []interface{})
Paramètres :
  • eventName: string – Nom de l'événement à utiliser lors de la génération d'événements.
  • eventPayload: map[string]interface{} – Données utiles d'événement à utiliser lors de la génération d'événements.
  • quantities: []float64 – Liste des montants, correspondant à chaque ID jeton, qui représentent le nombre de jetons à utiliser dans les transactions de méthode par lots.
  • assets – Facultativement, la ressource de jeton peut être transmise en tant que paramètre à la méthode.