Projet de code de chaîne TypeScript échafaudé

Blockchain App Builder prend l'entrée de votre fichier de spécification et génère un projet de code de chaîne entièrement fonctionnel. Le projet contient des classes et des fonctions générées automatiquement, des méthodes CRUD, des méthodes SDK, la validation automatique des arguments, la conversion/désactivation des paramètres et la capacité de persistance transparente (ORM).

Si le projet de code de chaîne utilise le langage TypeScript, le projet échafaudé contient trois fichiers principaux :
  • main.ts
  • <chaincodeName>.model.ts
  • <chaincodeName>.controller.ts
Toutes les bibliothèques nécessaires sont installées et packagées. Le fichier tsconfig.json contient la configuration nécessaire pour compiler et créer le projet TypeScript.

Le fichier <chaincodeName>.model.ts dans le sous-répertoire model contient plusieurs définitions de ressource et le fichier <chaincodeName>.controller.ts dans le sous-répertoire controller contient le comportement des ressources et les méthodes CRUD.

Les décorateurs de model.ts et controller.ts prennent en charge des fonctions telles que la validation automatique des arguments, la conversion/déconversion des paramètres des arguments, la capacité de persistance transparente (ORM) et l'appel d'interrogations riches.

Modèles

Chaque classe de modèle étend la classe OchainModel, qui comporte une propriété en lecture seule supplémentaire appelée assetType. Cette propriété ne peut être utilisée que pour extraire des ressources de ce type. Toute modification de cette propriété est ignorée lors de la création et de la mise à jour de la ressource. La valeur de propriété par défaut est <modelName>.

La classe OchainModel applique les comportements de décorateur aux propriétés de la classe.
@Id('supplierId')
export class Supplier extends OchainModel<Supplier> {
    public readonly assetType = 'supplier';
    @Mandatory()
    @Validate(yup.string()) 
    public supplierId: string;

Décorateurs

Décorateurs de classe
@Id(identifier)
Ce décorateur identifie la propriété qui définit de manière unique l'immobilisation sous-jacente. Cette propriété est utilisée comme clé de l'enregistrement, qui représente cette ressource dans l'état du code de chaîne. Ce décorateur est automatiquement appliqué lorsqu'un nouveau projet TypeScript est échafaudé. L'argument identifier du décorateur prend la valeur du fichier de spécification.
@Id('supplierId')
export class Supplier extends OchainModel{
...
}
Décorateurs de propriétés
Plusieurs décorateurs peuvent être utilisés. Les décorateurs sont résolus de haut en bas.
@Mandatory()
Ce décorateur marque la propriété suivante comme obligatoire, de sorte qu'elle ne peut pas être ignorée lors de l'enregistrement dans le livre. Si elle est ignorée, une erreur est générée.
@Mandatory()
public supplierID: string;
@Default(param)
Ce décorateur indique que la propriété suivante a une valeur par défaut. La valeur par défaut de l'argument (param) est utilisée lorsque la propriété est ignorée lors de l'enregistrement dans le livre.
@Default('open for business')
@Validate(yup.string())
public remarks: string;
@Validate(param)
La propriété qui suit ce décorateur est validée par rapport au schéma spécifié par le paramètre. L'argument param prend un schéma yup et plusieurs méthodes de schéma peuvent être chaînées pour ajouter des validations complexes. Pour plus de renseignements, consultez la page https://www.npmjs.com/package/yup.
@Validate(yup.number().min(3))
public productsShipped: number;
@ReadOnly(param)
Ce décorateur de propriétés marque la propriété sous-jacente comme ayant une valeur en lecture seule. La valeur de l'argument, par exemple param, est utilisée lorsque la propriété est enregistrée dans le livre. Une fois la valeur définie, elle ne peut pas être modifiée ou supprimée.
@ReadOnly('digicur')
public token_name: string;
@Embedded(PropertyClass)
Ce décorateur de propriétés marque la propriété sous-jacente en tant qu'immobilisation intégrable. Il prend la classe intégrable en tant que paramètre. Cette classe doit étendre la classe EmbeddedModel. Cette exigence est validée par le décorateur.
Dans l'exemple suivant, la classe Employee a une propriété nommée address de type Address, qui sera intégrée à la ressource Employee. Ceci est noté par le décorateur @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;
}
Lorsqu'une nouvelle instance de la classe Address est créée, toutes les propriétés de la classe Address sont validées automatiquement par le décorateur @Validate(). Notez que la classe Address n'a pas la propriété assetType ou le décorateur de classe @Id(). Cette ressource et ses propriétés ne sont pas enregistrées séparément dans le livre, mais sont enregistrées avec la ressource Employee. Les ressources intégrées sont des classes définies par l'utilisateur qui fonctionnent comme des types de valeur. L'instance de cette classe ne peut être stockée dans le livre qu'en tant que partie de l'objet contenant (ressources OchainModel). Tous les décorateurs ci-dessus sont appliqués automatiquement en fonction du fichier d'entrée lors de l'échafaudage du projet.
@Derived(STRATEGY, ALGORITHM, FORMAT)
Ce décorateur est utilisé pour définir l'attribut dérivé d'autres propriétés. Ce décorateur a deux paramètres obligatoires :
  • STRATEGY : Prend les valeurs CONCAT ou HASH. Si HASH est spécifié, le paramètre supplémentaire ALGORITHM est requis. L'algorithme par défaut est sha256; md5 est également pris en charge.
  • FORMAT : Prend un tableau de chaînes de spécification et de valeurs à utiliser par la stratégie.
