Gerüstete TypeScript Chaincode Projekt

Blockchain App Builder übernimmt die Eingabe aus Ihrer Spezifikationsdatei und generiert ein voll funktionsfähiges Gerüstkettencode-Projekt. Das Projekt enthält automatisch generierte Klassen und Funktionen, CRUD-Methoden, SDK-Methoden, automatische Validierung von Argumenten, Marshalling/Un-Marshalling und transparente Persistenzfähigkeit (ORM).

Wenn das Chaincode-Projekt die Sprache TypeScript verwendet, enthält das Gerüstprojekt drei Hauptdateien:
  • main.ts
  • <chaincodeName>.model.ts
  • <chaincodeName>.controller.ts
Alle erforderlichen Bibliotheken werden installiert und in einem Package integriert. Die Datei tsconfig.json enthält die erforderliche Konfiguration zum Kompilieren und Erstellen des Projekts TypeScript.

Die Datei <chaincodeName>.model.ts im Unterverzeichnis model enthält mehrere Assetdefinitionen. Die Datei <chaincodeName>.controller.ts im Unterverzeichnis controller enthält das Assetverhalten und die CRUD-Methoden.

Die verschiedenen Dekorateure in model.ts und controller.ts unterstützen Features wie die automatische Validierung von Argumenten, das Marshalling/Unmarshalling von Argumenten, die transparente Persistenzfähigkeit (ORM) und das Aufrufen umfangreicher Abfragen.

modelle

Jede Modellklasse erweitert die Klasse OchainModel, die über eine zusätzliche schreibgeschützte Eigenschaft namens assetType verfügt. Diese Eigenschaft kann nur zum Abrufen von Assets dieses Typs verwendet werden. Alle Änderungen an dieser Eigenschaft werden bei der Erstellung und Aktualisierung der Anlage ignoriert. Der Eigenschaftswert lautet standardmäßig <modelName>.

