Projet de code 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 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 sérialisation/désérialisation et la capacité de persistance transparente (ORM).

Si le projet de code 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 du sous-répertoire model contient plusieurs définitions de ressource et le fichier <chaincodeName>.controller.ts du sous-répertoire controller contient le comportement des ressources et les méthodes CRUD.

Les différents décorateurs dans model.ts et controller.ts prennent en charge des fonctionnalités telles que la validation automatique des arguments, la sérialisation/désérialisation des arguments, la capacité de persistance transparente (ORM) et l'appel de requêtes riches.

Modèles

Chaque classe de modèle étend la classe OchainModel, qui possède une propriété supplémentaire en lecture seule appelée assetType. Cette propriété peut être utilisée pour extraire uniquement les ressources de ce type. Toute modification apportée à cette propriété est ignorée lors de la création et de la mise à jour de la ressource. Par défaut, la valeur de la propriété 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'actif sous-jacent. Cette propriété est utilisée comme clé de l'enregistrement, qui représente cette ressource dans l'état du code 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 de propriété peuvent être utilisés. Les décorateurs sont résolus de haut en bas.
@Mandatory()
La propriété suivante est définie comme obligatoire. Elle ne peut donc pas être ignorée lors de l'enregistrement dans le livre. S'il est ignoré, une erreur est générée.
@Mandatory()
public supplierID: string;
@Default(param)
Cette propriété peut avoir 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é suivante est validée par rapport au schéma présenté dans le paramètre. L'argument param prend un schéma yup et de nombreuses méthodes de schéma peuvent être chaînées. De nombreuses validations complexes peuvent être ajoutées. Pour plus d'informations, reportez-vous à la page https://www.npmjs.com/package/yup.
@Validate(yup.number().min(3))
public productsShipped: number;
@ReadOnly(param)
Ce décorateur de propriété 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é marque la propriété sous-jacente comme une immobilisation incorporable. Il prend la classe incorporable comme paramètre. Cette classe doit étendre la classe EmbeddedModel. Ceci est validé par le décorateur.
Dans cet exemple, Employee dispose d'une propriété appelée address de type Address, qui doit être imbriquée avec la ressource Employee. Cela est indiqué 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 instance de la classe Address est créée, toutes les propriétés de la classe Address sont automatiquement validées par le décorateur @Validate(). La classe Address ne dispose pas de la propriété assetType ni du décorateur de classe @Id(). Cette ressource et ses propriétés ne sont pas enregistrées séparément dans le livre, mais avec la ressource Employee. Les ressources incorporées sont des classes définies par l'utilisateur qui fonctionnent comme des types de valeur. L'instance de cette classe peut uniquement être stockée dans le livre en tant que partie de l'objet conteneur (ressources OchainModel). Tous les décorateurs ci-dessus sont appliqués automatiquement en fonction du fichier d'entrée tout en échafaudant le 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. Nécessite un paramètre supplémentaire ALGORITHM si HASH est sélectionné. 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 analyser les arguments, valider par rapport à tous les décorateurs de propriété et renvoyer un objet modèle/type. Les méthodes de contrôleur doivent avoir ce décorateur pour pouvoir être appelées. Il prend plusieurs modèles créés par l'utilisateur ou schémas yup en tant que paramètres.
L'ordre des paramètres doit être identique à celui des arguments dans 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, effectue une validation par rapport aux validateurs Supplier, puis convertit l'objet JSON en objet Supplier après validation 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, des objets de schéma yup peuvent également être transmis si les arguments sont de type de base. 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 d'ordre correct est transmis au décorateur. Notez le chaînage 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 fonctionnalité de persistance transparente ou ORM simplifié est capturée dans la classe Model de l'objet Contexte (Ctx). Si votre modèle appelle l'une des méthodes SDK suivantes, accédez-y à l'aide de this.Ctx.Model.

Les méthodes SDK qui implémentent ORM sont les méthodes suivantes :
  • save : appelle la méthode putState d'Hyperledger Fabric
  • get : appelle la méthode getState d'Hyperledger Fabric
  • update : appelle la méthode putState d'Hyperledger Fabric
  • delete : appelle la méthode deleteState d'Hyperledger Fabric
  • history : appelle la méthode getHistoryForKey d'Hyperledger Fabric
  • getByRange : appelle la méthode getStateByRange d'Hyperledger Fabric
  • getByRangeWithPagination : appelle la méthode getStateByRangeWithPagination d'Hyperledger Fabric
Pour plus d'informations, reportez-vous à Méthodes SDK.

Méthodes SDK

Remarques :

