É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
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.
@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.
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 de la trousse SDK pour les événements de code de chaîne
Aller aux méthodes de la trousse SDK pour les événements de code de chaîne