@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;
Décorateurs de méthode
@Validator(…params)
Ce décorateur est appliqué aux méthodes de la classe de contrôleur principale. Ce décorateur est important pour l'analyse des arguments, la validation par rapport à tous les décorateurs de propriétés et le retour d'un objet modèle/type. Les méthodes de contrôleur doivent avoir ce décorateur pour pouvoir être invoquées. Il utilise plusieurs modèles créés par l'utilisateur ou schémas yup comme paramètres.
L'ordre des paramètres doit être exactement le même que celui des arguments de la méthode.
Dans l'exemple suivant, la référence de modèle Supplier est transmise dans le paramètre qui correspond au type asset dans l'argument de méthode. Lors de l'exécution, le décorateur analyse et convertit l'argument de méthode en objet JSON, le valide par rapport aux valideurs Supplier et, une fois la validation réussie, convertit l'objet JSON en objet Supplier et l'affecte à la variable asset. Ensuite, la méthode sous-jacente est finalement appelée.
@Validator(Supplier)
public async createSupplier(asset: Supplier) {
    return await this.Ctx.Model.save(asset);
}
Dans l'exemple suivant, plusieurs références de ressource sont transmises; elles correspondent aux types d'objet des arguments de méthode. Notez l'ordre des paramètres.
@Validator(Supplier, Manufacturer)
public async createProducts(supplier: Supplier, manufacturer: Manufacturer) {
}
Outre les références de ressource, les objets de schéma yup peuvent également être transmis si les arguments sont de type basique. Dans l'exemple suivant, supplierId et rawMaterialSupply sont de type string et number respectivement, de sorte que le schéma yup de type similaire et l'ordre correct sont transmis au décorateur. Notez l'enchaînement des méthodes de schéma 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 capacité de persistance transparente ou ORM simplifié est saisie dans la classe Model de l'objet Context (Ctx). Si votre modèle appelle l'une des méthodes de trousse SDK suivantes, accédez-y à l'aide de this.Ctx.Model.

Les méthodes de trousse SDK suivantes mettent en oeuvre ORM :
  • save appelle la méthode putState Hyperledger Fabric.
  • get appelle la méthode getState Hyperledger Fabric.
  • update appelle la méthode putState Hyperledger Fabric.
  • delete appelle la méthode deleteState Hyperledger Fabric.
  • history appelle la méthode getHistoryForKey Hyperledger Fabric.
  • getByRange appelle la méthode getStateByRange Hyperledger Fabric.
  • getByRangeWithPagination appelle la méthode getStateByRangeWithPagination Hyperledger Fabric.
Pour plus d'informations, voir Méthodes de trousse SDK.

Méthodes SDK

Note :