Die Klasse OchainModel erzwingt das Dekorationsverhalten für die Eigenschaften der Klasse.
@Id('supplierId')
export class Supplier extends OchainModel<Supplier> {
    public readonly assetType = 'supplier';
    @Mandatory()
    @Validate(yup.string()) 
    public supplierId: string;

Dekoratoren

Klassendekorateure
@Id(identifier)
Dieser Dekorator identifiziert die Eigenschaft, die den zugrunde liegenden Vermögensgegenstand eindeutig definiert. Diese Eigenschaft wird als Schlüssel des Datensatzes verwendet, der dieses Asset im Chaincode-Status darstellt. Dieser Dekorator wird automatisch angewendet, wenn ein neues TypeScript-Projekt gerüstet ist. Das Argument 'identifier' des Decorators übernimmt den Wert aus der Spezifikationsdatei.
@Id('supplierId')
export class Supplier extends OchainModel{
...
}
Immobiliendekorateure
Es können mehrere Immobiliendekorateure verwendet werden. Die Dekorateure werden in der Reihenfolge von oben nach unten aufgelöst.
@Mandatory()
Die folgende Eigenschaft ist erforderlich, sodass sie beim Speichern im Buch nicht übersprungen werden kann. Wird er übersprungen, wird ein Fehler ausgegeben.
@Mandatory()
public supplierID: string;
@Default(param)
Diese Eigenschaft kann einen Standardwert aufweisen. Der Standardwert im Argument (param) wird verwendet, wenn die Eigenschaft beim Speichern im Hauptbuch übersprungen wird.
@Default('open for business')
@Validate(yup.string())
public remarks: string;
@Validate(param)
Die folgende Eigenschaft wird anhand des im Parameter dargestellten Schemas validiert. Das Argument param verwendet ein Yup-Schema, und viele Schemamethoden können miteinander verkettet werden. Viele komplexe Validierungen können hinzugefügt werden. Weitere Informationen finden Sie unter https://www.npmjs.com/package/yup.
@Validate(yup.number().min(3))
public productsShipped: number;
@ReadOnly(param)
Dieser Eigenschaftsdekorator kennzeichnet die zugrunde liegende Eigenschaft mit einem schreibgeschützten Wert. Der Wert im Argument, z.B. param, wird verwendet, wenn die Eigenschaft im Ledger gespeichert wird. Nachdem der Wert festgelegt wurde, kann er nicht mehr bearbeitet oder entfernt werden.
@ReadOnly('digicur')
public token_name: string;
@Embedded(PropertyClass)
Dieser Immobiliendekorator markiert die zugrunde liegende Eigenschaft als einbettbare Anlage. Die einbettbare Klasse wird als Parameter verwendet. Diese Klasse sollte die Klasse EmbeddedModel erweitern. Dies wird vom Dekorateur bestätigt.
In diesem Beispiel hat Employee eine Eigenschaft namens address vom Typ Address, die in das Employee-Asset eingebettet werden soll. Dies wird durch den @Embedded()-Dekorator gekennzeichnet.
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;
}
Wenn eine neue Instanz der Klasse Address erstellt wird, werden alle Eigenschaften der Klasse Address automatisch vom Decorator-Element @Validate() validiert. Beachten Sie, dass die Klasse Address nicht die Eigenschaft assetType oder den Klassendekorator @Id() enthält. Dieses Asset und seine Eigenschaften werden nicht separat im Hauptbuch gespeichert, sondern zusammen mit dem Asset Employee gespeichert. Eingebettete Assets sind benutzerdefinierte Klassen, die als Werttypen fungieren. Die Instanz dieser Klasse kann nur als Teil des enthaltenden Objekts (OchainModel Assets) im Ledger gespeichert werden. Alle oben genannten Dekorateure werden automatisch basierend auf der Eingabedatei angewendet, während das Projekt gerüstet wird.
@Derived(STRATEGY, ALGORITHM, FORMAT)
Dieser Dekorator wird zum Definieren des Attributs verwendet, das von anderen Eigenschaften abgeleitet wird. Dieser Dekorator hat zwei obligatorische Parameter:
  • STRATEGY: Übernimmt die Werte CONCAT oder HASH. Erfordert einen zusätzlichen Parameter ALGORITHM, wenn HASH ausgewählt ist. Der Standardalgorithmus lautet sha256. md5 wird ebenfalls unterstützt.
  • FORMAT: Übernimmt ein Array von Spezifikationszeichenfolgen und -werten, die von der Strategie verwendet werden sollen.
@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;
Methodendekoratoren
@Validator(…params)
Dieser Dekorator wird auf Methoden der Hauptcontrollerklasse angewendet. Dieser Dekorator ist wichtig für das Parsen der Argumente, die Validierung anhand aller Eigenschaftsdekoratoren und die Rückgabe eines Modell-/Typobjekts. Controller-Methoden müssen diesen Dekorator aufweisen, damit er nicht verwendet werden kann. Es werden mehrere benutzerdefinierte Modelle oder Yup-Schemas als Parameter verwendet.
Die Reihenfolge der Parameter muss genau der Reihenfolge der Argumente in der Methode entsprechen.
Im folgenden Beispiel wird die Modellreferenz Supplier in dem Parameter übergeben, der dem Typ asset im Methodenargument entspricht. Zur Laufzeit parst und konvertiert der Decorator das Methodenargument in ein JSON-Objekt, validiert es anhand der Supplier-Validatoren, konvertiert das JSON-Objekt nach erfolgreicher Validierung in ein Supplier-Objekt und weist es der Variablen asset zu. Die zugrunde liegende Methode wird schließlich aufgerufen.
@Validator(Supplier)
public async createSupplier(asset: Supplier) {
    return await this.Ctx.Model.save(asset);
}
Im folgenden Beispiel werden mehrere Assetreferenzen übergeben. Sie entsprechen den Objekttypen der Methodenargumente. Beachten Sie die Reihenfolge der Parameter.
@Validator(Supplier, Manufacturer)
public async createProducts(supplier: Supplier, manufacturer: Manufacturer) {
}
Neben Assetreferenzen können auch Yup-Schemaobjekte übergeben werden, wenn die Argumente vom Typ basic sind. Im folgenden Beispiel haben supplierId und rawMaterialSupply den Typ string bzw. number. Daher wird das Yup-Schema mit einem ähnlichen Typ und einer korrekten Reihenfolge an den Decorator übergeben. Beachten Sie die Verkettung von Yup-Schemamethoden.
@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

