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

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 è 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.

L'esempio seguente mostra il codice degli eventi utilizzando 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ù 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.
L'elenco seguente mostra i metodi comuni ai quali devono essere passati due token. Questo elenco si applica allo standard del framework della tassonomia dei token esteso.
  • 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)
L'elenco seguente mostra i metodi comuni che non accettano i token come argomenti. L'elenco seguente si applica allo standard Extended 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)
Questo elenco 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 eventi Chaincode

createEvent
Questo metodo genera eventi in base a un nome evento e un payload specificati.
public async createEvent(eventName: any, eventPayload: any, assets?: any)
Parametri:
  • eventName: string: il nome dell'evento da utilizzare per la generazione degli eventi.
  • eventPayload: map[string]interface{}: il payload dell'evento 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 per la generazione degli eventi.
  • eventPayload: map[string]interface{}: il payload dell'evento da utilizzare durante la generazione degli eventi.
  • quantities: number[]: elenco di importi, corrispondenti 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 catena

CreateEvent
Questo metodo genera eventi in base a un nome evento e un payload specificati.
func (m *Model) CreateEvent(eventName string, eventPayload map[string]interface{}, assets ...interface{})
Parametri:
  • eventName: string: il nome dell'evento da utilizzare per la generazione degli eventi.
  • eventPayload: map[string]interface{}: il payload dell'evento 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 per la generazione degli eventi.
  • eventPayload: map[string]interface{}: il payload dell'evento da utilizzare durante la generazione degli eventi.
  • quantities: []float64: elenco di importi, corrispondenti 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.