Evénements de code chaîne
La version améliorée de Blockchain App Builder peut générer des événements de code chaîne pour les opérations de jeton.
Les événements de code chaîne sont des notifications spécifiques émises lors de l'exécution des transactions. Les événements incluent des informations sur les transactions qui peuvent être utilisées pour informer les systèmes externes de conditions ou de modifications spécifiques de l'état du registre de la chaîne de blocs. Vous pouvez utiliser des événements de code chaîne pour permettre l'intégration et l'interaction en temps réel avec des applications qui ne sont pas sur la chaîne de blocs, et pour faciliter les workflows et la surveillance basés sur les événements dans l'environnement de chaîne de blocs. Les événements de code chaîne ont deux composants : le nom de l'événement et la charge utile.
Les événements de code chaîne sont pris en charge pour tous les fichiers de spécification Blockchain App Builder. Si vous activez les événements de code chaîne, toutes les fonctions de contrôleur de votre projet échafaudé émettent des événements, à l'exception des méthodes get. Par exemple, dans un scénario de jeton, les événements de code chaîne sont émis lorsque des jetons sont extraits, transférés, brûlés ou verrouillés
Vous utilisez le paramètre booléen events
dans le fichier de spécification pour activer les événements de code chaîne, comme indiqué 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 les événements, les fonctions de contrôleur de votre projet de code chaîne échafaudé incluent des méthodes de création d'événements, comme indiqué 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);
}
Exécuter
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 code chaîne utilisent les valeurs par défaut suivantes pour le nom et les composants de charge utile. Vous pouvez modifier les valeurs par défaut si nécessaire.
- EventName
- Nom de la fonction de contrôleur.
- Charge utile
- Objet JSON qui contient tous les paramètres d'entrée de la fonction de contrôleur.
La structure de taxonomie de jeton étendue 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 défini sur True, le paramètre events
dans le jeton généré est défini sur True. Si le paramètre events
du fichier de spécification est défini sur False ou n'est pas défini, le paramètre events
du jeton généré est défini sur False. 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
}
Exécuter
{
"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
stub.setEvent
permet au code chaîne de créer et d'émettre un événement lors de l'exécution d'une transaction. Le code suivant indique 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. La charge utile peut contenir toutes les informations à envoyer avec l'événement, généralement sérialisées au format JSON.
Evénements de code chaîne pour les méthodes par lots
La norme ERC-1155 améliorée 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 chaîne sont émis uniquement pour les jetons pour lesquels le paramètre events
est défini sur true
dans le fichier de spécification.
Pour chaque transaction terminée dans la méthode de batch, un événement de code chaîne correspondant est généré. La charge utile de chaque événement de code chaîne contient les détails de la 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 chaîne correspondants sont émis. La charge utile de chaque événement contient les détails du jeton et la quantité transférée, ainsi que les paramètres communs applicables à tous les transferts par lots.
@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);
}
Evénements de code chaîne pour plusieurs ressources
La structure de taxonomie de jeton améliorée et les normes ERC-1155 prennent en charge la définition de plusieurs ressources de jeton dans un fichier de spécification. Le comportement des événements de code chaîne est différent selon qu'une méthode est spécifique à un jeton (par exemple, création ou mise à jour d'un jeton) ou commune (par exemple, extraction ou gravure).
Pour les méthodes propres aux jetons, les événements de code chaîne sont générés uniquement pour les jetons pour lesquels le paramètre events
est défini sur true
dans le fichier de spécification.
Pour les méthodes courantes, les événements de code chaîne sont générés dans le projet échafaudé si le paramètre events
d'un jeton est défini sur true
dans le fichier de spécification. Le comportement réel des événements de code chaîne est basé sur le nombre de paramètres d'ID de jeton transmis à la méthode.
- Si un seul ID de jeton est transmis en tant que paramètre, les événements de code chaîne sont générés uniquement si le paramètre
events
dans les détails de jeton correspondants est défini sur True. - Si plusieurs ID de jeton sont transmis en tant que paramètres, les événements de code chaîne sont générés uniquement si le paramètre
events
dans l'un des détails de jeton est défini sur True. - Si aucun ID de jeton n'est transmis en tant que paramètre, les événements de code chaîne sont toujours générés.
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)
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)
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 SDK pour les événements de code chaîne