Transparente Persistenzfähigkeit oder vereinfachtes ORM wird in der Klasse Model des Kontextobjekts (Ctx) erfasst. Wenn Ihr Modell eine der folgenden SDK-Methoden aufruft, greifen Sie mit this.Ctx.Model darauf zu.

SDK-Methoden, die ORM implementieren, sind die folgenden Methoden:
  • save: Ruft die Hyperledger Fabric putState-Methode auf
  • get: Ruft die Hyperledger Fabric getState-Methode auf
  • update: Ruft die Hyperledger Fabric putState-Methode auf
  • delete: Ruft die Hyperledger Fabric deleteState-Methode auf
  • history: Ruft die Hyperledger Fabric getHistoryForKey-Methode auf
  • getByRange: Ruft die Hyperledger Fabric getStateByRange-Methode auf
  • getByRangeWithPagination: Ruft die Hyperledger Fabric getStateByRangeWithPagination-Methode auf
Weitere Informationen finden Sie unter SDK-Methoden.

SDK-Methoden

Hinweis:

Ab Version 21.3.2 wurde der Zugriff auf die ORM-Methoden geändert. Führen Sie den Befehl ochain --version aus, um die Version von Blockchain App Builder zu bestimmen.

In früheren Releases wurden die ORM-Methoden von der Klasse OchainModel geerbt. In Version 21.3.2 und höher werden die Methoden für die Model-Klasse des Kontextobjekts (Ctx) definiert. Um diese Methoden aufzurufen, greifen Sie mit this.Ctx.Model.<method_name> auf sie zu.

Das folgende Beispiel zeigt einen Methodenaufruf in früheren Releases:

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

Das folgende Beispiel zeigt einen Methodenaufruf ab Version 21.3.2:

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

Nach dem Upgrade auf Version 21.3.2 nehmen Sie diese Änderung in allen Chaincode-Projekten vor, die Sie mit einer früheren Version von Blockchain App Builder erstellt haben. Wenn Sie den Befehl sync verwenden, um Änderungen zwischen der Spezifikationsdatei und dem Quellcode zu synchronisieren, werden die Änderungen automatisch an den Controller für die einsatzbereiten Methoden übertragen. Konflikte müssen weiterhin manuell gelöst werden.

save
Die Methode save fügt dem Ledger die asset-Details des Aufrufers hinzu.
Diese Methode ruft die Hyperledger Fabric putState intern auf. Alle Marshalling / Unmarshalling werden intern abgewickelt. Die Methode save ist Teil der Klasse Model, auf die Sie mit dem Objekt Ctx zugreifen.
Ctx.Model.save(asset: <Instance of Asset Class> , extraMetadata?: any) : Promise <any>
Parameter:
  • extraMetadata : any (optional) - Zum Speichern von Metadaten abgesehen vom Asset im Ledger.
Rückgabewert:
  • Promise<any> - Gibt eine Zusage bei Abschluss zurück
Beispiel:
@Validator(Supplier)
public async createSupplier(asset: Supplier) {
	return await this.Ctx.Model.save(asset);
}
get
Die Methode get ist eine Methode der Klasse OchainModel, die von den konkreten Modellklassen von {chaincodeName}.model.ts geerbt wird. Die Methode get ist Teil der Klasse Model, auf die Sie mit dem Objekt Ctx zugreifen.
Wenn Sie ein Asset mit der angegebenen id zurückgeben möchten, verwenden Sie die generische Controllermethode getAssetById.
Ctx.Model.get(id: string, modelName: <Model Asset Class Name>) : Promise<asset>
Parameter:
  • id : string: Schlüssel zum Speichern von Daten im Ledger.
  • modelName: <Model Asset Class Name>: (Optional) Modellassetklasse, die zurückgegeben werden soll.
