Eventos do Chaincode
A versão aprimorada do Blockchain App Builder pode gerar eventos chaincode para operações de token.
Os eventos de Chaincode são notificações específicas que são emitidas quando as transações são executadas. Os eventos incluem informações de transação que podem ser usadas para notificar sistemas externos sobre condições específicas ou alterações no estado do razão blockchain. Você pode usar eventos chaincode para permitir integração e interação em tempo real com aplicativos que não estão no blockchain e para facilitar fluxos de trabalho e monitoramento orientados a eventos em todo o ambiente blockchain. Os eventos de Chaincode têm dois componentes, o nome do evento e a carga útil.
Eventos Chaincode são suportados para todos os arquivos de especificação do Blockchain App Builder. Se você ativar eventos chaincode, todas as funções do controlador em seu projeto scaffolded emitirão eventos, exceto para métodos getter. Por exemplo, em um cenário de token, os eventos chaincode serão emitidos quando os tokens forem cunhados, transferidos, gravados ou bloqueados
Use o parâmetro Booliano events
no arquivo de especificação para ativar eventos chaincode, conforme mostrado no exemplo a seguir.
assets:
- name: FiatMoneyTOK # Asset name
type: token # Asset type
events: true # Generate events for create, update and delete APIs
Se você ativar eventos, as funções do controlador em seu projeto de chaincode scaffolded incluirão métodos de criação de eventos, conforme mostrado nos exemplos a seguir.
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);
}
Ir:
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...)
}
Os eventos de Chaincode usam os seguintes valores padrão para os componentes de nome e payload. Você pode modificar os valores padrão conforme necessário.
- EventName
- O nome da função do controlador.
- Payload
- Um objeto JSON que contém todos os parâmetros de entrada da função do controlador.
O Token Taxonomy Framework estendido e os padrões ERC-1155 incluem um parâmetro events
nos detalhes do token. Se o parâmetro events
no arquivo de especificação for definido como verdadeiro, o parâmetro events
no token gerado será definido como verdadeiro. Se o parâmetro events
no arquivo de especificação for definido como falso ou não definido, o parâmetro events
no token gerado será definido como falso. Os exemplos a seguir mostram um token com o novo parâmetro events
para TypeScript e 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
}
Ir:
{
"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"
}
Gerando Eventos
stub.setEvent
permite que o chaincode crie e emita um evento quando uma transação é executada. O código a seguir mostra a versão TypeScript do método.async setEvent(eventName: string, payload: Buffer): Promise<void>
Neste exemplo, eventName
é o nome a ser atribuído ao evento e payload
são dados associados ao evento. O payload pode conter qualquer informação que você queira enviar com o evento, geralmente serializado no formato JSON.
Eventos de Chaincode para métodos de lote
O padrão ERC-1155 aprimorado suporta métodos em lote. Os métodos batch operam em vários tokens que são passados como parâmetros. Para métodos em batch, os eventos chaincode são emitidos apenas para os tokens em que o parâmetro events
é definido como true
no arquivo de especificação.
Para cada transação concluída no método de lote, um evento de chaincode correspondente é gerado. A carga útil de cada evento chaincode contém os detalhes da transação. Por exemplo, se você usar o método BatchTransfer
para transferir quantidades de cinco tokens diferentes, cinco eventos de chaincode correspondentes serão emitidos. A carga útil de cada evento contém os detalhes do token e a quantidade transferida, juntamente com parâmetros comuns que são aplicáveis a todas as transferências em 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);
}
Eventos de Chaincode para Vários Ativos
O Token Taxonomy Framework aprimorado e os padrões ERC-1155 suportam a definição de mais de um ativo de token em um arquivo de especificação. O comportamento do evento chaincode é diferente dependendo se um método é específico do token (como criar ou atualizar um token) ou comum (como cunhar ou gravar).
Para métodos específicos de token, os eventos chaincode são gerados apenas para os tokens em que o parâmetro events
é definido como true
no arquivo de especificação.
Para métodos comuns, os eventos chaincode serão gerados no projeto scaffolded se qualquer token tiver o parâmetro events
definido como true
no arquivo de especificação. O comportamento real do evento chaincode é baseado no número de parâmetros de ID de token passados para o método.
- Se um único ID de token for informado como parâmetro, os eventos de chaincode serão gerados somente se o parâmetro
events
nos detalhes do token correspondente estiver definido como verdadeiro. - Se vários IDs de token forem especificados como parâmetros, os eventos de chaincode serão gerados somente se o parâmetro
events
em qualquer um dos detalhes do token estiver definido como verdadeiro. - Se nenhum ID de token for informado como parâmetro, os eventos chaincode serão sempre gerados.
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étodos do SDK para Eventos do Chaincode