Eventi codice catena
La versione avanzata di Blockchain App Builder può generare eventi di codice concatenato per le operazioni dei token.
Gli eventi codice concatenato sono notifiche specifiche emesse durante l'esecuzione delle transazioni. Gli eventi includono informazioni sulle transazioni che possono essere utilizzate per notificare ai sistemi esterni condizioni specifiche o modifiche nello stato del registro blockchain. Puoi utilizzare gli eventi del codice concatenato per abilitare l'integrazione e l'interazione in tempo reale con applicazioni che non si trovano sulla blockchain e per facilitare flussi di lavoro e monitoraggio basati sugli eventi in tutto l'ambiente blockchain. Gli eventi Chaincode hanno due componenti, il nome dell'evento e il payload.
Gli eventi di codice concatenato sono supportati per tutti i file di specifica di Blockchain App Builder. Se si abilitano gli eventi del codice concatenato, tutte le funzioni del controller nel progetto impalcato emetteranno eventi, ad eccezione dei metodi getter. Ad esempio, in uno scenario token, gli eventi del codice concatenato verranno emessi quando i token vengono coniati, trasferiti, masterizzati o bloccati
Il parametro events
booleano viene utilizzato nel file di specifica per abilitare gli eventi del codice concatenato, come mostrato nell'esempio seguente.
assets:
- name: FiatMoneyTOK # Asset name
type: token # Asset type
events: true # Generate events for create, update and delete APIs
Se si abilitano gli eventi, le funzioni del controller nel progetto di codice concatenato impalcato includeranno i metodi di creazione degli eventi, come mostrato negli esempi seguenti.
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);
}
Vai:
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...)
}
Gli eventi codice catena utilizzano i seguenti valori predefiniti per i componenti nome e payload. È possibile modificare i valori predefiniti in base alle esigenze.
- EventName
- Il nome della funzione controller.
- Payload
- Oggetto JSON che contiene tutti i parametri di input della funzione controller.
Gli standard ERC-1155 e Token Taxonomy Framework estesi includono un parametro events
nei dettagli del token. Se il parametro events
nel file di specifica è impostato su true, il parametro events
nel token generato viene impostato su true. Se il parametro events
nel file di specifica è impostato su false o non è definito, il parametro events
nel token generato viene impostato su false. Gli esempi riportati di seguito mostrano un token con il nuovo parametro events
sia per TypeScript che per 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
}
Vai:
{
"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"
}
Generazione di eventi
stub.setEvent
consente al codice concatenato di creare ed emettere un evento quando viene eseguita una transazione. Il codice seguente mostra la versione TypeScript del metodo.async setEvent(eventName: string, payload: Buffer): Promise<void>
In questo esempio, eventName
è il nome da assegnare all'evento e payload
è i dati associati all'evento. Il payload può contenere qualsiasi informazione che si desidera inviare con l'evento, in genere serializzata in formato JSON.
Eventi codice concatenato per metodi batch
Lo standard ERC-1155 migliorato supporta i metodi batch. I metodi batch operano su più token passati come parametri. Per i metodi batch, gli eventi del codice concatenato vengono emessi solo per i token in cui il parametro events
è impostato su true
nel file di specifica.
Per ogni transazione completata nel metodo batch, viene generato un evento codice concatenato corrispondente. Il payload di ogni evento codice concatenato contiene i dettagli della transazione. Ad esempio, se si utilizza il metodo BatchTransfer
per trasferire quantità di cinque token diversi, vengono emessi cinque eventi di codice concatenato corrispondenti. Il payload di ogni evento contiene i dettagli del token e la quantità trasferita, insieme a parametri comuni applicabili a tutti i trasferimenti batch.
@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);
}
Eventi codice concatenato per più cespiti
Gli standard ERC-1155 e Token Taxonomy Framework avanzati supportano la definizione di più asset token in un file di specifica. Il comportamento dell'evento del codice concatenato è diverso a seconda che un metodo sia specifico del token (ad esempio la creazione o l'aggiornamento di un token) o comune (ad esempio, il minting o la masterizzazione).
Per i metodi specifici del token, gli eventi del codice concatenato vengono generati solo per i token in cui il parametro events
è impostato su true
nel file di specifica.
Per i metodi comuni, gli eventi del codice concatenato vengono generati nel progetto impalcato se per un token è impostato il parametro events
su true
nel file di specifica. Il funzionamento effettivo dell'evento del codice concatenato si basa sul numero di parametri ID token passati al metodo.
- Se un singolo ID token viene passato come parametro, gli eventi del codice concatenato vengono generati solo se il parametro
events
nei dettagli del token corrispondenti è impostato su true. - Se vengono passati più ID token come parametri, gli eventi del codice concatenato vengono generati solo se il parametro
events
in uno qualsiasi dei dettagli del token è impostato su true. - Se non viene passato alcun ID token come parametro, gli eventi del codice concatenato vengono sempre generati.
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 Metodi SDK per eventi Chaincode