Rückgabewert:
  • Promise: <Asset>: Wenn der Parameter modelName nicht angegeben wird und Daten im Ledger vorhanden sind, wird Promise<object> zurückgegeben. Wenn der Parameter id nicht im Ledger vorhanden ist, wird eine Fehlermeldung zurückgegeben. Wenn der Parameter modelName angegeben wird, wird ein Objekt des Typs <Asset> zurückgegeben. Obwohl ein Asset mit dem angegebenen id vom Ledger zurückgegeben wird, übernimmt diese Methode das Casting in den Aufrufertyp Asset. Wenn das vom Buch zurückgegebene Asset nicht den Typ Asset aufweist, wird ein Fehler ausgelöst. Diese Prüfung wird von der schreibgeschützten Eigenschaft assetType in der Klasse Model durchgeführt.
Beispiel:
@Validator(yup.string())
public async getSupplierById(id: string) {
	const asset = await this.Ctx.Model.get(id, Supplier);
	return asset;
}
Im Beispiel hat asset den Typ Supplier.
update
Die Methode update aktualisiert die Details des Aufrufers asset im Ledger. Diese Methode gibt eine Zusage zurück.
Diese Methode ruft die Hyperledger Fabric putState intern auf. Das gesamte Marshalling/Unmarshalling wird intern abgewickelt. Die Methode update ist Teil der Klasse Model, auf die Sie mit dem Objekt Ctx zugreifen können.
Ctx.Model.update(asset: <Instance of Asset Class> , extraMetadata?: any) : Promise <any>
Parameter:
  • extraMetadata : any (optional) - Zum Speichern von Metadaten abgesehen vom Asset im Ledger.
Rückgabewert:
  • Promise<any> - Gibt eine Zusage bei Abschluss zurück
Beispiel:
@Validator(Supplier)
public async updateSupplier(asset: Supplier) {
	return await this.Ctx.Model.update(asset);
}
delete
Dadurch wird das Asset aus dem Buch gelöscht, das von id angegeben wird, sofern vorhanden. Diese Methode ruft die Hyperledger Fabric deleteState-Methode intern auf. Die Methode delete ist Teil der Klasse Model, auf die Sie mit dem Objekt Ctx zugreifen können.
Ctx.Model.delete(id: string): Promise <any>
Parameter:
  • id : string: Schlüssel zum Speichern von Daten im Ledger.
Rückgabewert:
  • Promise <any> - Gibt bei Abschluss eine Zusage zurück.
Beispiel:
@Validator(yup.string())
public async deleteSupplier(id: string) {
	const result = await this.Ctx.Model.delete(id);
	return result;
}
history
Die Methode history ist Teil der Klasse Model, auf die Sie mit dem Objekt Ctx zugreifen können. Diese Methode gibt die von id angegebene Assethistorie aus dem Ledger zurück, sofern vorhanden.
Diese Methode ruft die Hyperledger Fabric getHistoryForKey-Methode intern auf.
Ctx.Model.history(id: string): Promise <any>
Parameter:
  • id : string: Schlüssel zum Speichern von Daten im Ledger.
Rückgabewert:
  • Promise <any[]> - Gibt einen beliebigen [] bei Abschluss zurück.
Beispiel
@Validator(yup.string())
public async getSupplierHistoryById(id: string) {
	const result = await this.Ctx.Model.history(id);
	return result;
}
Beispiel für die zurückgegebene Assethistorie für 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
Die Methode getByRange ist eine statische Methode der Klasse OchainModel, die von den konkreten Model-Klassen von {chaincodeName}.model.ts geerbt wird.
Dadurch wird eine Liste der Assets zwischen dem Bereich startId und endId zurückgegeben. Diese Methode ruft die Hyperledger Fabric getStateByRange-Methode intern auf.
Wenn der Parameter modelName nicht angegeben wird, gibt die Methode Promise<Object [ ] > zurück. Wenn der Parameter modelName angegeben ist, verarbeitet die Methode das Casting in den Aufrufertyp Model. Im folgenden Beispiel hat das Ergebnisarray den Typ Supplier. Wenn das vom Buch zurückgegebene Asset nicht den Typ Model aufweist, wird es nicht in die Liste aufgenommen. Diese Prüfung wird von der schreibgeschützten Eigenschaft assetType in der Klasse Model durchgeführt.
Um alle Assets zwischen dem Bereich startId und endId zurückzugeben, verwenden Sie die generische Controllermethode getAssetsByRange.
Ctx.Model.getByRange(startId: string, endId: string, modelName: <Asset Model Class Name> ): Promise <any>
Parameter:
  • startId : string: Startschlüssel des Bereichs. Im Sortiment enthalten.
  • endId : string: Endschlüssel des Bereichs. Ausgeschlossen vom Sortiment.
  • modelName: <Model Asset Class Name>: (Optional) Modellassetklasse, die zurückgegeben werden soll.