À partir de la version 21.3.2, la façon d'accéder aux méthodes ORM a changé. Exécutez la commande ochain --version pour déterminer la version du générateur d'applications Blockchain.

Dans les versions précédentes, les méthodes ORM étaient héritées de la classe OchainModel. Dans les versions 21.3.2 et ultérieures, les méthodes sont définies dans la classe Model de l'objet Context (Ctx). Pour appeler ces méthodes, accédez-y à l'aide de this.Ctx.Model.<method_name>.

L'exemple suivant illustre un appel de méthode dans les versions précédentes :

@Validator(Supplier)
public async createSupplier(asset: Supplier){
    return await asset.save();
}

L'exemple suivant montre un appel de méthode de la version 21.3.2 et versions ultérieures :

@Validator(Supplier)
public async createSupplier(asset: Supplier) {
      return await this.Ctx.Model.save(asset);
}

Après la mise à niveau vers la version 21.3.2, apportez cette modification à tous les projets de code de chaîne que vous avez créés avec une version antérieure du générateur d'applications Blockchain. Si vous utilisez la commande sync pour synchroniser les modifications entre le fichier de spécification et votre code source, les modifications sont automatiquement apportées à votre contrôleur pour les méthodes prêtes à l'emploi. Vous devez toujours résoudre manuellement tout conflit.

save
La méthode save ajoute les détails de l'appelant asset au livre.
Cette méthode appelle Hyperledger Fabric putState à l'interne. Toutes les opérations de conversion/déconversion sont gérées en interne. La méthode save fait partie de la classe Model, à laquelle vous accédez à l'aide de l'objet Ctx.
Ctx.Model.save(asset: <Instance of Asset Class> , extraMetadata?: any) : Promise <any>
Paramètres :
  • extraMetadata : any (Facultatif) – Utilisé pour enregistrer les métadonnées en dehors de la ressource dans le livre.
Retourne :
  • Promise<any> - Retourne une promesse à la fin.
Exemple :
@Validator(Supplier)
public async createSupplier(asset: Supplier) {
	return await this.Ctx.Model.save(asset);
}
get
La méthode get est une méthode de la classe OchainModel, qui est héritée des classes de modèle concrètes de {chaincodeName}.model.ts. La méthode get fait partie de la classe Model, à laquelle vous accédez à l'aide de l'objet Ctx.
Pour retourner une ressource à partir d'un id donné, utilisez la méthode de contrôleur générique getAssetById.
Ctx.Model.get(id: string, modelName: <Model Asset Class Name>) : Promise<asset>
Paramètres :
  • id : string - Clé utilisée pour enregistrer les données dans le livre.
  • modelName: <Model Asset Class Name> – (Facultatif) Modèle de classe de ressource à retourner.
Retourne :
  • Promise: <Asset> - Si le paramètre modelName n'est pas fourni et que des données existent dans le livre, Promise<object> est retourné. Si le paramètre id n'existe pas dans le livre, un message d'erreur est retourné. Si le paramètre modelName est fourni, un objet de type <Asset> est retourné. Même si une ressource avec id donné est retournée à partir du livre, cette méthode traitera le transfert dans le type Asset de l'appelant. Si la ressource retournée à partir du livre n'est pas de type Asset, la méthode génère une erreur. Cette vérification est effectuée par la propriété assetType en lecture seule dans la classe Model.
Exemple :
@Validator(yup.string())
public async getSupplierById(id: string) {
	const asset = await this.Ctx.Model.get(id, Supplier);
	return asset;
}
Dans l'exemple, asset est du type Supplier.
update
La méthode update met à jour les détails asset de l'appelant dans le livre. Cette méthode renvoie une promesse.
Cette méthode appelle Hyperledger Fabric putState à l'interne. Tous les paramètres de conversion/déconversion sont gérés en interne. La méthode update fait partie de la classe Model, à laquelle vous pouvez accéder à l'aide de l'objet Ctx.
Ctx.Model.update(asset: <Instance of Asset Class> , extraMetadata?: any) : Promise <any>
Paramètres :
  • extraMetadata : any (Facultatif) – Utilisé pour enregistrer les métadonnées en dehors de la ressource dans le livre.
