Progetto codice concatenato TypeScript impalcato

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:
  • nessuno
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:
  • nessuno
Restituisce:
  • string: restituisce l'ID canale.
getCreator
Restituisce l'oggetto identità dell'autore sottomissione del richiamo del codice concatenato.
this.getCreator(): shim.SerializedIdentity
Parametri:
  • nessuno
Restituisce:
  • shim.SerializedIdentity: restituisce l'oggetto identità.
getSignedProposal
Restituisce un oggetto completamente decodificato della proposta di transazione firmata.
this.getSignedProposal():
shim.ChaincodeProposal.SignedProposal
Parametri:
  • nessuno
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:
  • nessuno
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:
  • nessuno
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:
  • nessuno
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:
  • nessuno
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.