비계 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)
이 속성 데코레이터는 기본 속성을 포함할 수 있는 자산으로 표시합니다. embeddable 클래스를 파라미터로 사용합니다. 이 클래스는 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 클래스의 새 인스턴스가 생성되면 Address 클래스의 모든 속성이 @Validate() 데코레이터에 의해 자동으로 검증됩니다. 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) {
}
자산 참조 외에도 인수가 basic-types인 경우 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 메소드는 Ctx 객체를 사용하여 액세스하는 Model 클래스의 일부입니다.
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 메소드는 Ctx 객체를 사용하여 액세스하는 Model 클래스의 일부입니다.
지정된 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;
}
예제에서 assetSupplier 유형입니다.
update
update 메소드는 원장의 호출자 asset 세부정보를 업데이트합니다. 이 메소드는 약속을 반환합니다.
이 메소드는 내부적으로 Hyperledger Fabric putState을 호출합니다. 모든 마셜링/마셜링은 내부적으로 처리됩니다. update 메소드는 Ctx 객체를 사용하여 액세스할 수 있는 Model 클래스의 일부입니다.
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 메소드는 Ctx 객체를 사용하여 액세스할 수 있는 Model 클래스의 일부입니다.
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 메소드는 Ctx 객체를 사용하여 액세스할 수 있는 Model 클래스의 일부입니다. 이 방법은 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(timestamp)가 포함된 경우 이 메소드는 오류를 반환합니다.
매개변수:
  • 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 메소드

사용자 정의 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;
}

이 시점에서 응용 프로그램 상태를 초기화하려면 이 방법을 사용하여 초기화를 수행할 수 있습니다.