Retourne :
  • Promise<any> - Retourne une promesse à la fin.
Exemple :
@Validator(Supplier)
public async updateSupplier(asset: Supplier) {
	return await this.Ctx.Model.update(asset);
}
delete
Cette action supprime la ressource du livre indiqué par id s'il existe. Cette méthode appelle la méthode Hyperledger Fabric deleteState à l'interne. La méthode delete fait partie de la classe Model, à laquelle vous pouvez accéder à l'aide de l'objet Ctx.
Ctx.Model.delete(id: string): Promise <any>
Paramètres :
  • id : string - Clé utilisée pour enregistrer les données dans le livre.
Retourne :
  • Promise <any> - Retourne une promesse à la fin.
Exemple :
@Validator(yup.string())
public async deleteSupplier(id: string) {
	const result = await this.Ctx.Model.delete(id);
	return result;
}
history
La méthode history fait partie de la classe Model, à laquelle vous pouvez accéder à l'aide de l'objet Ctx. Cette méthode retourne l'historique des ressources fourni par id à partir du livre, s'il existe.
Cette méthode appelle la méthode Hyperledger Fabric getHistoryForKey à l'interne.
Ctx.Model.history(id: string): Promise <any>
Paramètres :
  • id : string - Clé utilisée pour enregistrer les données dans le livre.
Retourne :
  • Promise <any[]> - Retourne tout [] à l'achèvement.
Exemple
@Validator(yup.string())
public async getSupplierHistoryById(id: string) {
	const result = await this.Ctx.Model.history(id);
	return result;
}
Exemple d'historique de ressource retourné pour 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
La méthode getByRange est une méthode statique de la classe OchainModel qui est héritée des classes Model concrètes de {chaincodeName}.model.ts.
Cette méthode retourne une liste de ressources comprises entre l'intervalle startId et endId. Cette méthode appelle la méthode Hyperledger Fabric getStateByRange à l'interne.
Si le paramètre modelName n'est pas indiqué, la méthode retourne Promise<Object [ ] >. Si le paramètre modelName est fourni, la méthode traite la distribution dans le type Model de l'appelant. Dans l'exemple suivant, le tableau de résultats est de type Supplier. Si la ressource retournée à partir du livre n'est pas de type Model, elle ne sera pas incluse dans la liste. Cette vérification est effectuée par la propriété assetType en lecture seule dans la classe Model.
Pour retourner toutes les ressources comprises entre l'intervalle startId et endId, utilisez la méthode de contrôleur générique getAssetsByRange.
Ctx.Model.getByRange(startId: string, endId: string, modelName: <Asset Model Class Name> ): Promise <any>
Paramètres :
  • startId : string – Clé de début de l'intervalle, qui est incluse dans l'intervalle.
  • endId : string – Clé de fin de l'intervalle, qui est exclue de l'intervalle.
  • modelName: <Model Asset Class Name> – (Facultatif) Modèle de classe de ressource à retourner.
Retourne :
  • Promise< Asset[ ] > - Retourne le tableau de <Asset> à l'achèvement.
Exemple :
@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
La méthode getByRangeWithPagination est une méthode statique de la classe OchainModel qui est héritée des classes Model concrètes de {chaincodeName}.model.ts.
Cette méthode retourne une liste de ressources entre l'intervalle startId et endId. Cette méthode appelle la méthode Hyperledger Fabric getStateByRangeWithPagination à l'interne.
Si le paramètre modelName n'est pas indiqué, la méthode retourne Promise<Object [ ] >. Si le paramètre modelName est fourni, la méthode traite la distribution dans le type Model de l'appelant. Dans l'exemple suivant, le tableau de résultats est de type Supplier. Si la ressource retournée à partir du livre n'est pas de type Model, elle ne sera pas incluse dans la liste. Cette vérification est effectuée par la propriété assetType en lecture seule dans la classe Model.
Pour retourner toutes les ressources comprises entre l'intervalle startId et endId, filtrées par taille de page et signets, utilisez la méthode de contrôleur générique 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[]>
Paramètres :
  • startId : string – Clé de début de l'intervalle, qui est incluse dans l'intervalle.
  • endId : string – Clé de fin de l'intervalle, qui est exclue de l'intervalle.
  • pageSize : number - Taille de page de l'interrogation.
  • bookmark : string - Signet de l'interrogation. La sortie commence à partir de ce signet.
  • modelName: <Model Asset Class Name> – (Facultatif) Modèle de classe de ressource à retourner.
