Eventi codice concatenato

La versione avanzata di Blockchain App Builder può generare eventi di codice concatenato per le operazioni del 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 o modifiche specifiche nello stato del libro contabile della blockchain. Puoi utilizzare gli eventi di codice concatenato per consentire l'integrazione e l'interazione in tempo reale con applicazioni che non si trovano sulla blockchain e per facilitare i flussi di lavoro basati sugli eventi e il monitoraggio in tutto l'ambiente blockchain. Gli eventi Chaincode includono due componenti, il nome dell'evento e il payload.

Gli eventi Chaincode sono supportati per tutti i file di specifica di Blockchain App Builder. Se si abilitano eventi di codice concatenato, tutte le funzioni del controller nel progetto impalcato emetteranno eventi, ad eccezione dei metodi getter. Ad esempio, in uno scenario di token, gli eventi di codice concatenato verranno emessi quando i token vengono coniati, trasferiti, bruciati o bloccati.

Utilizzare il parametro events booleano nel file di specifica per abilitare gli eventi 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 con codice concatenato impalcato includeranno i metodi di creazione degli eventi, come mostrato negli esempi riportati di seguito.

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 concatenato utilizzano i seguenti valori predefiniti per i componenti nome e payload. Se necessario, è possibile modificare i valori predefiniti.

EventName
Il nome della funzione controller.
Payload
Oggetto JSON che contiene tutti i parametri di input della funzione controller.
È stato inoltre aggiunto un nuovo parametro events ai dettagli del token negli standard estesi Token Taxonomy Framework ed ERC-1155. 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.
{
    "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
}
{
    "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

Il metodo 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 è un dato associato 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 avanzato supporta i metodi batch. I metodi batch funzionano su più token passati come parametri. Per i metodi batch, gli eventi 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 ciascun evento contiene i dettagli del token e la quantità trasferita, nonché i parametri comuni applicabili a tutti i trasferimenti batch.

L'esempio seguente mostra il codice di eventi che utilizza lo standard ERC-1155 avanzato.
@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ù asset

Gli standard avanzati Token Taxonomy Framework ed ERC-1155 supportano la definizione di più asset token in un file di specifica. Il comportamento dell'evento chaincode è 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 conio 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 di codice concatenato vengono generati nel progetto scaffolded se un token qualsiasi ha il parametro events impostato su true nel file di specifica. Il comportamento effettivo dell'evento codice concatenato si basa sul numero di parametri ID token passati al metodo.

  • Se un singolo ID token viene passato come parametro, gli eventi codice concatenato vengono generati solo se il parametro events nei dettagli token corrispondenti è impostato su true.
  • Se vengono passati più ID token come parametri, gli eventi codice concatenato vengono generati solo se il parametro events in uno qualsiasi dei dettagli token è impostato su true.
  • Se non viene passato alcun ID token come parametro, gli eventi codice concatenato vengono sempre generati.
L'elenco seguente mostra i metodi comuni che devono essere passati due token. Questo elenco si applica allo standard esteso di 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 lista riportata di seguito mostra i metodi comuni che non utilizzano i token come argomenti. La lista riportata di seguito si applica allo standard esteso di 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)
Questa lista mostra i metodi comuni che non prendono i token come argomenti per lo standard ERC-1155 esteso.
  • 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 gli eventi Chaincode

createEvent
Questo metodo genera eventi in base a un nome evento e a un payload specificati.
public async createEvent(eventName: any, eventPayload: any, assets?: any)
Parametri:
  • eventName: string: il nome dell'evento da utilizzare durante la generazione degli eventi.
  • eventPayload: map[string]interface{}: il payload degli eventi da utilizzare durante la generazione degli eventi.
  • assets: facoltativamente, l'asset token può essere passato come parametro al metodo.
createEventForBatch
Questo metodo genera eventi per operazioni batch, ad esempio i metodi mintBatch o burnBatch.
public async createEventForBatch(eventName: any, eventPayload: any, quantities: number[], assets: any)
Parametri:
  • eventName: string: il nome dell'evento da utilizzare durante la generazione degli eventi.
  • eventPayload: map[string]interface{}: il payload degli eventi da utilizzare durante la generazione degli eventi.
  • quantities: number[]: un elenco di importi, corrispondente a ciascun ID token, che rappresentano il numero di token da utilizzare nelle transazioni del metodo batch.
  • assets: facoltativamente, l'asset token può essere passato come parametro al metodo.

Vai a metodi SDK per eventi codice concatenato

CreateEvent
Questo metodo genera eventi in base a un nome evento e a un payload specificati.
func (m *Model) CreateEvent(eventName string, eventPayload map[string]interface{}, assets ...interface{})
Parametri:
  • eventName: string: il nome dell'evento da utilizzare durante la generazione degli eventi.
  • eventPayload: map[string]interface{}: il payload degli eventi da utilizzare durante la generazione degli eventi.
  • assets: facoltativamente, l'asset token può essere passato come parametro al metodo.
CreateEventForBatch
Questo metodo genera eventi per operazioni batch, ad esempio i metodi mintBatch o burnBatch.
func (m *Model) CreateEventForBatch(eventName string, eventPayload map[string]interface{}, quantities []float64, assets []interface{})
Parametri:
  • eventName: string: il nome dell'evento da utilizzare durante la generazione degli eventi.
  • eventPayload: map[string]interface{}: il payload degli eventi da utilizzare durante la generazione degli eventi.
  • quantities: []float64: un elenco di importi, corrispondente a ciascun ID token, che rappresentano il numero di token da utilizzare nelle transazioni del metodo batch.
  • assets: facoltativamente, l'asset token può essere passato come parametro al metodo.

Generazione evento in codice concatenato di Blockchain App Builder

Se il parametro events nel file di specifica è impostato su true, il codice degli eventi del codice concatenato viene generato per tutte le API del controller ad eccezione di quelle designate come API getter. Gli esempi riportati di seguito mostrano le API del controller con eventi di codice concatenato abilitati sia per TypeScript che per Go.
@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);
}
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 concatenato vengono generati con i seguenti valori predefiniti. È possibile modificare questi valori in base alle esigenze.
  • EventName: il nome della funzione controller.
  • Payload: un oggetto JSON che contiene tutti i parametri di input della funzione controller.