Rückgabewert:
  • Promise< Asset[ ] >: Gibt das Array <Asset> bei Abschluss zurück.
Beispiel:
@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
Die Methode getByRangeWithPagination ist eine statische Methode der Klasse OchainModel, die von den konkreten Model-Klassen von {chaincodeName}.model.ts geerbt wird.
Dadurch wird eine Liste der Assets zwischen dem Bereich startId und endId zurückgegeben. Diese Methode ruft die Hyperledger Fabric getStateByRangeWithPagination-Methode intern auf.
Wenn der Parameter modelName nicht angegeben wird, gibt die Methode Promise<Object [ ] > zurück. Wenn der Parameter modelName angegeben ist, verarbeitet die Methode das Casting in den Aufrufertyp Model. Im folgenden Beispiel hat das Ergebnisarray den Typ Supplier. Wenn das vom Buch zurückgegebene Asset nicht den Typ Model aufweist, wird es nicht in die Liste aufgenommen. Diese Prüfung wird von der schreibgeschützten Eigenschaft assetType in der Klasse Model durchgeführt.
Um alle Assets zwischen dem Bereich startId und endId zurückzugeben, gefiltert nach Seitengröße und Lesezeichen, verwenden Sie die generische Controllermethode 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[]>
Parameter:
  • startId : string: Startschlüssel des Bereichs. Im Sortiment enthalten.
  • endId : string: Endschlüssel des Bereichs. Ausgeschlossen aus dem Bereich.
  • pageSize : number: Die Seitengröße der Abfrage.
  • bookmark : string: Das Lesezeichen der Abfrage. Die Ausgabe beginnt mit diesem Lesezeichen.
  • modelName: <Model Asset Class Name>: (Optional) Modellassetklasse, die zurückgegeben werden soll.
Rückgabewert:
  • Promise< Asset[ ] >: Gibt das Array <Asset> bei Abschluss zurück.
getId
Wenn das Asset einen abgeleiteten Schlüssel als Id aufweist, können Sie diese Methode verwenden, um eine abgeleitete ID abzurufen. Diese Methode gibt einen Fehler zurück, wenn der abgeleitete Schlüssel %t (timestamp) enthält.
Parameter:
  • object: Das Objekt muss alle Eigenschaften enthalten, von denen der abgeleitete Schlüssel abhängig ist.
Rückgabewert:
  • Gibt den abgeleiteten Schlüssel als Zeichenfolge zurück.
Beispiel:
@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);
}

Token-SDK-Methoden finden Sie in den Themen unter Tokenisierungsunterstützung mit Blockchain App Builder.

Controller

Die Hauptcontrollerklasse erweitert OchainController. Es gibt nur einen Hauptcontroller.

export class TSProjectController extends OchainController{

Sie können eine beliebige Anzahl von Klassen, Funktionen oder Dateien erstellen, aber nur die Methoden, die in der Hauptcontrollerklasse definiert sind, können von außen aufgerufen werden. Die übrigen Methoden sind ausgeblendet.

Automatisch generierte Methoden

Wie unter Eingabespezifikationsdatei beschrieben, können Sie angeben, welche CRUD-Methoden in der Spezifikationsdatei generiert werden sollen. Wenn Sie z.B. alle Methoden generieren möchten, sieht das Ergebnis wie folgt aus:

@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;
}

Controller-Methodendetails

