비계 TypeScript 체인코드 프로젝트

Blockchain App Builder는 사양 파일에서 입력을 가져와 완전한 기능을 갖춘 비계 체인 코드 프로젝트를 생성합니다. 프로젝트에는 자동으로 생성된 클래스 및 함수, CRUD 메소드, SDK 메소드, 인수의 자동 검증, 마셜링/마셜링 해제 및 ORM(투명한 지속성 기능)이 포함됩니다.

체인코드 프로젝트에서 TypeScript 언어를 사용하는 경우 스캐폴드 프로젝트에는 세 개의 기본 파일이 포함됩니다.
  • main.ts
  • <chaincodeName>.model.ts
  • <chaincodeName>.controller.ts
필요한 모든 라이브러리가 설치되고 패키지화됩니다. tsconfig.json 파일에는 TypeScript 프로젝트를 컴파일하고 빌드하는 데 필요한 구성이 포함되어 있습니다.

model 하위 디렉토리의 <chaincodeName>.model.ts 파일에는 여러 자산 정의가 포함되어 있으며 controller 하위 디렉토리의 <chaincodeName>.controller.ts 파일에는 자산 동작 및 CRUD 메소드가 포함됩니다.

model.tscontroller.ts의 다양한 데코레이터는 인수의 자동 검증, 인수 마셜링/마셜링 해제, ORM(투명한 지속성 기능) 및 풍부한 질의 호출과 같은 기능을 지원합니다.

모델

모든 모델 클래스는 assetType이라는 추가 읽기 전용 속성이 있는 OchainModel 클래스를 확장합니다. 이 속성은 이 유형의 자산만 인출하는 데 사용할 수 있습니다. 이 속성에 대한 모든 변경사항은 자산을 생성 및 업데이트하는 동안 무시됩니다. 기본적으로 등록정보 값은 <modelName>입니다.

OchainModel 클래스는 클래스의 속성에 데코레이터 동작을 적용합니다.
@Id('supplierId')
export class Supplier extends OchainModel<Supplier> {
    public readonly assetType = 'supplier';
    @Mandatory()
    @Validate(yup.string()) 
    public supplierId: string;

데코레이터

클래스 데코레이터
@Id(identifier)
이 데코레이터는 기본 자산을 고유하게 정의하는 속성을 식별합니다. 이 속성은 레코드의 키로 사용되며 체인 코드의 상태에서 이 자산을 나타냅니다. 이 데코레이터는 새 TypeScript 프로젝트가 스캐폴딩될 때 자동으로 적용됩니다. 데코레이터의 'identifier' 인수는 사양 파일에서 값을 가져옵니다.
@Id('supplierId')
export class Supplier extends OchainModel{
...
}
속성 데코레이터
여러 속성 데코레이터를 사용할 수 있습니다. 데코레이터는 위에서 아래로 순서대로 해결됩니다.
@Mandatory()
다음 속성을 필수로 표시하므로 원장에 저장하는 동안 건너뛸 수 없습니다. 건너뛰면 오류가 발생합니다.
@Mandatory()
public supplierID: string;
@Default(param)
이 등록 정보에는 기본값이 있을 수 있습니다. 인자(param)의 기본값은 원장에 저장하는 동안 속성을 건너뛸 때 사용됩니다.
@Default('open for business')
@Validate(yup.string())
public remarks: string;
@Validate(param)
다음 등록 정보는 매개변수에 제공된 스키마에 대해 검증됩니다. param 인수는 yup 스키마를 사용하며 여러 스키마 메소드를 함께 체인화할 수 있습니다. 여러 복잡한 검증을 추가할 수 있습니다. 자세한 내용은 https://www.npmjs.com/package/yup을 참조하십시오.
@Validate(yup.number().min(3))
public productsShipped: number;
@ReadOnly(param)
이 속성 데코레이터는 기본 속성을 읽기 전용 값으로 표시합니다. 인수의 값(예: param)은 등록정보가 원장에 저장될 때 사용됩니다. 값이 설정된 후에는 편집하거나 제거할 수 없습니다.
@ReadOnly('digicur')
public token_name: string;
@Embedded(PropertyClass)
이 속성 데코레이터는 기본 속성을 내장 가능한 자산으로 표시합니다. 내장 가능한 클래스를 파라미터로 사용합니다. 이 클래스는 EmbeddedModel 클래스를 확장해야 합니다. 이는 데코레이터에 의해 검증됩니다.
이 예에서 Employee에는 Employee 자산에 포함될 Address 유형의 address 속성이 있습니다. @Embedded() 데코레이터로 표시됩니다.
export class Employee extends OchainModel<Employee> {

