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/Unmarshalling 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 Librarys sind installiert und in einem Package enthalten. Die Datei
tsconfig.json
enthält die erforderliche Konfiguration, um das Projekt TypeScript zu kompilieren und zu erstellen.
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 verschiedenen Dekorateure in model.ts
und controller.ts
unterstützen Features wie die automatische Validierung von Argumenten, Marshalling/Unmarshalling von Argumenten, transparente Persistenzfähigkeit (ORM) und Aufruf von Rich Queries.
modelle
Jede Modellklasse erweitert die Klasse OchainModel
, die über eine zusätzliche schreibgeschützte Eigenschaft namens assetType
verfügt. Mit dieser Eigenschaft können nur Assets dieses Typs abgerufen werden. Änderungen an dieser Eigenschaft werden bei der Erstellung und Aktualisierung des Assets ignoriert. Der Eigenschaftswert lautet standardmäßig <modelName>
.
Die Klasse
OchainModel
erzwingt das Dekorationsverhalten für 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 Dekorateur identifiziert die Eigenschaft, die den Basiswert eindeutig definiert. Diese Eigenschaft wird als Schlüssel des Datensatzes verwendet, der dieses Asset im Status des Chaincodes darstellt. Dieser Dekorateur wird automatisch angewendet, wenn ein neues TypeScript-Projekt gerüstet wird. Das 'identifier'-Argument des Decorators übernimmt den Wert aus der Spezifikationsdatei.
@Id('supplierId')
export class Supplier extends OchainModel{
...
}
-
Eigenschaftsdekorateure
- Es können mehrere Immobiliendekorateure verwendet werden. Die Dekorateure werden von oben nach unten sortiert.
@Mandatory()
- Dadurch wird die folgende Eigenschaft als erforderlich markiert. Sie kann daher beim Speichern im Buch nicht übersprungen werden. Wenn sie übersprungen wird, wird ein Fehler ausgelöst.
@Mandatory()
public supplierID: string;
@Default(param)
- Diese Eigenschaft kann einen Standardwert haben. 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 folgende Eigenschaft wird anhand des im Parameter dargestellten Schemas validiert. Das Argument
param
akzeptiert ein Yup-Schema, und viele Schemamethoden können miteinander verkettet werden. Es können viele komplexe Validierungen 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 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 nicht mehr bearbeitet oder entfernt werden.
@ReadOnly('digicur')
public token_name: string;
@Embedded(PropertyClass)
- Dieser Immobiliendekorateur markiert die zugrunde liegende Eigenschaft als einbettbares Asset. Die einbettbare Klasse wird als Parameter verwendet. Diese Klasse sollte die Klasse
EmbeddedModel
erweitern. Dies wird vom Dekorateur bestätigt.
- In diesem Beispiel verfügt
Employee
über eine Eigenschaft namens address
vom Typ Address
, die in das Asset Employee
eingebettet werden soll. Dies wird vom @Embedded()
-Dekorator angegeben.
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 Dekorator @Validate()
validiert. Beachten Sie, dass die Klasse Address
nicht über die Eigenschaft assetType
oder den Klassendekorator @Id()
verfügt. Dieser Vermögensgegenstand und seine Eigenschaften werden nicht separat im Buch gespeichert, sondern zusammen mit dem Vermögensgegenstand 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 zur Definition des aus anderen Eigenschaften abgeleiteten Attributs verwendet. Dieser Dekorateur hat zwei obligatorische Parameter:
STRATEGY
: Übernimmt Werte von CONCAT
oder HASH
. Erfordert einen zusätzlichen Parameter ALGORITHM
, wenn HASH
ausgewählt ist. Der Standardalgorithmus ist 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;
-
Methodendekorateure
@Validator(…params)
- Dieser Dekorator wird auf Methoden der Hauptcontrollerklasse angewendet. Dieser Dekorator ist wichtig für das Parsen der Argumente, das Validieren mit allen Eigenschaftsdekoratoren und das Zurückgeben eines Modell-/Typobjekts. Controller-Methoden müssen diesen Dekorator aktivieren. Es werden mehrere vom Benutzer erstellte Modelle oder Yup-Schemas als Parameter verwendet.
- Die Reihenfolge der Parameter muss genau mit der Reihenfolge der Argumente in der Methode übereinstimmen.
- Im folgenden Beispiel wird die Modellreferenz
Supplier
in dem Parameter übergeben, der dem Typ asset
im Methodenargument entspricht. Zur Laufzeit parst und konvertiert der Dekorateur das Methodenargument in ein JSON-Objekt, validiert es mit den Supplier
-Validatoren und konvertiert das JSON-Objekt nach erfolgreicher Validierung in ein Supplier
-Objekt und weist es der Variablen asset
zu. Anschließend wird 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 auch Yup-Schemaobjekte übergeben werden, wenn die Argumente Basistypen aufweisen. Im folgenden Beispiel weisen
supplierId
und rawMaterialSupply
den Typ string
bzw. number
auf, sodass das Yup-Schema mit ähnlichem Typ und korrekter Reihenfolge an den Dekorateur ü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
Transparente Persistenzfähigkeit 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.
SDK-Methoden, die ORM implementieren, sind die folgenden Methoden:
save
: Dadurch wird die Hyperledger Fabric-Methode putState
aufgerufen.
get
: Dadurch wird die Hyperledger Fabric-Methode getState
aufgerufen.
update
: Dadurch wird die Hyperledger Fabric-Methode putState
aufgerufen.
delete
: Dadurch wird die Hyperledger Fabric-Methode deleteState
aufgerufen.
history
: Dadurch wird die Hyperledger Fabric-Methode getHistoryForKey
aufgerufen.
getByRange
: Dadurch wird die Hyperledger Fabric-Methode getStateByRange
aufgerufen.
getByRangeWithPagination
: Dadurch wird die Hyperledger Fabric-Methode getStateByRangeWithPagination
aufgerufen.
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 aus der Klasse OchainModel
übernommen. 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 für die einsatzbereiten Methoden automatisch an den Controller übertragen. Sie müssen Konflikte weiterhin manuell lösen.
-
save
- Die Methode
save
fügt dem Ledger die asset
-Details des Aufrufers hinzu.
- Diese Methode ruft Hyperledger Fabric
putState
intern auf. Alle Marshalling / Unmarshalling wird 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 außerhalb des Assets im Buch.
- 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.
- Wenn Sie ein Asset mit dem angegebenen
id
zurückgeben möchten, verwenden Sie die allgemeine 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) Modellassetklasse, die zurückgegeben werden soll.
- Rückgabewert:
Promise: <Asset>
: Wenn der Parameter modelName
nicht angegeben ist und Daten im Ledger 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 wird, wird ein Objekt des Typs <Asset>
zurückgegeben. Obwohl ein Asset mit dem angegebenen id
aus dem Ledger zurückgegeben wird, kümmert sich diese Methode um das Casting in den Typ Asset
des Aufrufers. Wenn der aus dem Buch zurückgegebene Vermögensgegenstand 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 asset
-Details des Aufrufers im Ledger. Diese Methode gibt eine Zusage zurück.
- Diese Methode ruft 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 außerhalb des Assets im Buch.
- 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
- Dadurch wird der Vermögensgegenstand aus dem Buch gelöscht, das von
id
angegeben wird, sofern vorhanden. Diese Methode ruft die Hyperledger Fabric-Methode deleteState
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-Methode
getHistoryForKey
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 alle [] 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 des Assets zwischen dem Bereich
startId
und endId
zurückgegeben. Diese Methode ruft die Hyperledger Fabric-Methode getStateByRange
intern auf.
- Wenn der Parameter
modelName
nicht angegeben ist, gibt die Methode Promise<Object [ ] >
zurück. Wenn der Parameter modelName
angegeben wird, verarbeitet die Methode das Casting in den Typ Model
des Aufrufers. 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 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 Bereich enthalten.
endId : string
: Endschlüssel des Bereichs. Der Bereich ist ausgeschlossen.
modelName: <Model Asset Class Name>
: (Optional) Modellassetklasse, die zurückgegeben werden soll.
- 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.
- Dadurch wird eine Liste des Assets zwischen dem Bereich
startId
und endId
zurückgegeben. Diese Methode ruft die Hyperledger Fabric-Methode getStateByRangeWithPagination
intern auf.
- Wenn der Parameter
modelName
nicht angegeben ist, gibt die Methode Promise<Object [ ] >
zurück. Wenn der Parameter modelName
angegeben wird, verarbeitet die Methode das Casting in den Typ Model
des Aufrufers. 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 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 Bereich enthalten.
endId : string
: Endschlüssel des Bereichs. aus dem Bereich ausgeschlossen.
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>
nach Abschluss zurück.
-
getId
- Wenn das Asset den abgeleiteten Schlüssel
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.
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 innerhalb 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 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
Neben den oben genannten CRUD- und Non-CRUD-Methoden bietet Blockchain App Builder 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, 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 das Asset basierend auf dem angegebenen id
zurück. Dies ist eine generische Methode und wird verwendet, um Vermögensgegenstände eines beliebigen 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) an endId
(ausschließlich) zurück. Dies ist eine generische Methode und kann verwendet werden, um Assets jedes Typs abzurufen.
this.getAssetsByRange(startId: string, endId: string):
Promise<shim.Iterators.StateQueryIterator>
- Parameter:
startId : string
: Startschlüssel des Bereichs. Im Bereich enthalten.
endId : string
: Endschlüssel des Bereichs. Der Bereich ist ausgeschlossen.
- 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 Buch.
- Rückgabewert:
Promise<shim.Iterators.HistoryQueryIterator>
: Gibt einen Historienabfrageiterator 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 die Remotebereitstellung auf Oracle Blockchain Platform unterstützt. Dies ist eine generische Methode zur Ausführung 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 Statusabfrageiterator zurück. Sie müssen darüber iterieren.
-
queryWithPagination
- Diese Methode führt eine Rich SQL/Couch DB-Abfrage über das Hauptbuch aus, gefiltert nach Seitengröße und Lesezeichen. Diese Methode wird nur für die Remotebereitstellung auf Oracle Blockchain Platform unterstützt. Dies ist eine generische Methode zur Ausführung 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 Statusabfrageiterator 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 im Attributparameter beim Erstellen des zusammengesetzten Schlüssels angegebenen Spalte übereinstimmt. 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 Buch.
columns: string[ ]
: Attribute basierend auf dem Schlüssel 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:
- Rückgabewert:
string
: Gibt die Transaktions-ID für die aktuelle Chaincode-Aufrufanforderung zurück.
-
getTransactionTimestamp
- Gibt den Zeitstempel der Erstellung der Transaktion zurück. Dies wird aus der Transaktion
ChannelHeader
übernommen. Daher wird der Zeitstempel des Clients angegeben und für alle Endorser derselbe Wert verwendet.
this.getTransactionTimestamp(): Timestamp
- Parameter:
id : string
: Schlüssel zum Speichern von Daten im Buch.
- Rückgabewert:
Timestamp
: Gibt den Zeitstempel für die Erstellung der Transaktion zurück.
-
getChannelID
- Gibt die Kanal-ID für den Vorschlag für den zu verarbeitenden Chaincode zurück.
this.getChannelID(): string
- Parameter:
- 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:
- Rückgabewert:
shim.SerializedIdentity
: Gibt das Identitätsobjekt zurück.
-
getSignedProposal
- Gibt ein vollständig decodiertes Objekt des unterzeichneten Transaktionsvorschlags zurück.
this.getSignedProposal():
shim.ChaincodeProposal.SignedProposal
- Parameter:
- Rückgabewert:
shim.ChaincodeProposal.SignedProposal
: Gibt das dekodierte Objekt des unterzeichneten Transaktionsvorschlags zurück.
-
getArgs
- Gibt die Argumente als Zeichenfolgenarray aus der Chaincode-Aufrufanforderung zurück.
this.getArgs(): string[]
- Parameter:
- Rückgabewert:
string [ ]
: Gibt Argumente als Zeichenfolgenarray aus dem Chaincode-Aufruf zurück.
-
getStringArgs
- Gibt die Argumente als Zeichenfolgenarray aus der Chaincode-Aufrufanforderung zurück.
this.getStringArgs(): string[]
- Parameter:
- Rückgabewert:
string [ ]
: Gibt Argumente als Zeichenfolgenarray aus dem Chaincode-Aufruf zurück.
-
getMspID
- Gibt die MSP-ID der aufrufenden Identity zurück.
this.getMspID(): string
- Parameter:
- Rückgabewert:
string
: Gibt die MSP-ID der aufrufenden Identität zurück.
-
getNetworkStub
- Der Benutzer kann auf das Shim-Stub zugreifen, indem er die Methode
getNetworkStub
aufruft. Dies wird dem Benutzer helfen, seine eigene Implementierung der direkten Arbeit mit den Assets zu schreiben.
this.getNetworkStub(): shim.ChaincodeStub
- Parameter:
- Rückgabewert:
shim.ChaincodeStub
- Gibt 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 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
- 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 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 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 Typ des in der Spezifikationsdatei angegebenen Arguments 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() {
}
Initiierungsmethode
Eine benutzerdefinierte init
-Methode wird im Controller mit einer leeren Definition bereitgestellt. Wenn Sie Blockchain App Builder für das 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 upgraden, wird die Methode init
auch automatisch aufgerufen. Wenn Sie die Oracle Blockchain Platform-Konsole auf der Hyperledger Fabric v2.x-Plattform bereitstellen oder upgraden, 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 zu diesem Zeitpunkt einen beliebigen Anwendungsstatus initialisieren möchten, können Sie diese Methode verwenden.