Blockchain App Builder übernimmt die Eingabe aus Ihrer Spezifikationsdatei und generiert ein voll funktionsfähiges gerüstetes Chaincode-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üstete Projekt drei Hauptdateien:
main.ts
<chaincodeName>.model.ts
<chaincodeName>.controller.ts
Alle erforderlichen Bibliotheken sind installiert und in einem Package verpackt. Die Datei
tsconfig.json
enthält die erforderliche Konfiguration zum Kompilieren und Erstellen des TypeScript-Projekts.
Die Datei <chaincodeName>.model.ts
im Unterverzeichnis model
enthält mehrere Assetdefinitionen, und die Datei <chaincodeName>.controller.ts
im Unterverzeichnis controller
enthält das Assetverhalten und die CRUD-Methoden.
Die Decorator-Elemente in model.ts
und controller.ts
unterstützen Features wie die automatische Validierung von Argumenten, das Marshalling/Unmarshalling von Argumenten, die transparente Persistenzfunktion (ORM) und das Aufrufen von Rich Querys.
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 des Assets ignoriert. Der Eigenschaftswert ist 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 wird. Das Argument
identifier
des Decorators übernimmt den Wert aus der Spezifikationsdatei.@Id('supplierId')
export class Supplier extends OchainModel{
...
}
-
Eigenschaftsdekorateure
- Es können mehrere Eigenschaftsdekoratoren verwendet werden. Die Dekoratoren werden von oben nach unten aufgelöst.
@Mandatory()
- Dieser Dekorator kennzeichnet die folgende Eigenschaft als obligatorisch, sodass sie beim Speichern im Buch nicht übersprungen werden kann. Wenn sie übersprungen werden, wird ein Fehler ausgelöst.
@Mandatory()
public supplierID: string;
@Default(param)
- Dieser Dekorator gibt an, dass die folgende Eigenschaft einen Standardwert hat. Der Standardwert im Argument (
param
) wird verwendet, wenn die Eigenschaft beim Speichern im Buch übersprungen wird.@Default('open for business')
@Validate(yup.string())
public remarks: string;
@Validate(param)
- Die Eigenschaft, die diesem Dekorator folgt, wird anhand des durch den Parameter angegebenen Schemas validiert. Das Argument
param
verwendet ein Yup-Schema, und mehrere Schemamethoden können verkettet werden, um komplexe Validierungen hinzuzufügen. Weitere Informationen finden Sie unter https://www.npmjs.com/package/yup.@Validate(yup.number().min(3))
public productsShipped: number;
@ReadOnly(param)
- Dieser Eigenschafts-Dekorator kennzeichnet die zugrunde liegende Eigenschaft als schreibgeschützten Wert. Der Wert im Argument, z.B. param, wird verwendet, wenn die Eigenschaft im Buch gespeichert wird. Nachdem der Wert festgelegt wurde, kann er weder bearbeitet noch entfernt werden.
@ReadOnly('digicur')
public token_name: string;
@Embedded(PropertyClass)
- Dieser Immobiliendekorator kennzeichnet die zugrunde liegende Eigenschaft als einbettbaren Vermögensgegenstand. Die einbettbare Klasse wird als Parameter verwendet. Diese Klasse muss die Klasse
EmbeddedModel
erweitern. Diese Anforderung wird vom Dekorateur bestätigt.
- Im folgenden Beispiel weist die Klasse
Employee
eine Eigenschaft mit dem Namen address
vom Typ Address
auf, die in das Asset Employee
eingebettet wird. Dies wird durch den Dekorator @Embedded()
bezeichnet.
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 @Validate()
validiert. Beachten Sie, dass die Klasse Address
nicht über die Eigenschaft assetType
oder den Class Decorator @Id()
verfügt. Diese Anlage und ihre Eigenschaften werden nicht separat im Buch gespeichert, sondern zusammen mit der Anlage Employee
gespeichert. Eingebettete Assets sind benutzerdefinierte Klassen, die als Wertetypen fungieren. Die Instanz dieser Klasse kann nur als Teil des enthaltenen Objekts (OchainModel
-Assets) im Buch gespeichert werden. Alle oben genannten Dekoratoren werden automatisch basierend auf der Eingabedatei beim Scaffolding des Projekts angewendet.
@Derived(STRATEGY, ALGORITHM, FORMAT)
- Dieser Dekorator wird zur Definition des Attributs verwendet, das von anderen Eigenschaften abgeleitet wird. Dieser Dekorateur hat zwei obligatorische Parameter:
STRATEGY
: Nimmt die Werte CONCAT
oder HASH
an. Wenn HASH
angegeben wird, ist der zusätzliche Parameter ALGORITHM
erforderlich. Der Standardalgorithmus ist sha256
. md5
wird ebenfalls unterstützt.
FORMAT
: Nimmt ein Array von Spezifikationszeichenfolgen und -werten an, 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;
-
Methodendekorateure
@Validator(…params)
- Dieser Dekorateur 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. Für Controller-Methoden muss dieser Dekorator aufrufbar sein. Es werden mehrere vom Benutzer erstellte Modelle oder Yup-Schemas als Parameter verwendet.
- Die Reihenfolge der Parameter muss mit der Reihenfolge der Argumente in der Methode identisch sein.
- 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 und konvertiert das JSON-Objekt nach erfolgreicher Validierung in ein Supplier
-Objekt und weist es der Variablen asset
zu. Dann wird endlich die zugrunde liegende Methode 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 yup-Schemaobjekte auch übergeben werden, wenn die Argumente grundlegende Typen sind. Im folgenden Beispiel sind
supplierId
und rawMaterialSupply
vom Typ string
bzw. number
, sodass das Yup-Schema eines ähnlichen Typs und einer korrekten Reihenfolge an den Dekorator übergeben wird. 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
Transparent Persistence Capability oder vereinfachtes ORM wird in der Klasse Model
des Context-(Ctx
-)Objekts erfasst. Wenn Ihr Modell eine der folgenden SDK-Methoden aufruft, greifen Sie mit this.Ctx.Model
darauf zu.
Die folgenden SDK-Methoden implementieren ORM:
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 hat sich 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 Klasse Model
des Objekts Context (Ctx
) definiert. Um diese Methoden aufzurufen, greifen Sie mit this.Ctx.Model.<method_name>
darauf 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);
}
Nachdem Sie ein Upgrade auf Version 21.3.2 durchgeführt haben, 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 weitergeleitet. Sie müssen Konflikte weiterhin manuell lösen.
-
save
- Die Methode
save
fügt dem Buch die Details des Aufrufers asset
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): Wird verwendet, um Metadaten außer dem Asset im Buch zu speichern.
- Rückgabewert:
Promise<any>
: Gibt eine Zusage bei Fertigstellung 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.
- Um ein Asset aus einer bestimmten
id
zurückzugeben, 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 Buch.
modelName: <Model Asset Class Name>
: (Optional) Modellieren Sie die zurückzugebende Assetklasse.
- Rückgabewert:
Promise: <Asset>
: Wenn der Parameter modelName
nicht angegeben ist und Daten im Buch vorhanden sind, wird Promise<object>
zurückgegeben. Wenn der Parameter id
nicht im Buch vorhanden ist, wird eine Fehlermeldung zurückgegeben. Wenn der Parameter modelName
angegeben ist, wird ein Objekt vom Typ <Asset>
zurückgegeben. Obwohl alle Assets mit der angegebenen id
aus dem Buch zurückgegeben werden, verarbeitet diese Methode das Casting in den Aufrufertyp Asset
. Wenn die aus dem Buch zurückgegebene Anlage nicht den Typ Asset
aufweist, löst die Methode einen Fehler aus. Diese Prüfung erfolgt durch die schreibgeschützte Eigenschaft assetType
in der Klasse Model
.
- 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 Buch. Diese Methode gibt ein Versprechen zurück.
- Diese Methode ruft die Hyperledger Fabric
putState
intern auf. Das gesamte Marshalling/Unmarshalling erfolgt intern. 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): Wird verwendet, um Metadaten außer dem Asset im Buch zu speichern.
- Rückgabewert:
Promise<any>
: Gibt eine Zusage bei Fertigstellung zurück.
- Beispiel:
@Validator(Supplier)
public async updateSupplier(asset: Supplier) {
return await this.Ctx.Model.update(asset);
}
-
delete
- Löscht die Anlage aus dem von
id
angegebenen Buch, falls 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 Buch.
- Rückgabewert:
Promise <any>
: Gibt eine Zusage bei Fertigstellung 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 Anlagenhistorie aus dem Buch 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 Buch.
- Rückgabewert:
Promise <any[]>
- Gibt [] bei Fertigstellung 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.
- Diese Methode gibt eine Liste der Assets zwischen dem Bereich
startId
und endId
zurück. Diese Methode ruft die Hyperledger Fabric getStateByRange
-Methode intern auf.
- Wenn der Parameter
modelName
nicht angegeben ist, 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 der aus dem Buch zurückgegebene Vermögensgegenstand nicht den Typ Model
aufweist, wird er nicht in die Liste aufgenommen. Diese Prüfung erfolgt durch die schreibgeschützte Eigenschaft assetType
in der Klasse Model
.
- Um alle Assets zwischen dem Bereich
startId
und endId
zurückzugeben, verwenden Sie die generische Controller-Methode getAssetsByRange
.
-
Ctx.Model.getByRange(startId: string, endId: string, modelName: <Asset Model Class Name> ): Promise <any>
- Parameter:
startId : string
: Startschlüssel des Bereichs, der im Bereich enthalten ist.
endId : string
: Endschlüssel des Bereichs, der aus dem Bereich ausgeschlossen ist.
modelName: <Model Asset Class Name>
: (Optional) Modellieren Sie die zurückzugebende Assetklasse.
- Rückgabewert:
Promise< Asset[ ] >
: Gibt das Array <Asset>
nach 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.
- Diese Methode gibt eine Liste des Assets zwischen dem Bereich
startId
und endId
zurück. Diese Methode ruft die Hyperledger Fabric getStateByRangeWithPagination
-Methode intern auf.
- Wenn der Parameter
modelName
nicht angegeben ist, 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 der aus dem Buch zurückgegebene Vermögensgegenstand nicht den Typ Model
aufweist, wird er nicht in die Liste aufgenommen. Diese Prüfung erfolgt durch die schreibgeschützte Eigenschaft assetType
in der Klasse Model
.
- 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, der im Bereich enthalten ist.
endId : string
: Endschlüssel des Bereichs, der aus dem Bereich ausgeschlossen ist.
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) Modellieren Sie die zurückzugebende Assetklasse.
- Rückgabewert:
Promise< Asset[ ] >
: Gibt das Array <Asset>
nach Abschluss zurück.
-
getId
- Wenn das Asset einen abgeleiteten Schlüssel als
Id
aufweist, können Sie mit dieser Methode eine abgeleitete ID abrufen. Diese Methode gibt einen Fehler zurück, wenn der abgeleitete Schlüssel %t
(Zeitstempel) 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.
Verantwortlicher
Die Hauptcontrollerklasse erweitert die Klasse 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 restlichen Methoden sind ausgeblendet.
Automatisch generierte Methoden
Wie unter Eingabespezifikationsdatei beschrieben, können Sie angeben, welche CRUD-Methoden in der Spezifikationsdatei generiert werden sollen. Beispiel: Wenn Sie angegeben haben, dass alle Methoden generiert werden sollen, ähnelt das Ergebnis dem folgenden Code:
@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
Neben den CRUD- und Non-CRUD-Methoden des Vorgängermodells bietet Blockchain App Builder eine sofort einsatzbereite Unterstützung durch unseren Controller für die folgenden Hyperledger Fabric-Methoden:
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, die die Klasse
OChainController
erweitert.
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 ein Asset basierend auf einer angegebenen ID zurück. Dies ist eine generische Methode und kann verwendet werden, um Assets jedes Typs abzurufen.
this.getAssetById(id: string): Promise<byte[]>
- Parameter:
id : string
: Schlüssel zum Speichern von Daten im Buch.
- Rückgabewert:
Promise <byte [ ]>
: Gibt die Zusage bei Fertigstellung zurück. Sie müssen byte[]
in ein Objekt konvertieren.
-
getAssetsByRange
- Die Methode
getAssetsByRange
gibt alle vorhandenen Assets unabhängig von Assettypen von startId
(einschließlich) bis endId
(ausschließlich) zurück. Dies ist eine generische Methode und kann verwendet werden, um Assets jeder Art abzurufen.
this.getAssetsByRange(startId: string, endId: string):
Promise<shim.Iterators.StateQueryIterator>
- Parameter:
startId : string
: Startschlüssel des Bereichs, der im Bereich enthalten ist.
endId : string
: Endschlüssel des Bereichs, der aus dem Bereich ausgeschlossen ist.
- Rückgabewert:
Promise< shim.Iterators.StateQueryIterator>
: Gibt bei Fertigstellung einen Iterator zurück. Sie müssen darüber iterieren.
-
getAssetHistoryById
- Die Methode
getAssetHistoryById
gibt den Historieniterator eines Assets für eine angegebene ID zurück.
this.getAssetHistoryById(id: string):
Promise<shim.Iterators.HistoryQueryIterator>
- Parameter:
id : string
: Schlüssel zum Speichern von Daten im Buch.
- 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 umfassende SQL/Couch DB-Abfrage über das Buch aus. Diese Methode wird nur für Remote-Deployments auf Oracle Blockchain Platform unterstützt. Dies ist eine generische Methode zum Ausführen von SQL-Abfragen im 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 umfangreiche SQL/Couch DB-Abfrage über das Ledger aus, gefiltert nach Seitengröße und Lesezeichen. Diese Methode wird nur für Remote-Deployments auf Oracle Blockchain Platform unterstützt. Dies ist eine generische Methode zum Ausführen von SQL-Abfragen im 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 der
indexName
und den in den Argumenten angegebenen Attributen zurück.
this.generateCompositeKey(indexName: string, attributes:
string[]): string
- Parameter:
indexName : string
: Der Objekttyp des Schlüssels, mit dem Daten im Buch gespeichert werden.
attributes: string[ ]
: Attribute, auf denen ein zusammengesetzter Schlüssel gebildet wird.
- Rückgabewert:
string
: Gibt einen zusammengesetzten Schlüssel zurück.
-
getByCompositeKey
- Diese Methode gibt das Asset zurück, das dem Schlüssel und der Spalte entspricht, die im Attributparameter beim Erstellen eines zusammengesetzten Schlüssels angegeben ist. 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
-Methoden 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[ ]
: Attribute, auf denen ein Schlüssel generiert wird.
indexOfId: number
: Index des Attributs, das aus dem Schlüssel abgerufen werden soll.
- Rückgabewert:
Promise< any [ ]
: Gibt einen beliebigen []
nach Abschluss 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:
- Rückgabewert:
string
: Gibt die Transaktions-ID für die aktuelle Chaincode-Aufrufanforderung zurück.
-
getTransactionTimestamp
- Gibt den Zeitstempel zurück, als 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 Endorser.
this.getTransactionTimestamp(): Timestamp
- Parameter:
id : string
: Schlüssel zum Speichern von Daten im Buch.
- Rückgabewert:
Timestamp
: Gibt den Zeitstempel zurück, als die Transaktion erstellt wurde.
-
getChannelID
- Gibt die Kanal-ID für den Vorschlag zurück, den Chaincode verarbeiten soll.
this.getChannelID(): string
- Parameter:
- Rückgabewert:
string
: Gibt die Kanal-ID zurück.
-
getCreator
- Gibt das Identitätsobjekt des Weiterleitenden des Chaincode-Aufrufs zurück.
this.getCreator(): shim.SerializedIdentity
- Parameter:
- Rückgabewert:
shim.SerializedIdentity
: Gibt das Identitätsobjekt zurück.
-
getSignedProposal
- Gibt ein vollständig decodiertes Objekt des signierten Transaktionsvorschlags zurück.
this.getSignedProposal():
shim.ChaincodeProposal.SignedProposal
- Parameter:
- 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:
- 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:
- Rückgabewert:
string [ ]
- Gibt Argumente als Array von Zeichenfolgen aus dem Chaincode-Aufruf zurück.
-
getMspID
- Gibt die MSP-ID der aufrufenden Identität zurück.
this.getMspID(): string
- Parameter:
- Rückgabewert:
string
: Gibt die MSP-ID der aufrufenden Identität zurück.
-
getNetworkStub
- Sie können auf den Shim Stub zugreifen, indem Sie diese Methode aufrufen. Dies kann Ihnen helfen, Ihre eigene Implementierung der Arbeit direkt mit den Assets zu schreiben.
this.getNetworkStub(): shim.ChaincodeStub
- Parameter:
- Rückgabewert:
shim.ChaincodeStub
- Gibt chaincode network 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 aufzurufenden Chaincodes.
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-Chaincode-Aufruf als JSON-Objekt zurückgegeben wird.
message
: Die vom Cross-Chaincode-Aufruf zurückgegebene Nachricht im UTF-8-Format.
-
invokeChaincode
- Diese Methode ruft eine Funktion in einem anderen Chaincode auf. 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 aufzurufenden Chaincodes.
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-Chaincode-Aufruf als JSON-Objekt zurückgegeben wird.
message
: Die vom Cross-Chaincode-Aufruf zurückgegebene Nachricht im UTF-8-Format.
Benutzerdefinierte Methoden
Die folgenden benutzerdefinierten Methoden wurden aus unserer Beispielspezifikationsdatei generiert.
Die Methode executeQuery
zeigt, wie SQL-reiche 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 bereitstellen oder ein Upgrade ausfü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;
}
Mit dieser Methode können Sie dann jeden Anwendungsstatus initialisieren.