Retourne :
  • Promise< Asset[ ] > - Retourne le tableau de <Asset> à l'achèvement.
getId
Lorsque la ressource a une clé dérivée Id, vous pouvez utiliser cette méthode pour obtenir un ID dérivé. Cette méthode retourne une erreur si la clé dérivée contient %t (horodatage).
Paramètres :
  • object – L'objet doit contenir toutes les propriétés dont dépend la clé dérivée.
Retourne :
  • Retourne la clé dérivée sous forme de chaîne.
Exemple :
@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);
}

Pour les méthodes de trousse SDK de jeton, voir les rubriques sous Prise en charge des jetons à l'aide du générateur d'applications Blockchain.

Controller

La classe du contrôleur principal étend la classe OchainController. Il n'y a qu'un seul contrôleur principal.

export class TSProjectController extends OchainController{

Vous pouvez créer n'importe quel nombre de classes, de fonctions ou de fichiers, mais seules les méthodes définies dans la classe de contrôleur principale peuvent être appelées de l'extérieur; les autres sont masquées.

Méthodes générées automatiquement

Comme décrit dans Fichier de spécification d'entrée, vous pouvez spécifier les méthodes CRUD à générer dans le fichier de spécification. Par exemple, si vous avez indiqué de générer toutes les méthodes, le résultat sera similaire au code suivant :

@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;
}

Détails de la méthode du contrôleur

Outre les méthodes CRUD et non CRUD du modèle précédent, Blockchain App Builder fournit une prise en charge prête à l'emploi de notre contrôleur pour les méthodes Hyperledger Fabric suivantes :
  • getAssetById
  • getAssetsByRange
  • getAssetHistoryById
  • query
  • queryWithPagination
  • generateCompositeKey
  • getByCompositeKey
  • getTransactionId
  • getTransactionTimestamp
  • getChannelID
  • getCreator
  • getSignedProposal
  • getArgs
  • getStringArgs
  • getMspID
  • getNetworkStub

Note :

Ces méthodes sont disponibles avec le contexte this dans n'importe quelle classe qui étend la classe OChainController.
Par exemple :
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
La méthode getAssetById retourne une ressource en fonction d'un ID spécifié. Il s'agit d'une méthode générique qui peut être utilisée pour obtenir une immobilisation de tout type.
this.getAssetById(id: string): Promise<byte[]>
Paramètres :
  • id : string - Clé utilisée pour enregistrer les données dans le livre.
Retourne :
  • Promise <byte [ ]> - Retours promis à l'achèvement. Vous devez convertir byte[] en objet.
getAssetsByRange
La méthode getAssetsByRange retourne toutes les ressources présentes de startId (inclusive) à endId (exclusive) quel que soit le type de ressource. Il s'agit d'une méthode générique qui peut être utilisée pour obtenir des immobilisations de tout type.
this.getAssetsByRange(startId: string, endId: string):
Promise<shim.Iterators.StateQueryIterator>
Paramètres :
  • startId : string – Clé de début de l'intervalle, qui est incluse dans l'intervalle.
  • endId : string – Clé de fin de l'intervalle, qui est exclue de l'intervalle.
Retourne :
  • Promise< shim.Iterators.StateQueryIterator> - Retourne un itérateur à la fin. Vous devez itérer dessus.
getAssetHistoryById
La méthode getAssetHistoryById retourne l'itérateur d'historique d'une ressource pour un ID spécifié.
this.getAssetHistoryById(id: string):
Promise<shim.Iterators.HistoryQueryIterator>
Paramètres :
  • id : string - Clé utilisée pour enregistrer les données dans le livre.
Retourne :
  • Promise<shim.Iterators.HistoryQueryIterator> - Retourne un itérateur d'interrogation d'historique. Vous devez itérer dessus.