Abgesehen von den oben genannten CRUD- und Nicht-CRUD-Methoden bietet Blockchain App Builder eine sofort einsatzbereite Unterstützung für andere Hyperledger Fabric-Methoden von unserem Controller. Diese Methoden sind:
  • getAssetById
  • getAssetsByRange
  • getAssetHistoryById
  • query
  • queryWithPagination
  • generateCompositeKey
  • getByCompositeKey
  • getTransactionId
  • getTransactionTimestamp
  • getChannelID
  • getCreator
  • getSignedProposal
  • getArgs
  • getStringArgs
  • getMspID
  • getNetworkStub

Hinweis:

Diese Methoden sind mit dem Kontext this in jeder Klasse verfügbar, mit der die Klasse OChainController erweitert wird.
Beispiel:
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
Die Methode getAssetById gibt das Asset basierend auf dem angegebenen id zurück. Dies ist eine generische Methode und wird zum Abrufen von Assets aller Art verwendet.
this.getAssetById(id: string): Promise<byte[]>
Parameter:
  • id : string: Schlüssel zum Speichern von Daten im Ledger.
Rückgabewert:
  • Promise <byte [ ]> - Gibt die Zusage bei Abschluss zurück. Sie müssen byte[] in ein Objekt konvertieren.
getAssetsByRange
Die Methode getAssetsByRange gibt alle Assets zurück, die unabhängig von Assettypen von startId (einschließlich) bis endId (ausschließlich) vorhanden sind. Dies ist eine generische Methode und kann zum Abrufen von Assets jedes Typs verwendet werden.
this.getAssetsByRange(startId: string, endId: string):
Promise<shim.Iterators.StateQueryIterator>
Parameter:
  • startId : string: Startschlüssel des Bereichs. Im Sortiment enthalten.
  • endId : string: Endschlüssel des Bereichs. Ausgeschlossen vom Sortiment.
Rückgabewert:
  • Promise< shim.Iterators.StateQueryIterator>: Gibt bei Abschluss einen Iterator zurück. Sie müssen darüber iterieren.
getAssetHistoryById
Die Methode getAssetHistoryById gibt den Historieniterator eines Assets für id zurück.
this.getAssetHistoryById(id: string):
Promise<shim.Iterators.HistoryQueryIterator>
Parameter:
  • id : string: Schlüssel zum Speichern von Daten im Ledger.
Rückgabewert:
  • Promise<shim.Iterators.HistoryQueryIterator> - Gibt einen Historienabfrage-Iterator zurück. Sie müssen darüber iterieren.
query
Die Methode query führt eine Rich SQL/Couch DB-Abfrage über das Ledger aus. Diese Methode wird nur für das Remote-Deployment auf Oracle Blockchain Platform unterstützt. Dies ist eine generische Methode zum Ausführen von SQL-Abfragen für das Ledger.
this.query(queryStr: string):
Promise<shim.Iterators.StateQueryIterator>
Parameter:
  • queryStr : string: Rich SQL/Couch-DB-Abfrage.
Rückgabewert:
  • Promise<shim.Iterators.StateQueryIterator>: Gibt einen Statusabfrage-Iterator zurück. Sie müssen darüber iterieren.
queryWithPagination
Diese Methode führt eine Rich SQL/Couch DB-Abfrage über das Ledger aus, gefiltert nach Seitengröße und Lesezeichen. Diese Methode wird nur für das Remote-Deployment auf Oracle Blockchain Platform unterstützt. Dies ist eine generische Methode zum Ausführen von SQL-Abfragen für das Ledger.
public async queryWithPagination(query: string, pageSize: number, bookmark?: string)
Parameter:
  • query : string: Rich SQL/Couch-DB-Abfrage.
  • pageSize : number: Die Seitengröße der Abfrage.
  • bookmark : string: Das Lesezeichen der Abfrage. Die Ausgabe beginnt mit diesem Lesezeichen.
Rückgabewert:
  • Promise<shim.Iterators.StateQueryIterator>: Gibt einen Statusabfrage-Iterator zurück. Sie müssen darüber iterieren.
