체인코드 이벤트
향상된 버전의 Blockchain App Builder는 토큰 작업에 대한 체인코드 이벤트를 생성할 수 있습니다.
체인코드 이벤트는 트랜잭션이 실행될 때 내보내는 특정 통지입니다. 이벤트에는 블록체인 원장 상태의 특정 조건 또는 변경 사항에 대해 외부 시스템에 통지하는 데 사용할 수 있는 트랜잭션 정보가 포함됩니다. 체인코드 이벤트를 사용하여 블록체인에 없는 애플리케이션과의 실시간 통합 및 상호 작용을 가능하게 하고, 블록체인 환경 전반에서 이벤트 기반 워크플로우 및 모니터링을 용이하게 할 수 있습니다. 체인코드 이벤트에는 이벤트 이름과 페이로드라는 두 가지 구성요소가 있습니다.
체인코드 이벤트는 모든 Blockchain App Builder 사양 파일에 대해 지원됩니다. 체인코드 이벤트를 사용으로 설정하면 비계산된 프로젝트의 모든 컨트롤러 기능이 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...)
}
체인코드 이벤트는 이름 및 페이로드 구성요소에 대해 다음 기본값을 사용합니다. 필요에 따라 기본값을 수정할 수 있습니다.
events
매개변수가 추가되었습니다. 사양 파일의 events
매개변수가 true로 설정된 경우 생성된 토큰의 events
매개변수가 true로 설정됩니다. 사양 파일의 events
매개변수가 false로 설정되거나 정의되지 않은 경우 생성된 토큰의 events
매개변수가 false로 설정됩니다. 다음 예에서는 TypeScript 및 Go에 대한 새 events
매개변수가 포함된 토큰을 보여줍니다.{
"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"
}
이벤트 생성
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.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);
}
다중 자산에 대한 체인코드 이벤트
향상된 토큰 분류법 프레임워크 및 ERC-1155 표준은 사양 파일에서 둘 이상의 토큰 자산 정의를 지원합니다. 체인코드 이벤트 동작은 메소드가 토큰에 특정적인지(예: 토큰 생성 또는 업데이트) 아니면 공통적인지(예: 민트 또는 레코딩)에 따라 다릅니다.
토큰별 메소드의 경우 사양 파일에서 events
매개변수가 true
로 설정된 토큰에 대해서만 체인코드 이벤트가 생성됩니다.
공통 메소드의 경우 사양 파일에서 토큰의 events
매개변수가 true
로 설정된 경우 비계 프로젝트에서는 체인코드 이벤트가 생성됩니다. 실제 체인코드 이벤트 동작은 메소드에 전달된 토큰 ID 매개변수의 수를 기반으로 합니다.
- 단일 토큰 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: 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 메소드
체인코드 이벤트에 대한 이동 SDK 메소드
블록체인 앱 빌더 체인코드의 이벤트 생성
사양 파일의events
매개변수가 true로 설정된 경우 getter API로 지정된 API를 제외한 모든 컨트롤러 API에 대해 체인코드 이벤트 코드가 생성됩니다. 다음 예에서는 TypeScript 및 Go에 대해 체인코드 이벤트가 사용으로 설정된 컨트롤러 API를 보여줍니다.@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...)
}
체인코드 이벤트는 다음 기본값으로 생성됩니다. 필요한 경우 이러한 값을 수정할 수 있습니다.EventName
: 컨트롤러 함수의 이름입니다.Payload
: 컨트롤러 함수의 모든 입력 매개변수를 포함하는 JSON 객체입니다.