   public readonly assetType = 'employee';

   @Mandatory()
   @Validate(yup.string())
   public emplyeeID: string;

   @Mandatory()
   @Validate(yup.string().max(30))
   public firstName: string;

   @Mandatory()
   @Validate(yup.string().max(30))
   public lastName: string;

   @Validate(yup.number().positive().min(18))
   public age: number;

   @Embedded(Address)
   public address: Address;
}
export class Address extends EmbeddedModel<Address> {

   @Validate(yup.string())
   public street: string;

   @Validate(yup.string())
   public city: string;

   @Validate(yup.string())
   public state: string;

   @Validate(yup.string())
   public country: string;
}
Address 클래스의 새 인스턴스가 생성되면 @Validate() 데코레이터가 Address 클래스의 모든 속성을 자동으로 검증합니다. Address 클래스에 assetType 속성 또는 @Id() 클래스 데코레이터가 없습니다. 이 자산 및 해당 속성은 원장에 별도로 저장되지 않지만 Employee 자산과 함께 저장됩니다. 포함된 자산은 값 유형으로 작동하는 사용자 정의 클래스입니다. 이 클래스의 인스턴스는 포함된 객체(OchainModel 자산)의 일부로 원장에만 저장할 수 있습니다. 위의 모든 데코레이터는 프로젝트를 스캐폴딩하는 동안 입력 파일에 따라 자동으로 적용됩니다.
@Derived(STRATEGY, ALGORITHM, FORMAT)
이 데코레이터는 다른 속성에서 파생된 속성을 정의하는 데 사용됩니다. 이 데코레이터에는 두 가지 필수 매개변수가 있습니다.
  • STRATEGY: CONCAT 또는 HASH 값을 사용합니다. HASH가 선택된 경우 추가 매개변수 ALGORITHM가 필요합니다. 기본 알고리즘은 sha256이고 md5도 지원됩니다.
  • FORMAT: 전략에서 사용할 사양 문자열 및 값 배열을 사용합니다.
@Id('supplierID')
export class Supplier extends OchainModel<Supplier> {

   public readonly assetType = 'supplier';

   @Mandatory()
   @Derived(STRATEGY.HASH.'sha256',['IND%1IND%2','license','name'])
   @Validate(yup.string())
   public supplierID: string;

   @Validate(yup.string().min(2).max(4))
   public license: string;