Depuis la version 21.3.2, le mode d'accès aux méthodes ORM a changé. Exécutez la commande ochain --version pour déterminer la version de Blockchain App Builder.

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 Contexte (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 illustre un appel de méthode à partir de la version 21.3.2 et des 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 chaîne que vous avez créés avec une version antérieure de Blockchain App Builder. 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 au contrôleur pour les méthodes prêtes à l'emploi. Vous devez toujours résoudre manuellement les conflits.

save
La méthode save ajoute les détails de l'appelant asset au livre.
Cette méthode appelle Hyperledger Fabric putState en interne. Toutes les opérations de sérialisation et de désérialisation 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) : permet d'enregistrer les métadonnées en dehors de la ressource dans le livre.
Renvoie :
  • Promise<any> : renvoie une promesse à l'achèvement
Par 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 héritée par les classes de modèle concret de {chaincodeName}.model.ts. La méthode get fait partie de la classe Model, à laquelle vous accédez à l'aide de l'objet Ctx.
Si vous voulez renvoyer une ressource par l'élément id indiqué, 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 à renvoyer.
Renvoie :
  • Promise: <Asset> : si le paramètre modelName n'est pas fourni et que des données existent dans le livre, Promise<object> est renvoyé. Si le paramètre id n'existe pas dans le livre, un message d'erreur est renvoyé. Si le paramètre modelName est fourni, un objet de type <Asset> est renvoyé. Même si toute ressource avec id donné est renvoyée à partir du livre, cette méthode s'occupera de la conversion dans le type Asset de l'appelant. Si la ressource renvoyée par le livre n'est pas de type Asset, une erreur est générée. Cette vérification est effectuée par la propriété assetType en lecture seule dans la classe Model.
Par 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 de type Supplier.
update
La méthode update met à jour les détails de l'appelant asset dans le livre. Cette méthode renvoie une promesse.
Cette méthode appelle Hyperledger Fabric putState en interne. Toutes les opérations de sérialisation et de désérialisation sont gérées 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) : permet d'enregistrer les métadonnées en dehors de la ressource dans le livre.
Renvoie :
  • Promise<any> : renvoie une promesse à l'achèvement
Par 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, le cas échéant. Cette méthode appelle la méthode deleteState d'Hyperledger Fabric en 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.
Renvoie :
  • Promise <any> : renvoie une promesse à l'achèvement.
Par 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 renvoie l'historique des immobilisations fourni par id à partir du livre, le cas échéant.
Cette méthode appelle la méthode getHistoryForKey d'Hyperledger Fabric en interne.
Ctx.Model.history(id: string): Promise <any>
Paramètres :
  • id : string : clé utilisée pour enregistrer les données dans le livre.
Renvoie :
  • Promise <any[]> : renvoie tous les [] une fois l'opération terminée.
Exemple
@Validator(yup.string())
public async getSupplierHistoryById(id: string) {
	const result = await this.Ctx.Model.history(id);
	return result;
}
Exemple de l'historique des ressources renvoyées 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 héritée par les classes Model concrètes de {chaincodeName}.model.ts.
Cela renvoie la liste des ressources comprises entre la plage startId et endId. Cette méthode appelle la méthode getStateByRange d'Hyperledger Fabric en interne.
Si le paramètre modelName n'est pas fourni, la méthode renvoie Promise<Object [ ] >. Si le paramètre modelName est fourni, la méthode gère la conversion dans le type Model de l'appelant. Dans l'exemple suivant, le tableau de résultats est de type Supplier. Si la ressource renvoyée par le 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 renvoyer toutes les ressources comprises entre la plage 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 la plage. Inclus dans la gamme.
  • endId : string : clé de fin de la plage. Exclu de la plage.
  • modelName: <Model Asset Class Name> : (facultatif) modèle de classe de ressource à renvoyer.
Renvoie :
  • Promise< Asset[ ] > : renvoie le tableau <Asset> à l'achèvement.
Par 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 héritée par les classes Model concrètes de {chaincodeName}.model.ts.
Cela renvoie la liste des ressources comprises entre la plage startId et endId. Cette méthode appelle la méthode getStateByRangeWithPagination d'Hyperledger Fabric en interne.
Si le paramètre modelName n'est pas fourni, la méthode renvoie Promise<Object [ ] >. Si le paramètre modelName est fourni, la méthode gère la conversion dans le type Model de l'appelant. Dans l'exemple suivant, le tableau de résultats est de type Supplier. Si la ressource renvoyée par le 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 renvoyer toutes les ressources comprises entre la plage 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 la plage. Inclus dans la gamme.
  • endId : string : clé de fin de la plage. Exclu de la plage.
  • pageSize : number : taille de page de la requête.
  • bookmark : string : signet de la requête. La sortie commence à partir de ce signet.
  • modelName: <Model Asset Class Name> : (facultatif) modèle de classe de ressource à renvoyer.
