Blockchain App Builder prende l'input dal file di specifica 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 codice concatenato 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 pacchetti. Il file
tsconfig.json
contiene la configurazione necessaria per compilare e generare 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 vari decoratori in model.ts
e controller.ts
forniscono supporto per funzioni quali la convalida automatica degli argomenti, il marshalling/unmarshalling degli argomenti, la capacità di persistenza trasparente (ORM) e la chiamata di rich query.
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 gli asset di questo tipo. Eventuali modifiche a questa proprietà vengono ignorate durante la creazione e l'aggiornamento dell'asset. Per impostazione predefinita, il valore 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
-
Decori di classe
@Id(identifier)
- Questo decorator 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 decorator viene applicato automaticamente quando viene impalcato un nuovo progetto TypeScript. L'argomento 'identificativo' del decorator prende il valore dal file di specifica.
@Id('supplierId')
export class Supplier extends OchainModel{
...
}
-
Decori proprietà
- È possibile utilizzare più decoratori di proprietà. I decoratori vengono risolti in ordine dall'alto verso il basso.
@Mandatory()
- Questa proprietà viene contrassegnata come obbligatoria e non può essere ignorata durante il salvataggio nel libro contabile. Se saltato, genera un errore.
@Mandatory()
public supplierID: string;
@Default(param)
- Questa proprietà può avere 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à seguente viene convalidata in base allo schema presentato nel parametro. L'argomento
param
accetta uno schema yup e molti metodi di schema possono essere concatenati. È possibile aggiungere molte convalide complesse. Per ulteriori informazioni, vedere https://www.npmjs.com/package/yup.@Validate(yup.number().min(3))
public productsShipped: number;
@ReadOnly(param)
- Questo decorator proprietà contrassegna la proprietà sottostante come con un valore di sola lettura. Il valore dell'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 decorator proprietà contrassegna la proprietà sottostante come asset incorporabile. La classe incorporabile viene utilizzata come parametro. Questa classe deve estendere la classe
EmbeddedModel
. Questo è confermato dal decoratore.
- In questo esempio,
Employee
dispone di una proprietà denominata address
di tipo Address
, che deve essere incorporata con l'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 decorator @Validate()
. Si noti che la classe Address
non dispone della proprietà assetType
o del decorator di classi @Id()
. Questo cespite e le relative proprietà non vengono salvati separatamente nel libro contabile, ma vengono salvati insieme al cespite Employee
. Gli asset incorporati sono classi definite dall'utente che funzionano come tipi di valore. L'istanza di questa classe può essere memorizzata nel libro contabile solo 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 decorator viene utilizzato per definire l'attributo derivato da altre proprietà. Questo decoratore ha due parametri obbligatori:
STRATEGY
: accetta i valori CONCAT
o HASH
. Richiede un parametro aggiuntivo ALGORITHM
se si seleziona HASH
. L'algoritmo predefinito è sha256
; è supportato anche md5
.
FORMAT
: accetta un array di stringhe e valori di specifica che devono essere utilizzati dalla 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;
-
Decorazione dei metodi
@Validator(…params)
- Questo decoratore viene applicato ai metodi della classe controller principale. Questo decorator è importante per analizzare gli argomenti, convalidando tutti i decorator di proprietà e restituendo un oggetto modello/tipo. I metodi controller devono disporre di questo decorator per poter essere richiamati. Ci vogliono 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 validator Supplier
e, dopo la convalida riuscita, converte l'oggetto JSON in un oggetto Supplier
e lo assegna alla variabile asset
. Quindi il metodo sottostante è finalmente chiamato.@Validator(Supplier)
public async createSupplier(asset: Supplier) {
return await this.Ctx.Model.save(asset);
}
- Nell'esempio seguente vengono passati più riferimenti di asset, che corrispondono ai tipi di oggetto degli argomenti del metodo. Si noti 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 tipi base. Nell'esempio seguente,
supplierId
e rawMaterialSupply
sono rispettivamente di tipo string
e number
, pertanto lo schema yup di tipo simile e l'ordine corretto vengono passati al decorator. Notare il concatenamento dei metodi di 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 richiama uno dei seguenti metodi SDK, accedervi utilizzando this.Ctx.Model
.
I metodi SDK che implementano ORM sono i seguenti:
save
: chiama il metodo putState
di Hyperledger Fabric
get
: chiama il metodo getState
di Hyperledger Fabric
update
: chiama il metodo putState
di Hyperledger Fabric
delete
: chiama il metodo deleteState
di Hyperledger Fabric
history
: chiama il metodo getHistoryForKey
di Hyperledger Fabric
getByRange
: chiama il metodo getStateByRange
di Hyperledger Fabric
getByRangeWithPagination
: chiama il metodo getStateByRangeWithPagination
di Hyperledger Fabric
Per ulteriori informazioni, vedere:
Metodi SDK.
Metodi SDK
Nota
A partire dalla versione 21.3.2, il modo di accedere ai metodi ORM è cambiato. 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 Contesto (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 aver eseguito l'aggiornamento alla versione 21.3.2, apportare questa modifica in tutti i progetti con 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 trasferite 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 internamente Hyperledger Fabric
putState
. Tutto il marshalling/unmarshalling viene gestito 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): consente di salvare i metadati separati dal cespite 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 di classe OchainModel
ereditato dalle classi di modello concreto di {chaincodeName}.model.ts
. Il metodo get
fa parte della classe Model
, a cui si accede utilizzando l'oggetto Ctx
.
- Se si desidera restituire un asset in base all'indirizzo
id
specificato, utilizzare il metodo di controllo 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) classe asset modello da restituire.
- Restituisce:
Promise: <Asset>
: se il parametro modelName
non viene fornito e i dati esistono 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 cespite con il valore id
specificato viene restituito dal libro contabile, questo metodo si occuperà del casting nel tipo Asset
del chiamante. Se il cespite restituito dal libro contabile non è di tipo Asset
, viene generato un errore. Questo controllo viene eseguito dalla proprietà di sola lettura assetType
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 internamente Hyperledger Fabric
putState
. Tutto il marshalling/unmarshalling viene gestito internamente. Il metodo update
fa parte della classe Model
, alla quale è possibile accedere utilizzando l'oggetto Ctx
.
-
Ctx.Model.update(asset: <Instance of Asset Class> , extraMetadata?: any) : Promise <any>
- Parametri:
extraMetadata : any
(facoltativo): consente di salvare i metadati separati dal cespite 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
- Questa operazione elimina il cespite dal libro contabile fornito da
id
, se esistente. Questo metodo chiama internamente il metodo deleteState
di Hyperledger Fabric. Il metodo delete
fa parte della classe Model
, alla quale è 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
, alla quale è 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
getHistoryForKey
di Hyperledger Fabric.
-
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 degli 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 di classe OchainModel
ereditato dalle classi Model
concrete di {chaincodeName}.model.ts
.
- Restituisce un elenco di asset compreso nell'intervallo
startId
e endId
. Questo metodo chiama internamente il metodo getStateByRange
di Hyperledger Fabric.
- 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à di sola lettura assetType
nella classe Model
.
- Per restituire tutti gli asset compresi tra l'intervallo
startId
e endId
, utilizzare il metodo di controllo generico getAssetsByRange
.
-
Ctx.Model.getByRange(startId: string, endId: string, modelName: <Asset Model Class Name> ): Promise <any>
- Parametri:
startId : string
: chiave iniziale dell'intervallo. Incluso nell'intervallo.
endId : string
: chiave finale dell'intervallo. Escluso dall'intervallo.
modelName: <Model Asset Class Name>
: (facoltativo) classe asset modello 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 di classe OchainModel
ereditato dalle classi Model
concrete di {chaincodeName}.model.ts
.
- Restituisce un elenco di asset compreso nell'intervallo
startId
e endId
. Questo metodo chiama internamente il metodo getStateByRangeWithPagination
di Hyperledger Fabric.
- 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à di sola lettura assetType
nella classe Model
.
- Per restituire tutti gli asset compresi tra l'intervallo
startId
e endId
, filtrati in base alla dimensione della pagina e ai segnalibri, utilizzare il metodo generico del controller 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. Incluso nell'intervallo.
endId : string
: chiave finale dell'intervallo. Escluso 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) classe asset modello da restituire.
- Restituisce:
Promise< Asset[ ] >
: restituisce l'array di <Asset>
al completamento.
-
getId
- Quando la chiave derivata del cespite è
Id
, è possibile utilizzare questo metodo per ottenere un ID derivato. Questo metodo restituirà 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 di token, vedere gli argomenti nella sezione Supporto alla generazione di token mediante Blockchain App Builder.
Controllore
La classe controller principale estende OchainController
. C'è un solo controller principale.
export class TSProjectController extends OchainController{
È possibile creare un numero qualsiasi di classi, funzioni o file, ma solo i metodi definiti all'interno della classe controller principale possono essere richiamati dall'esterno, mentre il resto è nascosto.
Metodi generati automaticamente
Come descritto in File di specifica input, è possibile specificare i metodi CRUD che si desidera generare nel file di specifica. Ad esempio, se si è scelto di generare tutti i metodi, il risultato sarà simile al 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 ai metodi CRUD e non CRUD di cui sopra, Blockchain App Builder fornisce supporto pronto all'uso per altri metodi Hyperledger Fabric dal nostro controller. Di seguito sono indicati i metodi disponibili.
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 il cespite in base al valore id
fornito. Si tratta di un metodo generico che 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 [ ]>
: restituisce la promessa 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. Si tratta di un metodo generico che 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. Incluso nell'intervallo.
endId : string
: chiave finale dell'intervallo. Escluso dall'intervallo.
- Restituisce:
Promise< shim.Iterators.StateQueryIterator>
: restituisce un iteratore al completamento. Devi ripetere su di esso.
-
getAssetHistoryById
- Il metodo
getAssetHistoryById
restituisce l'iteratore della cronologia di un asset per id
fornito.
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 della query di cronologia. Devi ripetere su di esso.
-
query
- Il metodo
query
eseguirà una query Rich SQL/Couch DB sul libro contabile. Questo metodo è supportato solo per la distribuzione remota su Oracle Blockchain Platform. Si tratta di un metodo generico per l'esecuzione di query SQL sul 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 della query di stato. Devi ripetere su di esso.
-
queryWithPagination
- Questo metodo esegue una query Rich SQL/Couch DB sul libro contabile, filtrata in base alla dimensione della pagina e ai segnalibri. Questo metodo è supportato solo per la distribuzione remota su Oracle Blockchain Platform. Si tratta di un metodo generico per l'esecuzione di query SQL sul 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 della query di stato. Devi ripetere su di esso.
-
generateCompositeKey
- Questo metodo genera e restituisce la chiave composta in base al
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 la chiave composta.
- Restituisce:
string
: restituisce una chiave composta.
-
getByCompositeKey
- Questo metodo restituisce l'asset che corrisponde alla chiave e alla colonna specificata nel parametro dell'attributo durante la creazione della chiave composta. Il parametro
indexOfId
indica l'indice della chiave restituito nell'array del metodo stub SplitCompositeKey
. Internamente questo metodo chiama 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[ ]
: vengono generati gli attributi basati sulla 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 transazione per la richiesta di richiamo del codice concatenato corrente.
-
getTransactionTimestamp
- Restituisce l'indicatore orario di creazione della transazione. Questo è tratto dalla transazione
ChannelHeader
, quindi indicherà l'indicatore orario del cliente e avrà lo stesso valore tra tutti gli approvatori.
this.getTransactionTimestamp(): Timestamp
- Parametri:
id : string
: chiave utilizzata per salvare i dati nel libro contabile.
- Restituisce:
Timestamp
: restituisce l'indicatore orario di creazione della transazione.
-
getChannelID
- Restituisce l'ID canale per la proposta di codice concatenato da elaborare.
this.getChannelID(): string
- Parametri:
- Restituisce:
string
: restituisce l'ID canale.
-
getCreator
- Restituisce l'oggetto 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à chiamante.
this.getMspID(): string
- Parametri:
- Restituisce:
string
: restituisce l'ID MSP dell'identità chiamante.
-
getNetworkStub
- L'utente può accedere allo stub shim chiamando il metodo
getNetworkStub
. Questo aiuterà l'utente a scrivere la propria implementazione di lavorare direttamente con gli asset.
this.getNetworkStub(): shim.ChaincodeStub
- Parametri:
- Restituisce:
shim.ChaincodeStub
: restituisce lo stub di rete del 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 contenente tre campi:
isValid
: true
se la chiamata è valida.
payload
: l'output restituito dalla chiamata cross-chaincode sotto forma di oggetto JSON.
message
: il messaggio restituito dalla chiamata cross-chaincode in formato UTF-8.
-
invokeChaincode
- È 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.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 contenente tre campi:
isValid
: true
se la chiamata è valida.
payload
: l'output restituito dalla chiamata cross-chaincode sotto forma di oggetto JSON.
message
: il messaggio restituito dalla chiamata cross-chaincode in formato UTF-8.
Metodi personalizzati
I seguenti metodi personalizzati sono stati generati dal file delle specifiche di esempio.
executeQuery
mostra in che modo è possibile chiamare le query rich SQL. I programmi di convalida 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 Init
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 chiamato automaticamente. Se si esegue la distribuzione o l'aggiornamento dalla console di Oracle Blockchain Platform sulla piattaforma Hyperledger Fabric v1.4.7, viene chiamato automaticamente anche il metodo init
. Se si esegue la distribuzione o l'aggiornamento dalla console di Oracle Blockchain Platform sulla piattaforma Hyperledger Fabric v2.x, è necessario chiamare manualmente il metodo init
. È possibile utilizzare uno strumento di terze parti, ad esempio Postman, per chiamare manualmente il metodo init
.
export class TestTsProjectController extends OchainController {
public async init(params: any) {
return;
}
Se si desidera inizializzare uno stato dell'applicazione in questo momento, è possibile utilizzare questo metodo per eseguire questa operazione.