체인코드 이벤트

향상된 버전의 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...)
}

체인코드 이벤트는 이름 및 페이로드 구성요소에 대해 다음 기본값을 사용합니다. 필요에 따라 기본값을 수정할 수 있습니다.

EventName
컨트롤러 함수의 이름입니다.
페이로드
컨트롤러 함수의 모든 입력 매개변수를 포함하는 JSON 객체입니다.
확장된 토큰 분류법 프레임워크 및 ERC-1155 표준의 토큰 세부정보에도 새 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개의 해당 체인코드 이벤트가 내보내집니다. 각 이벤트의 페이로드에는 모든 뱃치 이전에 적용할 수 있는 공통 매개변수와 함께 토큰 세부정보 및 이전된 수량이 포함됩니다.

다음 예에서는 향상된 ERC-1155 표준을 사용하는 이벤트 코드를 보여줍니다.
@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)
이 목록은 확장된 ERC-1155 표준에 대한 인수로 토큰을 사용하지 않는 일반적인 방법을 보여줍니다.
  • 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 메소드

createEvent
이 메소드는 지정된 이벤트 이름 및 페이로드를 기반으로 이벤트를 생성합니다.
public async createEvent(eventName: any, eventPayload: any, assets?: any)
매개변수:
  • eventName: string – 이벤트를 생성할 때 사용할 이벤트 이름입니다.
  • eventPayload: map[string]interface{} – 이벤트를 생성할 때 사용할 이벤트 페이로드입니다.
  • assets – 선택적으로 토큰 자산을 메소드에 매개변수로 전달할 수 있습니다.
createEventForBatch
이 메소드는 mintBatch 또는 burnBatch 메소드와 같은 일괄 처리 작업에 대한 이벤트를 생성합니다.
public async createEventForBatch(eventName: any, eventPayload: any, quantities: number[], assets: any)
매개변수:
  • eventName: string – 이벤트를 생성할 때 사용할 이벤트 이름입니다.
  • eventPayload: map[string]interface{} – 이벤트를 생성할 때 사용할 이벤트 페이로드입니다.
  • quantities: number[] – 일괄 처리 메소드 트랜잭션에서 사용할 토큰 수를 나타내는 각 토큰 ID에 해당하는 금액 목록입니다.
  • assets – 선택적으로 토큰 자산을 메소드에 매개변수로 전달할 수 있습니다.

체인코드 이벤트에 대한 이동 SDK 메소드

CreateEvent
이 메소드는 지정된 이벤트 이름 및 페이로드를 기반으로 이벤트를 생성합니다.
func (m *Model) CreateEvent(eventName string, eventPayload map[string]interface{}, assets ...interface{})
매개변수:
  • eventName: string – 이벤트를 생성할 때 사용할 이벤트 이름입니다.
  • eventPayload: map[string]interface{} – 이벤트를 생성할 때 사용할 이벤트 페이로드입니다.
  • assets – 선택적으로 토큰 자산을 메소드에 매개변수로 전달할 수 있습니다.
CreateEventForBatch
이 메소드는 mintBatch 또는 burnBatch 메소드와 같은 일괄 처리 작업에 대한 이벤트를 생성합니다.
func (m *Model) CreateEventForBatch(eventName string, eventPayload map[string]interface{}, quantities []float64, assets []interface{})
매개변수:
  • eventName: string – 이벤트를 생성할 때 사용할 이벤트 이름입니다.
  • eventPayload: map[string]interface{} – 이벤트를 생성할 때 사용할 이벤트 페이로드입니다.
  • quantities: []float64 – 일괄 처리 메소드 트랜잭션에서 사용할 토큰 수를 나타내는 각 토큰 ID에 해당하는 금액 목록입니다.
  • assets – 선택적으로 토큰 자산을 메소드에 매개변수로 전달할 수 있습니다.

블록체인 앱 빌더 체인코드의 이벤트 생성

사양 파일의 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 객체입니다.