generateCompositeKey
Diese Methode generiert und gibt den zusammengesetzten Schlüssel basierend auf dem indexName und den in den Argumenten angegebenen Attributen zurück.
this.generateCompositeKey(indexName: string, attributes:
string[]): string
Parameter:
  • indexName : string: Objekttyp des Schlüssels, der zum Speichern von Daten im Buch verwendet wird.
  • attributes: string[ ]: Attribute, die darauf basieren, welcher zusammengesetzte Schlüssel gebildet wird.
Rückgabewert:
  • string: Gibt einen zusammengesetzten Schlüssel zurück.
getByCompositeKey
Diese Methode gibt das Asset zurück, das mit dem Schlüssel und der Spalte übereinstimmt, die beim Erstellen des zusammengesetzten Schlüssels im Attributparameter angegeben sind. Der Parameter indexOfId gibt den Index des Schlüssels an, der im Array der Stub-Methode SplitCompositeKey zurückgegeben wird. Intern ruft diese Methode die getStateByPartialCompositeKey, splitCompositeKey und getState von Hyperledger Fabric auf.
this.getByCompositeKey(key: string, columns: string[],
indexOfId: number): Promise<any []>
Parameter:
  • key: string: Schlüssel zum Speichern von Daten im Hauptbuch.
  • columns: string[ ]: Auf Schlüssel basierende Attribute werden generiert.
  • indexOfId: number: Index des Attributs, das aus dem Schlüssel abgerufen werden soll.
Rückgabewert:
  • Promise< any [ ]: Gibt bei Abschluss eine beliebige [] zurück.
getTransactionId
Gibt die Transaktions-ID für die aktuelle Chaincode-Aufrufanforderung zurück. Die Transaktions-ID identifiziert die Transaktion im Geltungsbereich des Kanals eindeutig.
this.getTransactionId(): string
Parameter:
  • Kein
Rückgabewert:
  • string: Gibt die Transaktions-ID für die aktuelle Chaincode-Aufrufanforderung zurück.
getTransactionTimestamp
Gibt den Zeitstempel zurück, zu dem die Transaktion erstellt wurde. Dies wird aus der Transaktion ChannelHeader übernommen. Sie gibt daher den Zeitstempel des Clients an und hat denselben Wert für alle Bestätiger.
this.getTransactionTimestamp(): Timestamp
Parameter:
  • id : string: Schlüssel zum Speichern von Daten im Ledger.
Rückgabewert:
  • Timestamp: Gibt den Zeitstempel zurück, zu dem die Transaktion erstellt wurde.
getChannelID
Gibt die Kanal-ID für den Vorschlag für den zu verarbeitenden Chaincode zurück.
this.getChannelID(): string
Parameter:
  • Kein
Rückgabewert:
  • string: Gibt die Kanal-ID zurück.
getCreator
Gibt das Identity-Objekt des Weiterleitenden des Chaincode-Aufrufs zurück.
this.getCreator(): shim.SerializedIdentity
Parameter:
  • Kein
Rückgabewert:
  • shim.SerializedIdentity: Gibt das Identitätsobjekt zurück.
getSignedProposal
Gibt ein vollständig dekodiertes Objekt des unterzeichneten Transaktionsvorschlags zurück.
this.getSignedProposal():
shim.ChaincodeProposal.SignedProposal
Parameter:
  • Kein
Rückgabewert:
  • shim.ChaincodeProposal.SignedProposal: Gibt das decodierte Objekt des signierten Transaktionsvorschlags zurück.
getArgs
Gibt die Argumente als Array von Zeichenfolgen aus der Chaincode-Aufrufanforderung zurück.
this.getArgs(): string[]
Parameter:
  • Kein
Rückgabewert:
  • string [ ]: Gibt Argumente als Array von Zeichenfolgen aus dem Chaincode-Aufruf zurück.
getStringArgs
Gibt die Argumente als Array von Zeichenfolgen aus der Chaincode-Aufrufanforderung zurück.
this.getStringArgs(): string[]
Parameter:
  • Kein
Rückgabewert:
  • string [ ]: Gibt Argumente als Array von Zeichenfolgen aus dem Chaincode-Aufruf zurück.
getMspID
Gibt die MSP-ID der aufrufenden Identity zurück.
this.getMspID(): string
Parameter:
  • Kein
