Chaincode-Ereignisse
Die erweiterte Version von Blockchain App Builder kann Chaincode-Ereignisse für Tokenvorgänge generieren.
Chaincode-Ereignisse sind spezifische Benachrichtigungen, die bei der Ausführung von Transaktionen ausgegeben werden. Ereignisse umfassen Transaktionsinformationen, mit denen externe Systeme über bestimmte Bedingungen oder Änderungen im Blockchain-Ledger-Status benachrichtigt werden können. Sie können Chaincode-Ereignisse verwenden, um Echtzeitintegration und -interaktion mit Anwendungen zu ermöglichen, die nicht in der Blockchain enthalten sind, und um ereignisgesteuerte Workflows und die Überwachung in der gesamten Blockchain-Umgebung zu erleichtern. Chaincode-Ereignisse haben zwei Komponenten: den Ereignisnamen und die Payload.
Chaincode-Ereignisse werden für alle Blockchain App Builder-Spezifikationsdateien unterstützt. Wenn Sie Chaincode-Ereignisse aktivieren, geben alle Controller-Funktionen in Ihrem Gerüstprojekt Ereignisse aus, mit Ausnahme von Getter-Methoden. Beispiel: In einem Token-Szenario werden Chaincode-Ereignisse ausgegeben, wenn Token geprägt, übertragen, gebrannt oder gesperrt werden
Sie verwenden den booleschen Parameter events
in der Spezifikationsdatei, um Chaincode-Ereignisse zu aktivieren, wie im folgenden Beispiel gezeigt.
assets:
- name: FiatMoneyTOK # Asset name
type: token # Asset type
events: true # Generate events for create, update and delete APIs
Wenn Sie Ereignisse aktivieren, umfassen die Controllerfunktionen in Ihrem gerüsteten Chaincode-Projekt Ereigniserstellungsmethoden, wie in den folgenden Beispielen gezeigt.
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);
}
Start:
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...)
}
Chaincode-Ereignisse verwenden die folgenden Standardwerte für die Namens- und Payload-Komponenten. Sie können die Standardwerte nach Bedarf ändern.
- EventName
- Der Name der Controller-Funktion.
- Payload
- Ein JSON-Objekt, das alle Eingabeparameter der Controllerfunktion enthält.
Das erweiterte Token Taxonomy Framework und die ERC-1155-Standards enthalten einen Parameter events
in den Tokendetails. Wenn der Parameter events
in der Spezifikationsdatei auf "true" gesetzt ist, wird der Parameter events
im generierten Token auf "true" gesetzt. Wenn der Parameter events
in der Spezifikationsdatei auf "false" gesetzt ist oder nicht definiert ist, wird der Parameter events
im generierten Token auf "false" gesetzt. Die folgenden Beispiele zeigen ein Token mit dem neuen Parameter events
für TypeScript und 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
}
Start:
{
"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"
}
Ereignisse generieren
stub.setEvent
kann der Chaincode ein Ereignis erstellen und ausgeben, wenn eine Transaktion ausgeführt wird. Der folgende Code zeigt die Version TypeScript der Methode.async setEvent(eventName: string, payload: Buffer): Promise<void>
In diesem Beispiel ist eventName
der Name, der dem Ereignis zugewiesen werden soll, und payload
sind Daten, die mit dem Ereignis verknüpft sind. Die Payload kann alle Informationen enthalten, die Sie mit dem Ereignis senden möchten, normalerweise im JSON-Format serialisiert.
Chaincode-Ereignisse für Batchmethoden
Der verbesserte ERC-1155-Standard unterstützt Batch-Methoden. Batchmethoden arbeiten mit mehreren Token, die als Parameter übergeben werden. Bei Batchmethoden werden Chaincodeereignisse nur für die Token ausgegeben, bei denen der Parameter events
in der Spezifikationsdatei auf true
gesetzt ist.
Für jede in der Batchmethode abgeschlossene Transaktion wird ein entsprechendes Chaincode-Ereignis generiert. Die Payload jedes Chaincodeereignisses enthält die Transaktionsdetails. Beispiel: Wenn Sie die Methode BatchTransfer
verwenden, um Mengen von fünf verschiedenen Token zu übertragen, werden fünf entsprechende Chaincode-Ereignisse ausgegeben. Die Payload jedes Ereignisses enthält die Tokendetails und die übertragene Menge sowie gemeinsame Parameter, die für alle Batchtransfers gelten.
@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);
}
Chaincode-Ereignisse für mehrere Anlagen
Das erweiterte Token Taxonomy Framework und die ERC-1155-Standards unterstützen die Definition mehrerer Tokenassets in einer Spezifikationsdatei. Das Verhalten des Chaincode-Ereignisses hängt davon ab, ob eine Methode tokenspezifisch ist (z. B. das Erstellen oder Aktualisieren eines Tokens) oder allgemein (z. B. Minting oder Brennen).
Bei tokenspezifischen Methoden werden Chaincodeereignisse nur für die Token generiert, bei denen der Parameter events
in der Spezifikationsdatei auf true
gesetzt ist.
Bei allgemeinen Methoden werden Chaincodeereignisse im Gerüstprojekt generiert, wenn für ein Token der Parameter events
in der Spezifikationsdatei auf true
gesetzt ist. Das tatsächliche Verhalten des Chaincode-Ereignisses basiert auf der Anzahl der an die Methode übergebenen Token-ID-Parameter.
- Wenn eine einzelne Token-ID als Parameter übergeben wird, werden Chaincodeereignisse nur generiert, wenn der Parameter
events
in den entsprechenden Tokendetails auf "true" gesetzt ist. - Wenn mehrere Token-IDs als Parameter übergeben werden, werden Chaincode-Ereignisse nur generiert, wenn der Parameter
events
in einem der Tokendetails auf "true" gesetzt ist. - Wenn keine Token-ID als Parameter übergeben wird, werden Chaincode-Ereignisse immer generiert.
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 SDK-Methoden für Chaincode-Ereignisse