チェーンコード・イベント
ブロックチェーン・アプリケーション・ビルダーの拡張バージョンでは、トークン操作のチェーンコード・イベントを生成できます。ブロックチェーン・アプリケーション・ビルダーの拡張バージョンは、Oracle Blockchain Platform Digital Assets Editionにバンドルされています。
チェーンコード・イベントは、トランザクションの実行時に発行される特定の通知です。イベントには、特定の条件やブロックチェーン台帳状態の変更について外部システムに通知するために使用できるトランザクション情報が含まれます。チェーンコード・イベントを使用して、ブロックチェーン上にないアプリケーションとのリアルタイム統合および対話を有効にし、ブロックチェーン環境全体のイベント駆動型ワークフローおよび監視を容易にできます。チェーンコード・イベントには、イベント名とペイロードの2つのコンポーネントがあります。
チェーンコード・イベントは、すべてのブロックチェーン・アプリケーション・ビルダー仕様ファイルでサポートされています。チェーンコード・イベントを有効にすると、スキャフォールドされたプロジェクトのすべてのコントローラ関数がイベントを発行します(getterメソッドを除く)。たとえば、トークン・シナリオでは、トークンがミント、転送、バーンまたはロックされたときにチェーンコード・イベントが発行されます
次の例に示すように、仕様ファイルでブール型のeventsパラメータを使用して、チェーンコード・イベントを有効にします。
assets:
- name: FiatMoneyTOK # Asset name
type: token # Asset type
events: true # Generate events for create, update and delete APIsイベントを有効にすると、次の例に示すように、スキャフォールドされたチェーンコード・プロジェクトのコントローラ関数にイベント作成メソッドが含まれます。
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);
}移動:
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...)
}チェーンコード・イベントでは、名前およびペイロード・コンポーネントに次のデフォルト値が使用されます。デフォルト値は必要に応じて変更できます。
拡張トークン・タクソノミ・フレームワークおよびERC-1155標準には、トークン詳細にeventsパラメータが含まれます。仕様ファイルのeventsパラメータがtrueに設定されている場合、生成されたトークンのeventsパラメータはtrueに設定されます。仕様ファイルのeventsパラメータがfalseに設定されている場合、または定義されていない場合、生成されたトークンのeventsパラメータはfalseに設定されます。次の例は、TypeScriptとGoの両方の新しいeventsパラメータを持つトークンを示しています。
TypeScript:
{
"metadata": {
"paintingName": "monalisa",
"description": "monalisa painting",
"image": "image link",
"painterName": "Leonardo da Vinci"
},
"assetType": "otoken",
"events": true,
"quantity": 1,
"tokenId": "1",
"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": "23",
"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"
}イベントを生成中
stub.setEventメソッドを使用すると、チェーンコードはトランザクションの実行時にイベントを作成および発行できます。次のコードは、メソッドのTypeScriptバージョンを示しています。async setEvent(eventName: string, payload: Buffer): Promise<void>この例では、eventNameがイベントに割り当てる名前で、payloadがイベントに関連付けられたデータです。ペイロードには、イベントとともに送信する情報(通常はJSON形式でシリアライズされる)を含めることができます。
バッチ方法のチェーンコード・イベント
拡張ERC-1155規格はバッチ方式をサポートしています。バッチ・メソッドは、パラメータとして渡される複数のトークンを操作します。バッチ・メソッドの場合、チェーンコード・イベントは、仕様ファイルでeventsパラメータがtrueに設定されているトークンに対してのみ発行されます。
バッチ・メソッドで完了したトランザクションごとに、対応するチェーンコード・イベントが生成されます。各チェーンコード・イベントのペイロードには、トランザクションの詳細が含まれます。たとえば、BatchTransferメソッドを使用して5つの異なるトークンの数量を転送すると、対応する5つのチェーンコード・イベントが発行されます。各イベントのペイロードには、すべてのバッチ転送に適用可能な共通パラメータとともに、トークン詳細および転送済数量が含まれます。
@Validator(yup.string(), yup.string(), yup.string(), yup.string(), yup.array().of(yup.number()), yup.array().of(yup.number()))
public async batchTransferFrom(
fromOrgId: string,
fromUserId: string,
toOrgId: string,
toUserId: string,
tokenIds: number[],
quantity: number[]
) {
const tokenIdsStr = this.Ctx.Utils.convertToString(tokenIds);
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 < tokenIdsStr.length; i++) {
const tokenAsset = await this.Ctx.ERC1155Token.get(tokenIdsStr[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, tokenIdsStr, quantity);
}複数資産のチェーンコード・イベント
拡張されたトークン・タクソノミ・フレームワークおよびERC-1155標準では、仕様ファイルに複数のトークン・アセットを定義することがサポートされています。チェーンコード・イベントの動作は、メソッドがトークン固有(トークンの作成や更新など)であるか、共通(ミントや書き込みなど)であるかによって異なります。
トークン固有のメソッドの場合、チェーンコード・イベントは、仕様ファイルでeventsパラメータがtrueに設定されているトークンに対してのみ生成されます。
一般的なメソッドの場合、チェーンコード・イベントは、仕様ファイルでeventsパラメータがtrueに設定されているトークンがある場合に、スキャフォールド・プロジェクトで生成されます。実際のチェーンコード・イベントの動作は、メソッドに渡されるトークンIDパラメータの数に基づきます。
- 1つのトークンIDがパラメータとして渡されると、対応するトークン詳細の
eventsパラメータがtrueに設定されている場合にのみ、チェーンコード・イベントが生成されます。 - 複数のトークンIDがパラメータとして渡される場合、トークン詳細のいずれかの
eventsパラメータがtrueに設定されている場合にのみ、チェーンコード・イベントが生成されます。 - パラメータとしてトークンIDが渡されない場合、チェーンコード・イベントが常に生成されます。
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: number, fromOrgId: string, fromUserId: string, fromTokenQuantity: number, toTokenId: number, 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メソッド