Rückgabewert:
  • string: Gibt die MSP-ID der aufrufenden Identität zurück.
getNetworkStub
Der Benutzer kann Zugriff auf den Shim-Stub erhalten, indem er die Methode getNetworkStub aufruft. Dies wird dem Benutzer helfen, seine eigene Implementierung der Arbeit direkt mit den Assets zu schreiben.
this.getNetworkStub(): shim.ChaincodeStub
Parameter:
  • Kein
Rückgabewert:
  • shim.ChaincodeStub - Gibt den Chaincode-Netzwerk-Stub zurück.
invokeCrossChaincode
Sie können diese Methode in einem Chaincode verwenden, um eine Funktion in einem anderen Chaincode aufzurufen. Beide Chaincodes müssen auf demselben Peer installiert sein.
this.invokeCrossChaincode(chaincodeName: string, methodName: string, args: string[], channelName: string): Promise<any>
Parameter:
  • chaincodeName: Der Name des Chaincodes, der aufgerufen werden soll.
  • methodName: Der Name der Methode, die im Chaincode aufgerufen werden soll.
  • arg: Das Argument der aufrufenden Methode.
  • channelName: Der Kanal, in dem sich der aufzurufende Chaincode befindet.
Rückgabewert:
  • Promise<any> - Gibt ein JSON-Objekt zurück, das drei Felder enthält:
    • isValid: true, wenn der Aufruf gültig ist.
    • payload: Die Ausgabe, die vom Cross-Chain-Code-Aufruf als JSON-Objekt zurückgegeben wird.
    • message: Die Nachricht, die vom Cross-Chain-Code-Aufruf im UTF-8-Format zurückgegeben wird.
invokeChaincode
Sie können diese Methode in einem Chaincode verwenden, um eine Funktion in einem anderen Chaincode aufzurufen. Beide Chaincodes müssen auf demselben Peer installiert sein.
this.invokeChaincode(chaincodeName: string, methodName: string, args: string[], channelName: string): Promise<any>
Parameter:
  • chaincodeName: Der Name des Chaincodes, der aufgerufen werden soll.
  • methodName: Der Name der Methode, die im Chaincode aufgerufen werden soll.
  • arg: Das Argument der aufrufenden Methode.
  • channelName: Der Kanal, in dem sich der aufzurufende Chaincode befindet.
Rückgabewert:
  • Promise<any> - Gibt ein JSON-Objekt zurück, das drei Felder enthält:
    • isValid: true, wenn der Aufruf gültig ist.
    • payload: Die Ausgabe, die vom Cross-Chain-Code-Aufruf als JSON-Objekt zurückgegeben wird.
    • message: Die Nachricht, die vom Cross-Chain-Code-Aufruf im UTF-8-Format zurückgegeben wird.

Benutzerdefinierte Methoden

Die folgenden benutzerdefinierten Methoden wurden aus unserer Beispielspezifikationsdatei generiert.

Die executeQuery zeigt, wie SQL Rich-Abfragen aufgerufen werden können. Die Validatoren für die Argumente werden automatisch von Blockchain App Builder basierend auf dem in der Spezifikationsdatei angegebenen Argumenttyp hinzugefügt.


/**
*
*	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() { 
}

Initialisierungsmethode

Eine benutzerdefinierte init-Methode wird im Controller mit einer leeren Definition bereitgestellt. Wenn Sie Blockchain App Builder zum Deployment oder Upgrade verwenden, wird die Methode init automatisch aufgerufen. Wenn Sie die Oracle Blockchain Platform-Konsole auf der Hyperledger Fabric v1.4.7-Plattform bereitstellen oder ein Upgrade durchführen, wird die Methode init auch automatisch aufgerufen. Wenn Sie die Oracle Blockchain Platform-Konsole auf der Hyperledger Fabric v2.x-Plattform bereitstellen oder ein Upgrade durchführen, müssen Sie die Methode init manuell aufrufen. Sie können ein Drittanbietertool wie Postman verwenden, um die Methode init manuell aufzurufen.

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

Wenn Sie jetzt einen Anwendungsstatus initialisieren möchten, können Sie diese Methode verwenden.