Renvoie :
  • Promise< Asset[ ] > : renvoie le tableau <Asset> à l'achèvement.
getId
Lorsque la ressource a une clé dérivée en tant que Id, vous pouvez utiliser cette méthode pour obtenir un ID dérivé. Cette méthode renvoie 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.
Renvoie :
  • Renvoie la clé dérivée sous forme de chaîne.
Par 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 SDK de jeton, reportez-vous aux rubriques sous Prise en charge de la création de jetons à l'aide de Blockchain App Builder.

Contrôleur

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

export class TSProjectController extends OchainController{

Vous pouvez créer un nombre illimité 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, le reste étant masqué.

Méthodes générées automatiquement

Comme décrit dans la section 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 choisi de générer toutes les méthodes, le résultat sera le 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 de contrôleur

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

Remarques :

Ces méthodes sont disponibles avec le contexte this dans toute classe qui étend la classe OChainController.
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 renvoie une ressource en fonction de id fourni. Il s'agit d'une méthode générique qui permet d'obtenir des ressources de tout type.
this.getAssetById(id: string): Promise<byte[]>
Paramètres :
  • id : string : clé utilisée pour enregistrer les données dans le livre.
Renvoie :
  • Promise <byte [ ]> : renvoie la promesse à la fin. Vous devez convertir byte[] en objet.
getAssetsByRange
La méthode getAssetsByRange renvoie toutes les ressources présentes de startId (incluses) à endId (exclues), quels que soient les types de ressource. Il s'agit d'une méthode générique qui peut être utilisée pour obtenir des ressources de tout type.
this.getAssetsByRange(startId: string, endId: string):
Promise<shim.Iterators.StateQueryIterator>
Paramètres :
  • startId : string : clé de début de la plage. Inclus dans la gamme.
  • endId : string : clé de fin de la plage. Exclu de la plage.
Renvoie :
  • Promise< shim.Iterators.StateQueryIterator> : renvoie un itérateur une fois l'opération terminée. Il faut itérer dessus.
getAssetHistoryById
La méthode getAssetHistoryById renvoie l'itérateur d'historique d'une ressource pour id fourni.
this.getAssetHistoryById(id: string):
Promise<shim.Iterators.HistoryQueryIterator>
Paramètres :
  • id : string : clé utilisée pour enregistrer les données dans le livre.
Renvoie :
  • Promise<shim.Iterators.HistoryQueryIterator> : renvoie un itérateur de requête d'historique. Il faut itérer dessus.
query
La méthode query exécute une requête de base de données SQL/Couch enrichie sur le grand livre. Cette méthode est uniquement prise en charge pour le déploiement à distance sur Oracle Blockchain Platform. Il s'agit d'une méthode générique pour exécuter des requêtes SQL sur le livre.
this.query(queryStr: string):
Promise<shim.Iterators.StateQueryIterator>
Paramètres :
  • queryStr : string : requête de base de données SQL/Couch enrichie.
Renvoie :
  • Promise<shim.Iterators.StateQueryIterator> : renvoie un itérateur de requête d'état. Il faut itérer dessus.
queryWithPagination
Cette méthode exécute une requête Rich SQL/Couch DB sur le grand livre, filtrée par taille de page et signets. Cette méthode est uniquement prise en charge pour le déploiement à distance sur Oracle Blockchain Platform. Il s'agit d'une méthode générique pour exécuter des requêtes SQL sur le livre.
public async queryWithPagination(query: string, pageSize: number, bookmark?: string)
Paramètres :
  • query : string : requête de base de données SQL/Couch enrichie.
  • pageSize : number : taille de page de la requête.
  • bookmark : string : signet de la requête. La sortie commence à partir de ce signet.
Renvoie :
  • Promise<shim.Iterators.StateQueryIterator> : renvoie un itérateur de requête d'état. Il faut itérer dessus.
generateCompositeKey
Cette méthode génère et renvoie 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 la clé composite à former.
Renvoie :
  • string : renvoie une clé composite.
getByCompositeKey
Cette méthode renvoie la ressource qui correspond à la clé et à la colonne indiquées dans le paramètre d'attribut lors de la création de la clé composite. Le paramètre indexOfId indique l'index de la clé renvoyée dans le tableau de la méthode stub SplitCompositeKey. En interne, cette méthode appelle getStateByPartialCompositeKey, splitCompositeKey et getState d'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[ ] : les attributs basés sur la clé sont générés.
  • indexOfId: number : index de l'attribut à extraire de la clé.
Renvoie :
  • Promise< any [ ] : renvoie n'importe quel élément [] une fois terminé.
getTransactionId
Renvoie l'ID de transaction pour la demande d'appel de code chaîne en cours. L'ID transaction identifie de manière unique la transaction dans la portée du canal.
this.getTransactionId(): string
Paramètres :
  • Aucun élément
Renvoie :
  • string : renvoie l'ID de transaction pour la demande d'appel de code chaîne en cours.
getTransactionTimestamp
Renvoie l'horodatage de la création de la transaction. Cette valeur provient de la transaction ChannelHeader. Elle indique donc l'horodatage du client et a la même valeur pour tous les approbateurs.
this.getTransactionTimestamp(): Timestamp
Paramètres :
  • id : string : clé utilisée pour enregistrer les données dans le livre.
Renvoie :
  • Timestamp : renvoie l'horodatage de la création de la transaction.
getChannelID
Renvoie l'ID de canal pour le traitement de la proposition de code chaîne.
this.getChannelID(): string
Paramètres :
  • Aucun élément
Renvoie :
  • string : renvoie l'ID de canal.
getCreator
Renvoie l'objet d'identité de l'émetteur de l'appel de code chaîne.
this.getCreator(): shim.SerializedIdentity
Paramètres :
  • Aucun élément
Renvoie :
  • shim.SerializedIdentity : renvoie l'objet d'identité.
getSignedProposal
Renvoie un objet entièrement décodé de la proposition de transaction signée.
this.getSignedProposal():
shim.ChaincodeProposal.SignedProposal
Paramètres :
  • Aucun élément
Renvoie :
  • shim.ChaincodeProposal.SignedProposal : renvoie l'objet décodé de la proposition de transaction signée.
getArgs
Renvoie les arguments sous forme de tableau de chaînes à partir de la demande d'appel de code chaîne.
this.getArgs(): string[]
Paramètres :
  • Aucun élément
Renvoie :
  • string [ ] : renvoie des arguments en tant que tableau de chaînes à partir de l'appel de code chaîne.
getStringArgs
Renvoie les arguments sous forme de tableau de chaînes à partir de la demande d'appel de code chaîne.
this.getStringArgs(): string[]
Paramètres :
  • Aucun élément
Renvoie :
  • string [ ] : renvoie des arguments en tant que tableau de chaînes à partir de l'appel de code chaîne.
getMspID
Renvoie l'ID MSP de l'identité appelante.
this.getMspID(): string
Paramètres :
  • Aucun élément
Renvoie :
  • string : renvoie l'ID MSP de l'identité appelante.
getNetworkStub
L'utilisateur peut accéder au stub shim en appelant la méthode getNetworkStub. Cela aidera l'utilisateur à écrire sa propre implémentation de travailler directement avec les actifs.
this.getNetworkStub(): shim.ChaincodeStub
Paramètres :
  • Aucun élément
Renvoie :
  • shim.ChaincodeStub : renvoie le stub de réseau de code chaîne.
invokeCrossChaincode
Vous pouvez utiliser cette méthode dans un code chaîne pour appeler une fonction dans un autre code chaîne. Les deux codes 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 chaîne à appeler.
  • methodName : nom de la méthode à appeler dans le code chaîne.
  • arg : argument de la méthode appelante.
  • channelName : canal sur lequel se trouve le code chaîne à appeler.
Renvoie :
  • Promise<any> : renvoie un objet JSON contenant trois champs :
    • isValid : true si l'appel est valide.
    • payload : sortie renvoyée par l'appel de code chaîne croisé, en tant qu'objet JSON.
    • message : message renvoyé par l'appel inter-code de chaîne, au format UTF-8.
invokeChaincode
Vous pouvez utiliser cette méthode dans un code chaîne pour appeler une fonction dans un autre code chaîne. Les deux codes 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 chaîne à appeler.
  • methodName : nom de la méthode à appeler dans le code chaîne.
  • arg : argument de la méthode appelante.
  • channelName : canal sur lequel se trouve le code chaîne à appeler.
Renvoie :
  • Promise<any> : renvoie un objet JSON contenant trois champs :
    • isValid : true si l'appel est valide.
    • payload : sortie renvoyée par l'appel de code chaîne croisé, en tant qu'objet JSON.
    • message : message renvoyé 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.

executeQuery indique comment les requêtes enrichies SQL peuvent être appelées. Les validateurs par rapport aux arguments sont automatiquement ajoutés par Blockchain App Builder en fonction du type de l'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 le déploiement ou la mise à niveau, la méthode init est appelée automatiquement. Si vous effectuez un déploiement ou une mise à niveau à partir de la console Oracle Blockchain Platform sur la plate-forme Hyperledger Fabric v1.4.7, la méthode init est également appelée automatiquement. Si vous effectuez un déploiement ou une mise à niveau à partir de la console Oracle Blockchain Platform sur la plate-forme Hyperledger Fabric v2.x, 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;
}

Si vous souhaitez initialiser un état d'application à ce stade, vous pouvez utiliser cette méthode pour ce faire.