   @Validate(yup.string().min(2).max(4))
   public name: string;
메소드 데코레이터
@Validator(…params)
이 데코레이터는 주 컨트롤러 클래스의 메서드에 적용됩니다. 이 데코레이터는 인수를 구문 분석하고, 모든 속성 데코레이터에 대해 검증하고, 모델/유형 객체를 반환하는 데 중요합니다. 컨트롤러 메소드에는 이 데코레이터를 호출할 수 있어야 합니다. 사용자가 생성한 여러 모델 또는 yup 스키마를 매개변수로 사용합니다.
파라미터의 순서는 메소드의 인수 순서와 정확히 동일해야 합니다.
다음 예에서 Supplier 모델 참조는 메소드 인수의 asset 유형에 해당하는 매개변수로 전달됩니다. 런타임 시 데코레이터는 메소드 인수를 구문분석하고 JSON 객체로 변환하고, Supplier 검증기에 대해 검증하고, 검증이 성공하면 JSON 객체가 Supplier 객체로 변환되어 asset 변수에 지정됩니다. 그런 다음 기본 메소드가 최종적으로 호출됩니다.
@Validator(Supplier)
public async createSupplier(asset: Supplier) {
    return await this.Ctx.Model.save(asset);
}
다음 예에서는 여러 자산 참조가 전달됩니다. 이러한 참조는 메소드 인수의 객체 유형에 해당합니다. 파라미터 순서를 확인합니다.
@Validator(Supplier, Manufacturer)
public async createProducts(supplier: Supplier, manufacturer: Manufacturer) {
}
자산 참조 외에도 인수가 기본 유형인 경우 yup 스키마 객체를 전달할 수도 있습니다. 다음 예에서 supplierIdrawMaterialSupply의 유형은 각각 stringnumber이므로 유사한 유형 및 올바른 순서의 yup 스키마가 데코레이터에 전달됩니다. yup 스키마 메소드의 체인화를 확인합니다.
@Validator(yup.string(), yup.number().positive())
public async fetchRawMaterial(supplierID: string, rawMaterialSupply: number) {
	const supplier = await this.Ctx.Model.get(supplierID, Supplier);
	supplier.rawMaterialAvailable = supplier.rawMaterialAvailable + rawMaterialSupply;
	return await this.Ctx.Model.update(supplier);
}

ORM

투명한 지속성 기능 또는 단순화된 ORM은 컨텍스트(Ctx) 객체의 Model 클래스에 캡처됩니다. 모델이 다음 SDK 메소드 중 하나를 호출하는 경우 this.Ctx.Model를 사용하여 해당 메소드에 액세스합니다.

ORM을 구현하는 SDK 메소드는 다음과 같습니다.
  • save - Hyperledger Fabric putState 메소드를 호출합니다.
  • get - Hyperledger Fabric getState 메소드를 호출합니다.
  • update - Hyperledger Fabric putState 메소드를 호출합니다.
  • delete - Hyperledger Fabric deleteState 메소드를 호출합니다.
  • history - Hyperledger Fabric getHistoryForKey 메소드를 호출합니다.
  • getByRange - Hyperledger Fabric getStateByRange 메소드를 호출합니다.
  • getByRangeWithPagination - Hyperledger Fabric getStateByRangeWithPagination 메소드를 호출합니다.
자세한 내용은 SDK Methods을 참조하십시오.

SDK 메소드

주:

버전 21.3.2부터 ORM 메소드에 액세스하는 방법이 변경되었습니다. ochain --version 명령을 실행하여 Blockchain App Builder의 버전을 확인합니다.

이전 릴리스에서는 ORM 메소드가 OchainModel 클래스에서 상속되었습니다. 버전 21.3.2 이상에서 메소드는 Context(Ctx) 객체의 Model 클래스에 정의됩니다. 이러한 메소드를 호출하려면 this.Ctx.Model.<method_name>를 사용하여 해당 메소드에 액세스합니다.

다음 예제는 이전 릴리스의 메소드 호출을 보여줍니다.

@Validator(Supplier)
public async createSupplier(asset: Supplier){
    return await asset.save();
}

다음 예에서는 버전 21.3.2 이상의 메소드 호출을 보여 줍니다.

@Validator(Supplier)
public async createSupplier(asset: Supplier) {
      return await this.Ctx.Model.save(asset);
}

버전 21.3.2로 업그레이드한 후 이전 버전의 Blockchain App Builder로 생성한 모든 체인코드 프로젝트에서 이와 같이 변경합니다. sync 명령을 사용하여 사양 파일과 소스 코드 간의 변경사항을 동기화하면 즉시 사용 가능한 메소드에 대한 변경사항이 컨트롤러에 자동으로 적용됩니다. 계속해서 충돌을 수동으로 해결해야 합니다.

save
save 메소드는 호출자 asset 세부정보를 원장에 추가합니다.
이 메소드는 내부적으로 Hyperledger Fabric putState을 호출합니다. 모든 마셜링/마셜링 해제는 내부적으로 처리됩니다. save 메소드는 Model 클래스의 일부이며, Ctx 객체를 사용하여 액세스합니다.
Ctx.Model.save(asset: <Instance of Asset Class> , extraMetadata?: any) : Promise <any>
매개변수:
  • extraMetadata : any(선택 사항) - 자산과 별도로 메타데이터를 원장에 저장합니다.
반환값:
  • Promise<any> - 완료 시 약속 반환
예제:
@Validator(Supplier)
public async createSupplier(asset: Supplier) {
	return await this.Ctx.Model.save(asset);
}
get
get 메소드는 {chaincodeName}.model.ts의 실제 모델 클래스에 의해 상속되는 OchainModel 클래스의 메소드입니다. get 메소드는 Model 클래스의 일부이며, Ctx 객체를 사용하여 액세스합니다.
지정된 id까지 자산을 반환하려면 일반 컨트롤러 메소드 getAssetById를 사용합니다.
Ctx.Model.get(id: string, modelName: <Model Asset Class Name>) : Promise<asset>
매개변수:
  • id : string - 데이터를 원장에 저장하는 데 사용되는 키입니다.
  • modelName: <Model Asset Class Name> - (선택사항) 반환할 자산 클래스를 모델링합니다.
반환값:
  • Promise: <Asset> - modelName 매개변수가 제공되지 않고 데이터가 원장에 있는 경우 Promise<object>가 반환됩니다. id 매개변수가 원장에 없으면 오류 메시지가 반환됩니다. modelName 매개변수를 제공할 경우 <Asset> 유형의 객체가 반환됩니다. 지정된 id의 자산이 원장에서 반환되더라도 이 메소드는 호출자 Asset 유형으로 캐스팅을 처리합니다. 원장에서 반환된 자산이 Asset 유형이 아닌 경우 오류가 발생합니다. 이 검사는 Model 클래스의 읽기 전용 assetType 등록 정보에 의해 수행됩니다.
예제:
@Validator(yup.string())
public async getSupplierById(id: string) {
	const asset = await this.Ctx.Model.get(id, Supplier);
	return asset;
}
예제에서 asset의 유형은 Supplier입니다.
update
update 메소드는 원장의 호출자 asset 세부정보를 업데이트합니다. 이 메소드는 promise를 반환합니다.
이 메소드는 내부적으로 Hyperledger Fabric putState을 호출합니다. 모든 마샬링/마셜링 해제는 내부적으로 처리됩니다. update 메소드는 Model 클래스의 일부이며, Ctx 객체를 사용하여 액세스할 수 있습니다.
Ctx.Model.update(asset: <Instance of Asset Class> , extraMetadata?: any) : Promise <any>
매개변수:
  • extraMetadata : any(선택 사항) - 자산과 별도로 메타데이터를 원장에 저장합니다.
반환값:
  • Promise<any> - 완료 시 약속 반환
예제:
@Validator(Supplier)
public async updateSupplier(asset: Supplier) {
	return await this.Ctx.Model.update(asset);
}
delete
id가 제공한 원장(있는 경우)에서 자산을 삭제합니다. 이 메소드는 내부적으로 Hyperledger Fabric deleteState 메소드를 호출합니다. delete 메소드는 Model 클래스의 일부이며, Ctx 객체를 사용하여 액세스할 수 있습니다.
Ctx.Model.delete(id: string): Promise <any>
매개변수:
  • id : string - 데이터를 원장에 저장하는 데 사용되는 키입니다.
반환값:
  • Promise <any> - 완료 시 약속을 반환합니다.
예제:
@Validator(yup.string())
public async deleteSupplier(id: string) {
	const result = await this.Ctx.Model.delete(id);
	return result;
}
history
history 메소드는 Model 클래스의 일부이며, Ctx 객체를 사용하여 액세스할 수 있습니다. 이 메소드는 id에 의해 제공된 자산 내역을 원장에서 반환합니다(있는 경우).
이 메소드는 내부적으로 Hyperledger Fabric getHistoryForKey 메소드를 호출합니다.
Ctx.Model.history(id: string): Promise <any>
매개변수:
  • id : string - 데이터를 원장에 저장하는 데 사용되는 키입니다.
반환값:
  • Promise <any[]> - 완료 시 []를 반환합니다.
@Validator(yup.string())
public async getSupplierHistoryById(id: string) {
	const result = await this.Ctx.Model.history(id);
	return result;
}
getSupplierHistoryById에 대해 반환된 자산 내역의 예:
[
    {
        "trxId": "8ef4eae6389e9d592a475c47d7d9fe6253618ca3ae0bcf77b5de57be6d6c3829",
        "timeStamp": 1602568005,
        "isDelete": false,
        "value": {
            "assetType": "supplier",
            "supplierId": "s01",
            "rawMaterialAvailable": 10,
            "license": "abcdabcdabcd",
            "expiryDate": "2020-05-28T18:30:00.000Z",
            "active": true
        }
    },
    {
        "trxId": "92c772ce41ab75aec2c05d17d7ca9238ce85c33795308296eabfd41ad34e1499",
        "timeStamp": 1602568147,
        "isDelete": false,
        "value": {
            "assetType": "supplier",
            "supplierId": "s01",
            "rawMaterialAvailable": 15,
            "license": "valid license",
            "expiryDate": "2020-05-28T18:30:00.000Z",
            "active": true
        }
    }
]
getByRange
getByRange 메소드는 {chaincodeName}.model.ts의 구체적 Model 클래스에 의해 상속되는 OchainModel 클래스의 정적 메소드입니다.
그러면 startIdendId 사이의 자산 목록이 반환됩니다. 이 메소드는 내부적으로 Hyperledger Fabric getStateByRange 메소드를 호출합니다.
modelName 매개변수를 제공하지 않으면 메소드는 Promise<Object [ ] >를 반환합니다. modelName 매개변수가 제공된 경우 이 메소드는 호출자 Model 유형으로 변환을 처리합니다. 다음 예에서 결과 배열의 유형은 Supplier입니다. 원장에서 반환된 자산이 Model 유형이 아닌 경우 목록에 포함되지 않습니다. 이 검사는 Model 클래스의 읽기 전용 assetType 등록 정보에 의해 수행됩니다.
startIdendId 사이의 모든 자산을 반환하려면 일반 컨트롤러 메소드 getAssetsByRange를 사용합니다.
Ctx.Model.getByRange(startId: string, endId: string, modelName: <Asset Model Class Name> ): Promise <any>
매개변수:
  • startId : string - 범위의 시작 키입니다. 범위에 포함됩니다.
  • endId : string - 범위의 종료 키입니다. 범위에서 제외되었습니다.
  • modelName: <Model Asset Class Name> - (선택사항) 반환할 자산 클래스를 모델링합니다.
반환값:
  • Promise< Asset[ ] > - 완료 시 <Asset> 배열을 반환합니다.
예제:
@Validator(yup.string(), yup.string())
public async getSupplierByRange(startId: string, endId: string) {
	const result = await this.Ctx.Model.getByRange(startId, endId, Supplier);
	return result;
}
getByRangeWithPagination
getByRangeWithPagination 메소드는 {chaincodeName}.model.ts의 구체적 Model 클래스에 의해 상속되는 OchainModel 클래스의 정적 메소드입니다.
그러면 startIdendId 사이의 자산 목록이 반환됩니다. 이 메소드는 내부적으로 Hyperledger Fabric getStateByRangeWithPagination 메소드를 호출합니다.
modelName 매개변수를 제공하지 않으면 메소드는 Promise<Object [ ] >를 반환합니다. modelName 매개변수가 제공된 경우 이 메소드는 호출자 Model 유형으로 변환을 처리합니다. 다음 예에서 결과 배열의 유형은 Supplier입니다. 원장에서 반환된 자산이 Model 유형이 아닌 경우 목록에 포함되지 않습니다. 이 검사는 Model 클래스의 읽기 전용 assetType 등록 정보에 의해 수행됩니다.
페이지 크기 및 책갈피로 필터링된 startIdendId 범위 사이의 모든 자산을 반환하려면 일반 컨트롤러 메소드 getAssetsByRange를 사용합니다.
public async getByRangeWithPagination<T extends OchainModel<T>>(startId: string, endId: string, pageSize: number, bookmark?: string, instance?: new (data: any, skipMandatoryCheck: boolean, skipReadOnlyCheck: boolean) => T): Promise<T[]>
매개변수:
  • startId : string - 범위의 시작 키입니다. 범위에 포함됩니다.
  • endId : string - 범위의 종료 키입니다. 범위에서 제외됩니다.
  • pageSize : number - 질의의 페이지 크기입니다.
  • bookmark : string - 질의의 책갈피입니다. 출력은 이 책갈피에서 시작됩니다.
  • modelName: <Model Asset Class Name> - (선택사항) 반환할 자산 클래스를 모델링합니다.
반환값:
  • Promise< Asset[ ] > - 완료 시 <Asset> 배열을 반환합니다.
getId
자산의 파생 키가 ID인 경우 이 방법을 사용하여 파생 ID를 가져올 수 있습니다. 파생 키에 %t(시간 기록)이 포함된 경우 이 메소드는 오류를 반환합니다.
매개변수:
  • object - 객체에는 파생된 키가 종속된 모든 속성이 포함되어야 합니다.
반환값:
  • 파생된 키를 문자열로 반환합니다.
예제:
@Validator(yup.string(), yup.string())
  
public async customGetterForSupplier(license: string, name: string){
    let object = {
      license : license,
      name: name
    }
    const id = await this.Ctx.Model.getID(object);
    return this.Ctx.Model.get(id);
}

토큰 SDK 방법은 블록체인 앱 빌더를 사용한 토큰화 지원에서 항목을 참조하십시오.

컨트롤러

기본 컨트롤러 클래스는 OchainController를 확장합니다. 하나의 주 컨트롤러만 있습니다.

export class TSProjectController extends OchainController{

클래스, 함수 또는 파일을 원하는 만큼 만들 수 있지만 주 제어기 클래스 내에 정의된 메서드만 외부에서 호출할 수 있으며 나머지 메서드는 숨겨집니다.

자동으로 생성된 메소드

입력 사양 파일에 설명된 대로 사양 파일에서 생성할 CRUD 메소드를 지정할 수 있습니다. 예를 들어, 모든 메소드를 생성하도록 선택한 경우 결과는 다음과 유사합니다.

@Validator(Supplier)
public async createSupplier(asset: Supplier) {
	return await this.Ctx.Model.save(asset);
}

@Validator(yup.string())
public async getSupplierById(id: string) {
	const asset = await this.Ctx.Model.get(id, Supplier);
	return asset;
}

@Validator(Supplier)
public async updateSupplier(asset: Supplier) {
	return await this.Ctx.Model.update(asset);
}

@Validator(yup.string())
public async deleteSupplier(id: string) {
	const result = await this.Ctx.Model.delete(id);
	return result;
}

@Validator(yup.string())
public async getSupplierHistoryById(id: string) {
	const result = await this.Ctx.Model.history(id);
	return result;
}

@Validator(yup.string(), yup.string())
public async getSupplierByRange(startId: string, endId: string) {
	const result = await this.Ctx.Model.getByRange(startId, endId, Supplier);
	return result;
}

컨트롤러 메소드 세부정보

위의 모델 CRUD 및 비 CRUD 방법 외에도 Blockchain App Builder는 컨트롤러의 다른 Hyperledger Fabric 방법에 대한 즉각적인 지원을 제공합니다. 다음과 같은
  • getAssetById
  • getAssetsByRange
  • getAssetHistoryById
  • query
  • queryWithPagination
  • generateCompositeKey
  • getByCompositeKey
  • getTransactionId
  • getTransactionTimestamp
  • getChannelID
  • getCreator
  • getSignedProposal
  • getArgs
  • getStringArgs
  • getMspID
  • getNetworkStub

주:

이러한 메소드는 OChainController 클래스를 확장하는 모든 클래스의 this 컨텍스트에서 사용할 수 있습니다.
예:
public async getModelById(id: string) {   
    const asset = await this.getAssetById(id); 
    return asset;
}
@Validator(yup.string(), yup.string())
public async getModelsByRange(startId: string, endId: string) { 
    const asset = await this.getAssetsByRange(startId, endId); 
    return asset;
}
public async getModelHistoryById(id: string) {
    const result = await this.getAssetHistoryById(id); 
    return result;
}
getAssetById
getAssetById 메소드는 제공된 id을 기반으로 자산을 반환합니다. 이것은 일반적인 방법이며 모든 유형의 자산을 얻는 데 사용됩니다.
this.getAssetById(id: string): Promise<byte[]>
매개변수:
  • id : string - 데이터를 원장에 저장하는 데 사용되는 키입니다.
반환값:
  • Promise <byte [ ]> - 완료 시 반품 약속입니다. byte[]를 객체로 변환해야 합니다.
getAssetsByRange
getAssetsByRange 메소드는 자산 유형에 관계없이 startId(포함)에서 endId(제외)로 제공된 모든 자산을 반환합니다. 이것은 일반적인 방법이며 모든 유형의 자산을 얻는 데 사용할 수 있습니다.
this.getAssetsByRange(startId: string, endId: string):
Promise<shim.Iterators.StateQueryIterator>
매개변수:
  • startId : string - 범위의 시작 키입니다. 범위에 포함됩니다.
  • endId : string - 범위의 종료 키입니다. 범위에서 제외되었습니다.
반환값:
  • Promise< shim.Iterators.StateQueryIterator> - 완료 시 이터레이터를 반환합니다. 당신은 그것을 반복해야합니다.
getAssetHistoryById
getAssetHistoryById 메소드는 제공된 id에 대한 자산의 내역 이터레이터를 반환합니다.
this.getAssetHistoryById(id: string):
Promise<shim.Iterators.HistoryQueryIterator>
매개변수:
  • id : string - 데이터를 원장에 저장하는 데 사용되는 키입니다.
반환값:
  • Promise<shim.Iterators.HistoryQueryIterator> - 내역 질의 이터레이터를 반환합니다. 당신은 그것을 반복해야합니다.
query
query 메소드는 원장을 통해 Rich SQL/Couch DB 쿼리를 실행합니다. 이 방법은 Oracle Blockchain Platform의 원격 배포에만 지원됩니다. 이 방법은 원장에서 SQL 질의를 실행하는 일반적인 방법입니다.
this.query(queryStr: string):
Promise<shim.Iterators.StateQueryIterator>
매개변수:
  • queryStr : string - 풍부한 SQL/Couch DB 쿼리.
반환값:
  • Promise<shim.Iterators.StateQueryIterator> - 상태 질의 이터레이터를 반환합니다. 당신은 그것을 반복해야합니다.
queryWithPagination
이 방법은 원장별로 페이지 크기 및 책갈피별로 필터링된 Rich SQL/Couch DB 쿼리를 실행합니다. 이 방법은 Oracle Blockchain Platform의 원격 배포에만 지원됩니다. 이 방법은 원장에서 SQL 질의를 실행하는 일반적인 방법입니다.
public async queryWithPagination(query: string, pageSize: number, bookmark?: string)
매개변수:
  • query : string - 풍부한 SQL/Couch DB 쿼리.
  • pageSize : number - 질의의 페이지 크기입니다.
  • bookmark : string - 질의의 책갈피입니다. 출력은 이 책갈피에서 시작됩니다.
반환값:
  • Promise<shim.Iterators.StateQueryIterator> - 상태 질의 이터레이터를 반환합니다. 당신은 그것을 반복해야합니다.
generateCompositeKey
이 메소드는 indexName 및 인수에 제공된 속성을 기반으로 조합 키를 생성하고 반환합니다.
this.generateCompositeKey(indexName: string, attributes:
string[]): string
매개변수:
  • indexName : string - 데이터를 원장에 저장하는 데 사용되는 키의 객체 유형입니다.
  • attributes: string[ ] - 구성될 조합 키를 기반으로 하는 속성입니다.
반환값:
  • string - 조합 키를 반환합니다.
getByCompositeKey
이 메소드는 조합 키를 생성하는 동안 속성 매개변수에 제공된 키 및 열과 일치하는 자산을 반환합니다. indexOfId 매개변수는 stub 메소드 SplitCompositeKey의 배열에서 반환된 키의 인덱스를 나타냅니다. 내부적으로 이 메소드는 Hyperledger Fabric의 getStateByPartialCompositeKey, splitCompositeKeygetState를 호출합니다.
this.getByCompositeKey(key: string, columns: string[],
indexOfId: number): Promise<any []>
매개변수:
  • key: string - 데이터를 원장에 저장하는 데 사용되는 키입니다.
  • columns: string[ ] - 키 기반 속성이 생성됩니다.
  • indexOfId: number - 키에서 검색할 속성의 인덱스입니다.
반환값:
  • Promise< any [ ] - 완료 시 []를 반환합니다.
getTransactionId
현재 체인코드 호출 요청에 대한 트랜잭션 ID를 반환합니다. 트랜잭션 ID는 채널 범위 내에서 트랜잭션을 고유하게 식별합니다.
this.getTransactionId(): string
매개변수:
  • 없음
반환값:
  • string - 현재 체인코드 호출 요청에 대한 트랜잭션 ID를 반환합니다.
getTransactionTimestamp
트랜잭션이 생성된 시간 기록을 반환합니다. 이는 거래 ChannelHeader에서 가져오므로 클라이언트의 타임스탬프를 나타내며 모든 보증인 간에 동일한 값을 갖습니다.
this.getTransactionTimestamp(): Timestamp
매개변수:
  • id : string - 데이터를 원장에 저장하는 데 사용되는 키입니다.
반환값:
  • Timestamp - 트랜잭션이 생성된 시간 기록을 반환합니다.
getChannelID
처리할 체인 코드 제안에 대한 채널 ID를 반환합니다.
this.getChannelID(): string
매개변수:
  • 없음
반환값:
  • string - 채널 ID를 반환합니다.
getCreator
체인코드 호출 제출자의 ID 객체를 반환합니다.
this.getCreator(): shim.SerializedIdentity
매개변수:
  • 없음
반환값:
  • shim.SerializedIdentity - ID 객체를 반환합니다.
getSignedProposal
서명된 트랜잭션 제안의 완전히 디코딩된 객체를 반환합니다.
this.getSignedProposal():
shim.ChaincodeProposal.SignedProposal
매개변수:
  • 없음
반환값:
  • shim.ChaincodeProposal.SignedProposal - 서명된 트랜잭션 제안의 디코딩된 객체를 반환합니다.
getArgs
인수를 체인코드 호출 요청의 문자열 배열로 반환합니다.
this.getArgs(): string[]
매개변수:
  • 없음
반환값:
  • string [ ] - 인수를 체인코드 호출에서 문자열 배열로 반환합니다.
getStringArgs
인수를 체인코드 호출 요청의 문자열 배열로 반환합니다.
this.getStringArgs(): string[]
매개변수:
  • 없음
반환값:
  • string [ ] - 인수를 체인코드 호출에서 문자열 배열로 반환합니다.
getMspID
호출 ID의 MSP ID를 반환합니다.
this.getMspID(): string
매개변수:
  • 없음
반환값:
  • string - 호출 ID의 MSP ID를 반환합니다.
getNetworkStub
사용자는 getNetworkStub 메소드를 호출하여 shim stub에 액세스할 수 있습니다. 이렇게 하면 사용자가 자산과 직접 작업하는 자체 구현을 작성하는 데 도움이 됩니다.
this.getNetworkStub(): shim.ChaincodeStub
매개변수:
  • 없음
반환값:
  • shim.ChaincodeStub - 체인코드 네트워크 스텁을 반환합니다.
invokeCrossChaincode
체인 코드에서 이 메소드를 사용하여 다른 체인 코드에서 함수를 호출할 수 있습니다. 두 체인코드는 동일한 피어에 설치되어야 합니다.
this.invokeCrossChaincode(chaincodeName: string, methodName: string, args: string[], channelName: string): Promise<any>
매개변수:
  • chaincodeName - 호출할 체인 코드의 이름입니다.
  • methodName - 체인 코드에서 호출할 메소드의 이름입니다.
  • arg - 호출 메소드의 인수입니다.
  • channelName - 호출할 체인 코드가 있는 채널입니다.
반환값:
  • Promise<any> - 세 개의 필드를 포함하는 JSON 객체를 반환합니다.
    • isValid - 호출이 적합한 경우 true입니다.
    • payload - 교차 체인 코드 호출에 의해 JSON 객체로 반환된 출력입니다.
    • message - 체인 코드 간 호출에 의해 UTF-8 형식으로 반환된 메시지입니다.
invokeChaincode
체인 코드에서 이 메소드를 사용하여 다른 체인 코드에서 함수를 호출할 수 있습니다. 두 체인코드는 동일한 피어에 설치되어야 합니다.
this.invokeChaincode(chaincodeName: string, methodName: string, args: string[], channelName: string): Promise<any>
매개변수:
  • chaincodeName - 호출할 체인 코드의 이름입니다.
  • methodName - 체인 코드에서 호출할 메소드의 이름입니다.
  • arg - 호출 메소드의 인수입니다.
  • channelName - 호출할 체인 코드가 있는 채널입니다.
반환값:
  • Promise<any> - 세 개의 필드를 포함하는 JSON 객체를 반환합니다.
    • isValid - 호출이 적합한 경우 true입니다.
    • payload - 교차 체인 코드 호출에 의해 JSON 객체로 반환된 출력입니다.
    • message - 체인 코드 간 호출에 의해 UTF-8 형식으로 반환된 메시지입니다.

사용자정의 방법

예제 사양 파일에서 생성된 사용자정의 메소드는 다음과 같습니다.

executeQuery는 SQL 서식 있는 질의를 호출하는 방법을 보여줍니다. 인수에 대한 검증자는 사양 파일에 지정된 인수의 유형에 따라 Blockchain App Builder에 의해 자동으로 추가됩니다.


/**
*
*	BDB sql rich queries can be executed in OBP CS/EE.
*	This method can be invoked only when connected to remote OBP CS/EE network.
*
*/
@Validator(yup.string()}
public async executeQuery(query: string) {
    const result = await OchainController.query(query); 
    return result;
}
@Validator(yup.string(), yup.number()}
public async fetchRawMaterial(supplierId: string, rawMaterialSupply: number) {
}
@Validator(yup.string(), yup.string(), yup.number())
public async getRawMaterialFromSupplier(manufacturerId: string, supplierId: string, rawMaterialSupply: number) {
}
@Validator(yup.string(), yup.number(), yup.number())
public async createProducts(manufacturerId: string, rawMaterialConsumed: number, productsCreated: number) {
}
public async sendProductsToDistribution() { 
}

초기화 메소드

사용자 정의 init 메소드가 컨트롤러에 빈 정의와 함께 제공됩니다. Blockchain App Builder를 사용하여 배포 또는 업그레이드하는 경우 init 메서드가 자동으로 호출됩니다. Hyperledger Fabric v1.4.7 플랫폼의 Oracle Blockchain Platform 콘솔에서 배포하거나 업그레이드하는 경우 init 메소드도 자동으로 호출됩니다. Hyperledger Fabric v2.x 플랫폼의 Oracle Blockchain Platform 콘솔에서 배포하거나 업그레이드하는 경우 init 메소드를 수동으로 호출해야 합니다. Postman과 같은 타사 도구를 사용하여 init 메소드를 수동으로 호출할 수 있습니다.

export class TestTsProjectController extends OchainController {
    public async init(params: any) { 
        return;
}

이 시점에서 응용 프로그램 상태를 초기화하려면 이 방법을 사용하면 됩니다.