query
La méthode query exécute une interrogation SQL/Base de données Couch enrichie sur le livre. Cette méthode n'est prise en charge que pour les déploiements à distance sur Oracle Blockchain Platform. Il s'agit d'une méthode générique pour exécuter des interrogations SQL sur le grand livre.
this.query(queryStr: string):
Promise<shim.Iterators.StateQueryIterator>
Paramètres :
  • queryStr : string - Interrogation SQL/base de données Couch enrichie.
Retourne :
  • Promise<shim.Iterators.StateQueryIterator> - Retourne un itérateur d'interrogation d'état. Vous devez itérer dessus.
queryWithPagination
Cette méthode exécute une requête SQL/Couch DB enrichie sur le livre, filtrée par taille de page et signets. Cette méthode n'est prise en charge que pour les déploiements à distance sur Oracle Blockchain Platform. Il s'agit d'une méthode générique pour exécuter des interrogations SQL sur le grand livre.
public async queryWithPagination(query: string, pageSize: number, bookmark?: string)
Paramètres :
  • query : string - Interrogation SQL/base de données Couch enrichie.
  • pageSize : number - Taille de page de l'interrogation.
  • bookmark : string - Signet de l'interrogation. La sortie commence à partir de ce signet.
Retourne :
  • Promise<shim.Iterators.StateQueryIterator> - Retourne un itérateur d'interrogation d'état. Vous devez itérer dessus.
generateCompositeKey
Cette méthode génère et retourne la clé composite en fonction de indexName et des attributs indiqués dans les arguments.
this.generateCompositeKey(indexName: string, attributes:
string[]): string
Paramètres :
  • indexName : string - Type d'objet de la clé utilisée pour enregistrer les données dans le livre.
  • attributes: string[ ] - Attributs basés sur lesquels une clé composite sera formée.
Retourne :
  • string - Retourne une clé composite.
getByCompositeKey
Cette méthode retourne l'immobilisation correspondant à la clé et à la colonne indiquées dans le paramètre d'attribut lors de la création d'une clé composite. Le paramètre indexOfId indique l'index de la clé retournée dans le tableau de la méthode stub SplitCompositeKey. En interne, cette méthode appelle les méthodes getStateByPartialCompositeKey, splitCompositeKey et getState de Hyperledger Fabric.
this.getByCompositeKey(key: string, columns: string[],
indexOfId: number): Promise<any []>
Paramètres :
  • key: string - Clé utilisée pour enregistrer les données dans le livre.
  • columns: string[ ] - Attributs basés sur lesquels une clé est générée.
  • indexOfId: number - Index de l'attribut à extraire de la clé.
Retourne :
  • Promise< any [ ] - Retourne tout [] à l'achèvement.
getTransactionId
Retourne l'ID transaction de la demande d'appel de code de chaîne courante. L'ID transaction identifie de manière unique la transaction dans la portée du canal.
this.getTransactionId(): string
Paramètres :
  • aucune
Retourne :
  • string - Retourne l'ID transaction pour la demande d'appel de code de chaîne courante.
getTransactionTimestamp
Retourne l'horodatage de la création de la transaction. Cette valeur est tirée de la transaction ChannelHeader. Elle indiquera donc l'horodatage du client et aura la même valeur pour tous les endossateurs.
this.getTransactionTimestamp(): Timestamp
Paramètres :
  • id : string - Clé utilisée pour enregistrer les données dans le livre.
Retourne :
  • Timestamp - Retourne l'horodatage de la création de la transaction.
getChannelID
Retourne l'ID canal de la proposition de code de chaîne à traiter.
this.getChannelID(): string
Paramètres :
  • aucune
Retourne :
  • string - Retourne l'ID canal.
getCreator
Retourne l'objet d'identité de l'émetteur de l'appel de code de chaîne.
this.getCreator(): shim.SerializedIdentity
Paramètres :
  • aucune
Retourne :
  • shim.SerializedIdentity - Retourne l'objet d'identité.
getSignedProposal
Retourne un objet entièrement décodé de la proposition de transaction signée.
this.getSignedProposal():
shim.ChaincodeProposal.SignedProposal
Paramètres :
  • aucune
