Blockchain App Builder extrait l'entrée de votre fichier de spécification et génère un projet de code chaîne échafaudé 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 empaqueté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 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 fonctionnalité de persistance transparente (ORM) et l'appel de requêtes enrichies.
Modèles
Chaque classe de modèle étend la classe OchainModel
, qui possède une propriété en lecture seule supplémentaire 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. La valeur de propriété par défaut est <modelName>
.
La classe
OchainModel
applique les comportements des décorateurs 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 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. S'il est ignoré, 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 d'informations, reportez-vous à 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 un actif incorporable. Il prend la classe incorporable comme 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
possède une propriété nommée address
de type Address
, qui sera intégrée à la ressource Employee
. Ceci 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
n'a pas de décorateur de classe assetType
ni de propriété @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 que dans le cadre de l'objet conteneur (ressources OchainModel
). Tous les décorateurs ci-dessus sont appliqués automatiquement en fonction du fichier d'entrée pendant 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 comporte deux paramètres obligatoires :
STRATEGY
: prend les valeurs CONCAT
ou HASH
. Si HASH
est indiqué, 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 et de valeurs de spécification à 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écorateur de méthodes
@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é et le renvoi d'un objet modèle/type. Les méthodes de contrôleur doivent avoir ce décorateur pour pouvoir être invoqué. Il prend plusieurs modèles créés par l'utilisateur ou schémas yup comme paramètres.
- L'ordre des paramètres doit être identique à 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 validateurs 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 et d'ordre similaires 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 Context (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 suivantes implémentent ORM :
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, voir :
Méthodes SDK.
Méthodes SDK
Remarques :
Depuis 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 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 sur 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 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 le code source, les modifications sont automatiquement répercutées sur le 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 asset
de l'appelant au livre.
- Cette méthode appelle Hyperledger Fabric
putState
en interne. Toutes les opérations de sérialisation et de désérialisation sont effectué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 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
.
- Pour renvoyer une ressource à partir d'une ressource
id
donnée, 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éliser la classe de ressources à 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 une ressource avec id
donné est renvoyée à partir du livre, cette méthode gère la conversion dans le type Asset
de l'appelant. Si l'immobilisation renvoyée par le 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
.
- 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 asset
de l'appelant 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/désérialisation sont effectué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 opération supprime l'immobilisation du livre indiqué par
id
si elle existe. Cette méthode appelle la méthode Hyperledger Fabric deleteState
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, s'il existe.
- Cette méthode appelle la méthode Hyperledger Fabric
getHistoryForKey
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 [] à la fin.
- Exemple
@Validator(yup.string())
public async getSupplierHistoryById(id: string) {
const result = await this.Ctx.Model.history(id);
return result;
}
- Exemple d'historique de ressource renvoyé 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 classe OchainModel
qui est héritée par les classes Model
concrètes de {chaincodeName}.model.ts
.
- Cette méthode renvoie la liste des ressources comprises entre la plage
startId
et endId
. Cette méthode appelle la méthode Hyperledger Fabric getStateByRange
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 l'immobilisation 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 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, qui est incluse dans la plage.
endId : string
: clé de fin de la plage, qui est exclue de la plage.
modelName: <Model Asset Class Name>
– (Facultatif) Modéliser la classe de ressources à renvoyer.
- Renvoie :
Promise< Asset[ ] >
: renvoie le tableau de <Asset>
une fois l'opération terminée.
- 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 classe OchainModel
qui est héritée par les classes Model
concrètes de {chaincodeName}.model.ts
.
- Cette méthode renvoie la liste des ressources comprises entre la plage
startId
et endId
. Cette méthode appelle la méthode Hyperledger Fabric getStateByRangeWithPagination
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 l'immobilisation 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 les plages
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, qui est incluse dans la plage.
endId : string
: clé de fin de la plage, qui est exclue 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éliser la classe de ressources à renvoyer.
- Renvoie :
Promise< Asset[ ] >
: renvoie le tableau de <Asset>
une fois l'opération terminée.
-
getId
- Lorsque la clé dérivée de la ressource est
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 jeton à l'aide de Blockchain App Builder.
Contrôleur
La classe de contrôleur principale étend la classe OchainController
. Il n'existe qu'un seul contrôleur principal.
export class TSProjectController extends OchainController{
Vous pouvez créer autant de classes, de fonctions ou de fichiers que vous le souhaitez, 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 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 indiqué de générer toutes les méthodes, le résultat serait 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 de contrôleur
Outre les méthodes CRUD et non-CRUD du modèle précédent, Blockchain App Builder fournit un support prêt à 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
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 d'un ID spécifié. Il s'agit d'une méthode générique qui peut être utilisée pour obtenir une ressource 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 à l'achèvement. Vous devez convertir byte[]
en objet.
-
getAssetsByRange
- La méthode
getAssetsByRange
renvoie toutes les ressources présentes de startId
(inclus) à endId
(exclu), 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, qui est incluse dans la plage.
endId : string
: clé de fin de la plage, qui est exclue de la plage.
- Renvoie :
Promise< shim.Iterators.StateQueryIterator>
: renvoie un itérateur à la fin. Vous devez itérer dessus.
-
getAssetHistoryById
- La méthode
getAssetHistoryById
renvoie 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.
- Renvoie :
Promise<shim.Iterators.HistoryQueryIterator>
: renvoie un itérateur de requête d'historique. Vous devez itérer dessus.
-
query
- La méthode
query
exécute une interrogation SQL/Couch DB enrichie sur le livre. Cette méthode est prise en charge uniquement pour les déploiements distants 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. 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 est prise en charge uniquement pour les déploiements distants 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. Vous devez itérer dessus.
-
generateCompositeKey
- Cette méthode génère et renvoie la clé composite en fonction de la valeur
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 sur lesquels une clé composite sera formée.
- Renvoie :
string
: renvoie une clé composite.
-
getByCompositeKey
- Cette méthode renvoie l'immobilisation qui correspond à 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é renvoyée dans le tableau de la méthode stub SplitCompositeKey
. En interne, cette méthode appelle les méthodes 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 registre.
columns: string[ ]
: attributs basés sur lesquels une clé est générée.
indexOfId: number
: index de l'attribut à extraire de la clé.
- Renvoie :
Promise< any [ ]
: renvoie n'importe quel élément []
à la fin.
-
getTransactionId
- Renvoie l'ID de transaction de 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 :
- Renvoie :
string
: renvoie l'ID de transaction de 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 indiquera donc l'horodatage du client et aura 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 de la proposition de traitement du code chaîne.
this.getChannelID(): string
- Paramètres :
- Renvoie :
string
: renvoie l'ID de canal.
-
getCreator
- Renvoie l'objet d'identité de la personne qui soumet l'appel de code chaîne.
this.getCreator(): shim.SerializedIdentity
- Paramètres :
- Renvoie :
shim.SerializedIdentity
: renvoie un 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 :
- 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 :
- Renvoie :
string [ ]
: renvoie les arguments sous forme de 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 :
- Renvoie :
string [ ]
: renvoie les arguments sous forme de 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 :
- Renvoie :
string
: renvoie l'ID MSP de l'identité appelante.
-
getNetworkStub
- Vous pouvez accéder au stub shim en appelant cette méthode. Cela peut vous aider à écrire votre propre implémentation de l'utilisation directe des ressources.
this.getNetworkStub(): shim.ChaincodeStub
- Paramètres :
- Renvoie :
shim.ChaincodeStub
: renvoie le stub 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 qui contient trois champs :
isValid
: true
si l'appel est valide.
payload
: sortie renvoyée par l'appel inter-code chaîne, en tant qu'objet JSON.
message
: message renvoyé par l'appel inter-code chaîne, au format UTF-8.
-
invokeChaincode
- Cette méthode appelle 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 qui contient trois champs :
isValid
: true
si l'appel est valide.
payload
: sortie renvoyée par l'appel inter-code chaîne, en tant qu'objet JSON.
message
: message renvoyé par l'appel inter-code 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 des requêtes enrichies SQL. Les validateurs 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 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, vous devez appeler la méthode init
manuellement. Vous pouvez utiliser un outil tiers tel que Postman pour appeler la méthode init
manuellement.
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.