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 vari 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 prende 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()
- La proprietà seguente viene contrassegnata come obbligatoria, pertanto non può essere saltata 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 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 dovrebbe estendere la classe
EmbeddedModel. Questo è convalidato dal decoratore.
- In questo esempio,
Employee ha 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 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 sopra elencati 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. Richiede un parametro aggiuntivo ALGORITHM se è selezionato HASH. L'algoritmo predefinito è sha256; è supportato anche md5.
FORMAT: accetta un array di stringhe e valori di specifica da utilizzare 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;
-
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 basic. 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. Notare il 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 metodi SDK che implementano ORM sono i seguenti:
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): consente di salvare i metadati diversi 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 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 tramite il
id specificato, utilizzare il metodo 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 si occuperà di eseguire il casting nel tipo chiamante Asset. Se il cespite restituito dal libro contabile non è di tipo Asset, 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): consente di salvare i metadati diversi 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.
- Restituisce una lista di asset 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. Incluso nell'intervallo.
endId : string: chiave finale dell'intervallo. Escluso 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.
- Restituisce una lista di asset tra l'intervallo
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. 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) 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 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 del token, vedere gli argomenti in Supporto della tokenizzazione mediante Blockchain App Builder.
Controller
La classe del controller principale estende 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 all'interno della classe controller principale 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 si è scelto di generare tutti i metodi, il risultato sarà simile a:
@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 il supporto integrato per altri metodi Hyperledger Fabric dal nostro controller. Di seguito sono riportati 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 l'asset in base al valore id fornito. Questo è un metodo generico e viene 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. Incluso nell'intervallo.
endId : string: chiave finale dell'intervallo. Escluso 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 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 di query della cronologia. Devi iterare 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. 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 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. 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 la 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 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 della transazione per la richiesta di richiamo del codice concatenato corrente.
-
getTransactionTimestamp
- Restituisce l'indicatore orario al momento della creazione della transazione. Questo è preso dalla transazione
ChannelHeader, quindi indicherà la data e l'ora 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 alla 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
- L'utente può accedere allo shim stub 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 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
- È 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 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.
executeQuery mostra come è possibile chiamare le query avanzate SQL. 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;
}
È possibile utilizzare questo metodo per inizializzare qualsiasi stato dell'applicazione a questo punto.