Retourne :
  • shim.ChaincodeProposal.SignedProposal - Retourne l'objet décodé de la proposition de transaction signée.
getArgs
Retourne les arguments sous forme de tableau de chaînes de la demande d'appel de code de chaîne.
this.getArgs(): string[]
Paramètres :
  • aucune
Retourne :
  • string [ ] - Retourne les arguments en tant que tableau de chaînes à partir de l'appel de code de chaîne.
getStringArgs
Retourne les arguments sous forme de tableau de chaînes de la demande d'appel de code de chaîne.
this.getStringArgs(): string[]
Paramètres :
  • aucune
Retourne :
  • string [ ] - Retourne les arguments en tant que tableau de chaînes à partir de l'appel de code de chaîne.
getMspID
Retourne l'ID MSP de l'identité appelante.
this.getMspID(): string
Paramètres :
  • aucune
Retourne :
  • string - Retourne l'ID MSP de l'identité appelante.
getNetworkStub
Vous pouvez accéder au stub de cale en appelant cette méthode. Cela peut vous aider à écrire votre propre implémentation de travailler directement avec les actifs.
this.getNetworkStub(): shim.ChaincodeStub
Paramètres :
  • aucune
Retourne :
  • shim.ChaincodeStub - Retourne le talon de réseau de code de chaîne.
invokeCrossChaincode
Vous pouvez utiliser cette méthode dans un code de chaîne pour appeler une fonction dans un autre code de chaîne. Les deux codes de chaîne doivent être installés sur le même pair.
this.invokeCrossChaincode(chaincodeName: string, methodName: string, args: string[], channelName: string): Promise<any>
Paramètres :
  • chaincodeName – Nom du code de chaîne à appeler.
  • methodName - Nom de la méthode à appeler dans le code de chaîne.
  • arg - Argument de la méthode appelante.
  • channelName - Canal où se trouve le code de chaîne à appeler.
Retourne :
  • Promise<any> - Retourne un objet JSON qui contient trois champs :
    • isValid - true si l'appel est valide.
    • payload - Sortie retournée par l'appel inter-code de chaîne, en tant qu'objet JSON.
    • message - Message retourné par l'appel inter-code de chaîne, au format UTF-8.
invokeChaincode
Cette méthode appelle une fonction dans un autre code de chaîne. Les deux codes de chaîne doivent être installés sur le même pair.
this.invokeChaincode(chaincodeName: string, methodName: string, args: string[], channelName: string): Promise<any>
Paramètres :
  • chaincodeName – Nom du code de chaîne à appeler.
  • methodName - Nom de la méthode à appeler dans le code de chaîne.
  • arg - Argument de la méthode appelante.
  • channelName - Canal où se trouve le code de chaîne à appeler.
Retourne :
  • Promise<any> - Retourne un objet JSON qui contient trois champs :
    • isValid - true si l'appel est valide.
    • payload - Sortie retournée par l'appel inter-code de chaîne, en tant qu'objet JSON.
    • message - Message retourné par l'appel inter-code de chaîne, au format UTF-8.

Méthodes personnalisées

Les méthodes personnalisées suivantes ont été générées à partir de notre exemple de fichier de spécification.

La méthode executeQuery montre comment appeler les interrogations enrichies SQL. Les valideurs par rapport aux arguments sont ajoutés automatiquement par Blockchain App Builder en fonction du type d'argument spécifié dans le fichier de spécification.


/**
*
*	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() { 
}

Méthode d'initialisation

Une méthode init personnalisée est fournie dans le contrôleur avec une définition vide. Si vous utilisez Blockchain App Builder pour déployer ou mettre à niveau, la méthode init est appelée automatiquement. Si vous déployez ou mettez à niveau à partir de la console Oracle Blockchain Platform, vous devez appeler la méthode init manuellement. Vous pouvez utiliser un outil tiers tel que Postman pour appeler manuellement la méthode init.

export class TestTsProjectController extends OchainController {
    public async init(params: any) { 
        return;
}

Vous pouvez ensuite utiliser cette méthode pour initialiser n'importe quel état d'application.