Blockchain App Builder prende l'input dal file delle specifiche e genera un progetto di codice concatenato impalcato completamente funzionale. Il progetto contiene classi e funzioni generate automaticamente, metodi CRUD, metodi SDK, convalida automatica degli argomenti, marshalling/un-marshalling e capacità di persistenza trasparente (ORM).
Se il progetto chaincode utilizza la lingua TypeScript, il progetto scaffolded contiene tre file principali:
main.ts
<chaincodeName>.model.ts
<chaincodeName>.controller.ts
Tutte le librerie necessarie vengono installate e inserite in un package. Il file
tsconfig.json
contiene la configurazione necessaria per compilare e creare il progetto TypeScript.
Il file <chaincodeName>.model.ts
nella sottodirectory model
contiene più definizioni di asset e il file <chaincodeName>.controller.ts
nella sottodirectory controller
contiene il comportamento degli asset e i metodi CRUD.
I decoratori in model.ts
e controller.ts
forniscono supporto per funzioni come la convalida automatica degli argomenti, il marshalling/unmarshalling degli argomenti, la capacità di persistenza trasparente (ORM) e la chiamata di query avanzate.
dati
Ogni classe di modello estende la classe OchainModel
, che dispone di un'ulteriore proprietà di sola lettura denominata assetType
. Questa proprietà può essere utilizzata per recuperare solo asset di questo tipo. Eventuali modifiche a questa proprietà vengono ignorate durante la creazione e l'aggiornamento dell'asset. Il valore predefinito della proprietà è <modelName>
.
La classe
OchainModel
applica i comportamenti del decoratore alle proprietà della classe.
@Id('supplierId')
export class Supplier extends OchainModel<Supplier> {
public readonly assetType = 'supplier';
@Mandatory()
@Validate(yup.string())
public supplierId: string;
Decorator
-
Decoratori di classi
@Id(identifier)
- Questo decoratore identifica la proprietà che definisce in modo univoco l'asset sottostante. Questa proprietà viene utilizzata come chiave del record, che rappresenta questo asset nello stato del codice concatenato. Questo decoratore viene applicato automaticamente quando viene impalcato un nuovo progetto TypeScript. L'argomento
identifier
del decorator acquisisce il valore dal file di specifica.@Id('supplierId')
export class Supplier extends OchainModel{
...
}
-
Decoratori di proprietà
- È possibile utilizzare più decoratori di proprietà. I decoratori sono risolti in ordine dall'alto verso il basso.
@Mandatory()
- Questo decoratore contrassegna la proprietà seguente come obbligatoria, in modo che non possa essere saltata durante il salvataggio nel libro contabile. Se saltato, viene restituito un errore.
@Mandatory()
public supplierID: string;
@Default(param)
- Questo decorator indica che la proprietà seguente ha un valore predefinito. Il valore predefinito nell'argomento (
param
) viene utilizzato quando la proprietà viene saltata durante il salvataggio nel libro contabile.@Default('open for business')
@Validate(yup.string())
public remarks: string;
@Validate(param)
- La proprietà che segue questo decoratore viene convalidata in base allo schema specificato dal parametro. L'argomento
param
accetta uno schema yup e più metodi di schema possono essere concatenati per aggiungere convalide complesse. Per ulteriori informazioni, vedere https://www.npmjs.com/package/yup.@Validate(yup.number().min(3))
public productsShipped: number;
@ReadOnly(param)
- Questo decoratore di proprietà contrassegna la proprietà sottostante come di sola lettura. Il valore nell'argomento, ad esempio param, viene utilizzato quando la proprietà viene salvata nel libro contabile. Una volta impostato, il valore non può essere modificato o rimosso.
@ReadOnly('digicur')
public token_name: string;
@Embedded(PropertyClass)
- Questo decoratore di proprietà contrassegna la proprietà sottostante come un bene incorporabile. Prende la classe incorporabile come parametro. Questa classe deve estendere la classe
EmbeddedModel
. Questo requisito è convalidato dal decoratore.
- Nell'esempio seguente, la classe
Employee
ha una proprietà denominata address
di tipo Address
, che verrà incorporata nell'asset Employee
. Questo è indicato dal decoratore @Embedded()
.
export class Employee extends OchainModel<Employee> {
public readonly assetType = 'employee';
@Mandatory()
@Validate(yup.string())
public emplyeeID: string;
@Mandatory()
@Validate(yup.string().max(30))
public firstName: string;
@Mandatory()
@Validate(yup.string().max(30))
public lastName: string;
@Validate(yup.number().positive().min(18))
public age: number;
@Embedded(Address)
public address: Address;
}
export class Address extends EmbeddedModel<Address> {
@Validate(yup.string())
public street: string;
@Validate(yup.string())
public city: string;
@Validate(yup.string())
public state: string;
@Validate(yup.string())
public country: string;
}
- Quando viene creata una nuova istanza della classe
Address
, tutte le proprietà della classe Address
vengono convalidate automaticamente dal decoratore @Validate()
. Si noti che la classe Address
non dispone della proprietà assetType
o del decoratore della classe @Id()
. Questo cespite e le relative proprietà non vengono salvati separatamente nel libro contabile, ma vengono salvati insieme all'asset Employee
. Gli asset incorporati sono classi definite dall'utente che fungono da tipi di valore. L'istanza di questa classe può essere memorizzata solo nel libro contabile come parte dell'oggetto contenente (asset OchainModel
). Tutti i decoratori di cui sopra vengono applicati automaticamente in base al file di input durante l'impalcatura del progetto.
@Derived(STRATEGY, ALGORITHM, FORMAT)
- Questo decoratore viene utilizzato per definire l'attributo derivato da altre proprietà. Questo decoratore ha due parametri obbligatori:
STRATEGY
: accetta i valori CONCAT
o HASH
. Se si specifica HASH
, il parametro aggiuntivo ALGORITHM
è obbligatorio. L'algoritmo predefinito è sha256
; è supportato anche md5
.
FORMAT
: consente di utilizzare un array di stringhe e valori di specifica per la strategia.
@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;
-
Decoratori di metodi
@Validator(…params)
- Questo decoratore viene applicato ai metodi della classe principale del controller. Questo decoratore è importante per analizzare gli argomenti, convalidando contro tutti i decoratori della proprietà e restituendo un oggetto modello / tipo. I metodi del controller devono avere questo decoratore da richiamare. Richiede più modelli creati dall'utente o schemi yup come parametri.
- L'ordine dei parametri deve essere esattamente lo stesso dell'ordine degli argomenti nel metodo.
- Nell'esempio seguente, il riferimento al modello
Supplier
viene passato nel parametro che corrisponde al tipo asset
nell'argomento del metodo. In fase di esecuzione, il decorator analizza e converte l'argomento del metodo in un oggetto JSON, esegue la convalida in base ai programmi di convalida Supplier
e dopo la convalida riuscita converte l'oggetto JSON in un oggetto Supplier
e lo assegna alla variabile asset
. Quindi il metodo di base è finalmente chiamato.@Validator(Supplier)
public async createSupplier(asset: Supplier) {
return await this.Ctx.Model.save(asset);
}
- Nell'esempio seguente vengono passati più riferimenti agli asset che corrispondono ai tipi di oggetto degli argomenti del metodo. Notare l'ordine dei parametri.
@Validator(Supplier, Manufacturer)
public async createProducts(supplier: Supplier, manufacturer: Manufacturer) {
}
- Oltre ai riferimenti agli asset, gli oggetti dello schema yup possono essere passati anche se gli argomenti sono di tipo base. Nell'esempio seguente,
supplierId
e rawMaterialSupply
sono rispettivamente di tipo string
e number
, quindi lo schema yup di tipo simile e l'ordine corretto vengono passati al decorator. Prendere nota del concatenamento dei metodi dello schema yup.@Validator(yup.string(), yup.number().positive())
public async fetchRawMaterial(supplierID: string, rawMaterialSupply: number) {
const supplier = await this.Ctx.Model.get(supplierID, Supplier);
supplier.rawMaterialAvailable = supplier.rawMaterialAvailable + rawMaterialSupply;
return await this.Ctx.Model.update(supplier);
}
ORM
La funzionalità di persistenza trasparente o ORM semplificato viene acquisita nella classe Model
dell'oggetto Contesto (Ctx
). Se il modello chiama uno qualsiasi dei seguenti metodi SDK, accedervi utilizzando this.Ctx.Model
.
I seguenti metodi SDK implementano ORM:
save
chiama il metodo Hyperledger Fabric putState
.
get
chiama il metodo Hyperledger Fabric getState
.
update
chiama il metodo Hyperledger Fabric putState
.
delete
chiama il metodo Hyperledger Fabric deleteState
.
history
chiama il metodo Hyperledger Fabric getHistoryForKey
.
getByRange
chiama il metodo Hyperledger Fabric getStateByRange
.
getByRangeWithPagination
chiama il metodo Hyperledger Fabric getStateByRangeWithPagination
.
Per ulteriori informazioni, vedere:
Metodi SDK.
Metodi SDK
Nota
A partire dalla versione 21.3.2, la modalità di accesso ai metodi ORM è cambiata. Eseguire il comando
ochain --version
per determinare la versione di Blockchain App Builder.
Nelle release precedenti, i metodi ORM venivano ereditati dalla classe OchainModel
. Nella versione 21.3.2 e successive, i metodi sono definiti nella classe Model
dell'oggetto Context (Ctx
). Per chiamare questi metodi, accedervi utilizzando this.Ctx.Model.<method_name>
.
L'esempio seguente mostra una chiamata di metodo nelle release precedenti.
@Validator(Supplier)
public async createSupplier(asset: Supplier){
return await asset.save();
}
L'esempio seguente mostra una chiamata di metodo dalla versione 21.3.2 e successive:
@Validator(Supplier)
public async createSupplier(asset: Supplier) {
return await this.Ctx.Model.save(asset);
}
Dopo l'aggiornamento alla versione 21.3.2, apportare questa modifica in tutti i progetti di codice concatenato creati con una versione precedente di Blockchain App Builder. Se si utilizza il comando sync
per sincronizzare le modifiche tra il file di specifica e il codice sorgente, le modifiche vengono automaticamente apportate al controller per i metodi pronti all'uso. È comunque necessario risolvere manualmente eventuali conflitti.
-
save
- Il metodo
save
aggiunge i dettagli del chiamante asset
al libro contabile.
- Questo metodo chiama Hyperledger Fabric
putState
internamente. Tutti i marshalling/unmarshalling sono gestiti internamente. Il metodo save
fa parte della classe Model
, a cui si accede utilizzando l'oggetto Ctx
.
-
Ctx.Model.save(asset: <Instance of Asset Class> , extraMetadata?: any) : Promise <any>
- Parametri:
extraMetadata : any
(facoltativo) – utilizzato per salvare i metadati separatamente dall'asset nel libro contabile.
- Restituisce:
Promise<any>
- Restituisce una promessa al completamento.
- Esempio:
@Validator(Supplier)
public async createSupplier(asset: Supplier) {
return await this.Ctx.Model.save(asset);
}
-
get
- Il metodo
get
è un metodo della classe OchainModel
, ereditato dalle classi di modelli concreti di {chaincodeName}.model.ts
. Il metodo get
fa parte della classe Model
, a cui si accede utilizzando l'oggetto Ctx
.
- Per restituire un asset da un dato
id
, utilizzare il metodo del controller generico getAssetById
.
-
Ctx.Model.get(id: string, modelName: <Model Asset Class Name>) : Promise<asset>
- Parametri:
id : string
: chiave utilizzata per salvare i dati nel libro contabile.
modelName: <Model Asset Class Name>
: (facoltativo) modello di classe asset da restituire.
- Restituisce:
Promise: <Asset>
: se il parametro modelName
non viene fornito ed esistono dati nel libro contabile, viene restituito Promise<object>
. Se il parametro id
non esiste nel libro contabile, viene restituito un messaggio di errore. Se viene fornito il parametro modelName
, viene restituito un oggetto di tipo <Asset>
. Anche se qualsiasi asset con il dato id
viene restituito dal libro contabile, questo metodo gestirà il casting nel tipo chiamante Asset
. Se il cespite restituito dal libro contabile non è di tipo Asset
, il metodo restituisce un errore. Questo controllo viene eseguito dalla proprietà assetType
di sola lettura nella classe Model
.
- Esempio:
@Validator(yup.string())
public async getSupplierById(id: string) {
const asset = await this.Ctx.Model.get(id, Supplier);
return asset;
}
Nell'esempio, asset
è di tipo Supplier
.
-
update
- Il metodo
update
aggiorna i dettagli del chiamante asset
nel libro contabile. Questo metodo restituisce una promessa.
- Questo metodo chiama Hyperledger Fabric
putState
internamente. Tutto il marshalling/unmarshalling è gestito internamente. Il metodo update
fa parte della classe Model
, a cui è possibile accedere utilizzando l'oggetto Ctx
.
-
Ctx.Model.update(asset: <Instance of Asset Class> , extraMetadata?: any) : Promise <any>
- Parametri:
extraMetadata : any
(facoltativo) – utilizzato per salvare i metadati separatamente dall'asset nel libro contabile.
- Restituisce:
Promise<any>
- Restituisce una promessa al completamento.
- Esempio:
@Validator(Supplier)
public async updateSupplier(asset: Supplier) {
return await this.Ctx.Model.update(asset);
}
-
delete
- Questo elimina il cespite dal libro contabile fornito da
id
se esiste. Questo metodo chiama internamente il metodo Hyperledger Fabric deleteState
. Il metodo delete
fa parte della classe Model
, a cui è possibile accedere utilizzando l'oggetto Ctx
.
-
Ctx.Model.delete(id: string): Promise <any>
- Parametri:
id : string
: chiave utilizzata per salvare i dati nel libro contabile.
- Restituisce:
Promise <any>
- Restituisce una promessa al completamento.
- Esempio:
@Validator(yup.string())
public async deleteSupplier(id: string) {
const result = await this.Ctx.Model.delete(id);
return result;
}
-
history
- Il metodo
history
fa parte della classe Model
, a cui è possibile accedere utilizzando l'oggetto Ctx
. Questo metodo restituisce la cronologia dei cespiti fornita da id
dal libro contabile, se esistente.
- Questo metodo chiama internamente il metodo Hyperledger Fabric
getHistoryForKey
.
-
Ctx.Model.history(id: string): Promise <any>
- Parametri:
id : string
: chiave utilizzata per salvare i dati nel libro contabile.
- Restituisce:
Promise <any[]>
- Restituisce qualsiasi [] al completamento.
- Esempio
@Validator(yup.string())
public async getSupplierHistoryById(id: string) {
const result = await this.Ctx.Model.history(id);
return result;
}
- Esempio della cronologia asset restituita per
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
- Il metodo
getByRange
è un metodo statico della classe OchainModel
ereditato dalle classi Model
concrete di {chaincodeName}.model.ts
.
- Questo metodo restituisce una lista di asset compresi tra l'intervallo
startId
e endId
. Questo metodo chiama internamente il metodo Hyperledger Fabric getStateByRange
.
- Se il parametro
modelName
non viene fornito, il metodo restituisce Promise<Object [ ] >
. Se viene fornito il parametro modelName
, il metodo gestisce il casting nel tipo Model
del chiamante. Nell'esempio seguente, l'array dei risultati è di tipo Supplier
. Se il cespite restituito dal libro contabile non è di tipo Model
, non verrà incluso nell'elenco. Questo controllo viene eseguito dalla proprietà assetType
di sola lettura nella classe Model
.
- Per restituire tutti gli asset compresi tra l'intervallo
startId
e endId
, utilizzare il metodo controller generico getAssetsByRange
.
-
Ctx.Model.getByRange(startId: string, endId: string, modelName: <Asset Model Class Name> ): Promise <any>
- Parametri:
startId : string
– Chiave iniziale dell'intervallo, inclusa nell'intervallo.
endId : string
: chiave finale dell'intervallo, esclusa dall'intervallo.
modelName: <Model Asset Class Name>
: (facoltativo) modello di classe asset da restituire.
- Restituisce:
Promise< Asset[ ] >
- Restituisce l'array di <Asset>
al completamento.
- Esempio:
@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
- Il metodo
getByRangeWithPagination
è un metodo statico della classe OchainModel
ereditato dalle classi Model
concrete di {chaincodeName}.model.ts
.
- Questo metodo restituisce un elenco di asset compreso tra
startId
e endId
. Questo metodo chiama internamente il metodo Hyperledger Fabric getStateByRangeWithPagination
.
- Se il parametro
modelName
non viene fornito, il metodo restituisce Promise<Object [ ] >
. Se viene fornito il parametro modelName
, il metodo gestisce il casting nel tipo Model
del chiamante. Nell'esempio seguente, l'array dei risultati è di tipo Supplier
. Se il cespite restituito dal libro contabile non è di tipo Model
, non verrà incluso nell'elenco. Questo controllo viene eseguito dalla proprietà assetType
di sola lettura nella classe Model
.
- Per restituire tutti gli asset compresi tra l'intervallo
startId
e endId
, filtrati in base alle dimensioni della pagina e ai segnalibri, utilizzare il metodo controller generico 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[]>
- Parametri:
startId : string
– Chiave iniziale dell'intervallo, inclusa nell'intervallo.
endId : string
: chiave finale dell'intervallo, esclusa dall'intervallo.
pageSize : number
: la dimensione della pagina della query.
bookmark : string
: il segnalibro della query. L'output inizia da questo segnalibro.
modelName: <Model Asset Class Name>
: (facoltativo) modello di classe asset da restituire.
- Restituisce:
Promise< Asset[ ] >
- Restituisce l'array di <Asset>
al completamento.
-
getId
- Quando il cespite ha una chiave derivata come
Id
, è possibile utilizzare questo metodo per ottenere un ID derivato. Questo metodo restituisce un errore se la chiave derivata contiene %t
(indicatore orario).
- Parametri:
object
: l'oggetto deve contenere tutte le proprietà da cui dipende la chiave derivata.
- Restituisce:
- Restituisce la chiave derivata come stringa.
- Esempio:
@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);
}
Per i metodi SDK del token, vedere gli argomenti in Supporto della tokenizzazione mediante Blockchain App Builder.
Controller
La classe del controller principale estende la classe OchainController
. C'è solo un controller principale.
export class TSProjectController extends OchainController{
È possibile creare un numero qualsiasi di classi, funzioni o file, ma solo i metodi definiti nella classe principale del controller sono richiamabili dall'esterno; il resto sono nascosti.
Metodi generati automaticamente
Come descritto in File di specifica di input, è possibile specificare i metodi CRUD da generare nel file di specifica. Ad esempio, se è stato specificato di generare tutti i metodi, il risultato sarà simile al codice seguente:
@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;
}
Dettagli metodo controller
Oltre al modello precedente CRUD e metodi non CRUD, Blockchain App Builder fornisce il supporto pronto all'uso dal nostro controller per i seguenti metodi Hyperledger Fabric:
getAssetById
getAssetsByRange
getAssetHistoryById
query
queryWithPagination
generateCompositeKey
getByCompositeKey
getTransactionId
getTransactionTimestamp
getChannelID
getCreator
getSignedProposal
getArgs
getStringArgs
getMspID
getNetworkStub
Nota
Questi metodi sono disponibili con il contesto
this
in qualsiasi classe che estende la classe
OChainController
.
Ad esempio:
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
- Il metodo
getAssetById
restituisce un asset in base a un ID specificato. Questo è un metodo generico e può essere utilizzato per ottenere asset di qualsiasi tipo.
this.getAssetById(id: string): Promise<byte[]>
- Parametri:
id : string
: chiave utilizzata per salvare i dati nel libro contabile.
- Restituisce:
Promise <byte [ ]>
: promessa di restituzione al completamento. È necessario convertire byte[]
in un oggetto.
-
getAssetsByRange
- Il metodo
getAssetsByRange
restituisce tutti gli asset presenti da startId
(incluso) a endId
(escluso) indipendentemente dai tipi di asset. Questo è un metodo generico e può essere utilizzato per ottenere asset di qualsiasi tipo.
this.getAssetsByRange(startId: string, endId: string):
Promise<shim.Iterators.StateQueryIterator>
- Parametri:
startId : string
– Chiave iniziale dell'intervallo, inclusa nell'intervallo.
endId : string
: chiave finale dell'intervallo, esclusa dall'intervallo.
- Restituisce:
Promise< shim.Iterators.StateQueryIterator>
: restituisce un iteratore al completamento. Devi iterare su di esso.
-
getAssetHistoryById
- Il metodo
getAssetHistoryById
restituisce l'iteratore della cronologia di un asset per un ID specificato.
this.getAssetHistoryById(id: string):
Promise<shim.Iterators.HistoryQueryIterator>
- Parametri:
id : string
: chiave utilizzata per salvare i dati nel libro contabile.
- Restituisce:
Promise<shim.Iterators.HistoryQueryIterator>
: restituisce un iteratore di query della cronologia. Devi iterare su di esso.
-
query
- Il metodo
query
esegue una query SQL/Couch DB avanzata sul libro contabile. Questo metodo è supportato solo per le distribuzioni remote su Oracle Blockchain Platform. Metodo generico per l'esecuzione di query SQL nel libro contabile.
this.query(queryStr: string):
Promise<shim.Iterators.StateQueryIterator>
- Parametri:
queryStr : string
- Query Rich SQL/Couch DB.
- Restituisce:
Promise<shim.Iterators.StateQueryIterator>
: restituisce un iteratore di query di stato. Devi iterare su di esso.
-
queryWithPagination
- Questo metodo esegue una query SQL/Couch DB avanzata sul libro contabile, filtrata in base alle dimensioni della pagina e ai segnalibri. Questo metodo è supportato solo per le distribuzioni remote su Oracle Blockchain Platform. Metodo generico per l'esecuzione di query SQL nel libro contabile.
-
public async queryWithPagination(query: string, pageSize: number, bookmark?: string)
- Parametri:
query : string
- Query Rich SQL/Couch DB.
pageSize : number
: la dimensione della pagina della query.
bookmark : string
: il segnalibro della query. L'output inizia da questo segnalibro.
- Restituisce:
Promise<shim.Iterators.StateQueryIterator>
: restituisce un iteratore di query di stato. Devi iterare su di esso.
-
generateCompositeKey
- Questo metodo genera e restituisce la chiave composta in base al valore
indexName
e agli attributi specificati negli argomenti.
this.generateCompositeKey(indexName: string, attributes:
string[]): string
- Parametri:
indexName : string
: tipo di oggetto della chiave utilizzata per salvare i dati nel libro contabile.
attributes: string[ ]
- Attributi in base ai quali verrà formata una chiave composta.
- Restituisce:
string
: restituisce una chiave composta.
-
getByCompositeKey
- Questo metodo restituisce l'asset che corrisponde alla chiave e alla colonna specificate nel parametro dell'attributo durante la creazione di una chiave composta. Il parametro
indexOfId
indica l'indice della chiave restituito nell'array del metodo stub SplitCompositeKey
. Internamente questo metodo chiama i metodi getStateByPartialCompositeKey
, splitCompositeKey
e getState
di Hyperledger Fabric.
this.getByCompositeKey(key: string, columns: string[],
indexOfId: number): Promise<any []>
- Parametri:
key: string
: chiave utilizzata per salvare i dati nel libro contabile.
columns: string[ ]
- Attributi in base ai quali viene generata una chiave.
indexOfId: number
: indice dell'attributo da recuperare dalla chiave.
- Restituisce:
Promise< any [ ]
- Restituisce qualsiasi []
al completamento.
-
getTransactionId
- Restituisce l'ID transazione per la richiesta di richiamo del codice concatenato corrente. L'ID transazione identifica in modo univoco la transazione nell'ambito del canale.
this.getTransactionId(): string
- Parametri:
- Restituisce:
string
: restituisce l'ID della transazione per la richiesta di richiamo del codice concatenato corrente.
-
getTransactionTimestamp
- Restituisce l'indicatore orario durante la creazione della transazione. Questo è preso dalla transazione
ChannelHeader
, quindi indicherà l'indicatore orario del cliente e avrà lo stesso valore in tutti gli sponsor.
this.getTransactionTimestamp(): Timestamp
- Parametri:
id : string
: chiave utilizzata per salvare i dati nel libro contabile.
- Restituisce:
Timestamp
: restituisce l'indicatore orario durante la creazione della transazione.
-
getChannelID
- Restituisce l'ID canale per la proposta per il codice concatenato da elaborare.
this.getChannelID(): string
- Parametri:
- Restituisce:
string
: restituisce l'ID del canale.
-
getCreator
- Restituisce l'oggetto di identità dell'autore sottomissione del richiamo del codice concatenato.
this.getCreator(): shim.SerializedIdentity
- Parametri:
- Restituisce:
shim.SerializedIdentity
: restituisce l'oggetto identità.
-
getSignedProposal
- Restituisce un oggetto completamente decodificato della proposta di transazione firmata.
this.getSignedProposal():
shim.ChaincodeProposal.SignedProposal
- Parametri:
- Restituisce:
shim.ChaincodeProposal.SignedProposal
- Restituisce l'oggetto decodificato della proposta di transazione firmata.
-
getArgs
- Restituisce gli argomenti come array di stringhe dalla richiesta di richiamo del codice concatenato.
this.getArgs(): string[]
- Parametri:
- Restituisce:
string [ ]
: restituisce gli argomenti come array di stringhe dal richiamo del codice concatenato.
-
getStringArgs
- Restituisce gli argomenti come array di stringhe dalla richiesta di richiamo del codice concatenato.
this.getStringArgs(): string[]
- Parametri:
- Restituisce:
string [ ]
: restituisce gli argomenti come array di stringhe dal richiamo del codice concatenato.
-
getMspID
- Restituisce l'ID MSP dell'identità di richiamo.
this.getMspID(): string
- Parametri:
- Restituisce:
string
: restituisce l'ID MSP dell'identità di richiamo.
-
getNetworkStub
- Puoi accedere allo shim stub chiamando questo metodo. Questo può aiutarti a scrivere la tua implementazione di lavorare direttamente con gli asset.
this.getNetworkStub(): shim.ChaincodeStub
- Parametri:
- Restituisce:
shim.ChaincodeStub
- Restituisce lo stub della rete con codice concatenato.
-
invokeCrossChaincode
- È possibile utilizzare questo metodo in un codice concatenato per chiamare una funzione in un altro codice concatenato. Entrambi i codici concatenati devono essere installati sullo stesso peer.
-
this.invokeCrossChaincode(chaincodeName: string, methodName: string, args: string[], channelName: string): Promise<any>
- Parametri:
chaincodeName
– Il nome del codice concatenato da chiamare.
methodName
- Il nome del metodo da chiamare nel codice concatenato.
arg
: l'argomento del metodo chiamante.
channelName
- Il canale in cui si trova il codice concatenato da chiamare.
- Restituisce:
Promise<any>
: restituisce un oggetto JSON che contiene tre campi:
isValid
- true
se la chiamata è valida.
payload
: l'output restituito dalla chiamata cross-chaincode come oggetto JSON.
message
- Il messaggio restituito dalla chiamata cross-chaincode, in formato UTF-8.
-
invokeChaincode
- Questo metodo chiama una funzione in un altro codice concatenato. Entrambi i codici concatenati devono essere installati sullo stesso peer.
-
this.invokeChaincode(chaincodeName: string, methodName: string, args: string[], channelName: string): Promise<any>
- Parametri:
chaincodeName
– Il nome del codice concatenato da chiamare.
methodName
- Il nome del metodo da chiamare nel codice concatenato.
arg
: l'argomento del metodo chiamante.
channelName
- Il canale in cui si trova il codice concatenato da chiamare.
- Restituisce:
Promise<any>
: restituisce un oggetto JSON che contiene tre campi:
isValid
- true
se la chiamata è valida.
payload
: l'output restituito dalla chiamata cross-chaincode come oggetto JSON.
message
- Il messaggio restituito dalla chiamata cross-chaincode, in formato UTF-8.
Metodi personalizzati
I seguenti metodi personalizzati sono stati generati dal nostro file di specifica di esempio.
Il metodo executeQuery
mostra come è possibile chiamare le query SQL rich. I validator rispetto agli argomenti vengono aggiunti automaticamente da Blockchain App Builder in base al tipo di argomento specificato nel file di specifica.
/**
*
* 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() {
}
Metodo inizializzazione
Nel controller viene fornito un metodo init
personalizzato con una definizione vuota. Se si utilizza Blockchain App Builder per la distribuzione o l'aggiornamento, il metodo init
viene richiamato automaticamente. Se si esegue la distribuzione o l'upgrade dalla console di Oracle Blockchain Platform, è necessario chiamare il metodo init
manualmente. È possibile utilizzare uno strumento di terze parti come Postman per chiamare manualmente il metodo init
.
export class TestTsProjectController extends OchainController {
public async init(params: any) {
return;
}
È quindi possibile utilizzare questo metodo per inizializzare qualsiasi stato dell'applicazione.