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 Go, le projet échafaudé contient trois fichiers principaux :
main.go
<chaincodeName>.model.go
<chaincodeName>.controller.go
Toutes les bibliothèques nécessaires sont installées et empaquetées.
Le fichier <chaincodeName>.model.go
dans le sous-répertoire model
contient plusieurs définitions de ressource et le fichier <chaincodeName>.controller.go
dans le sous-répertoire controller
contient le comportement de la ressource et les méthodes CRUD. Les différentes balises et packages de la structure Go dans model.go
et controller.go
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 des requêtes enrichies.
Le projet échafaudé se trouve dans le répertoire $GOPATH/src/example.com/<chaincodeName>
.
Modèle
Propriété de type d'actif
Par défaut, chaque structure possède une propriété supplémentaire appelée
AssetType
. Vous pouvez utiliser cette propriété pour extraire uniquement les ressources de ce type. Toute modification apportée à cette propriété est ignorée lors de la création ou de la mise à jour des ressources. La valeur de propriété par défaut est
<modelName>
.
type Supplier struct {
AssetType string 'json:"AssetType" default:"TestGoProject.Supplier"'
SupplierId string 'json:"SupplierId" validate:"string,mandatory" id:"true'
RawMaterialAvailable int 'json:"RawMaterialAvailable" validate:"int,min=0"'
License string 'json:"License" validate:"string,min=10"'
ExpiryDate date.Date 'json:"ExpiryDate" validate:"date,before=2020-06-26"'
Active bool 'json:"Active" validate:"bool" default:"true"'
Metadata interface{} 'json:"Metadata,omitempty"'
}
Valideurs
-
ID
id:"true"
- Ce valideur identifie la propriété qui définit de manière unique l'actif sous-jacent. L'immobilisation est enregistrée par la valeur de cette clé. Ce validateur est automatiquement appliqué lorsqu'un nouveau projet Go est échafaudé.
- Dans l'exemple suivant,
SupplierId
est la clé de la ressource fournisseur et possède une propriété de balise id:"true"
pour la propriété SupplierId
.type Supplier struct {
Supplierld string 'json:"Supplierld" validate:"string,mandatory" id:"true"'
RawMaterialAvailable int 'json:"RawMaterialAvailable" validate:"int,min=0"'
License string 'json:"License" validate:"string,min=10"'
ExpiryDate date.Date 'json:"ExpiryDate" validate:"date,before=2020-06-26"'
Active bool 'json:"Active" validate:"bool" default :"true"'
Metadata interface{} 'json:"Metadata,omitempty"'
}
-
Dérivé
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.
-
type Supplier struct{
AssetType string 'json:"AssetType" final:"chaincode1.Supplier"'
SupplierId string 'json:"SupplierId" validate:"string" id:"true" mandatory:"true" derived:"strategy=hash,algorith=sha256,format=IND%1%2,License,Name"'
Name string 'json:"Name" validate:"string,min=2,max=4"'
License string 'json:"License" validate:"string,min=2,max=4"'
}
-
Obligatoire
validate:"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. Dans l'exemple suivant, la propriété
SupplierId
comporte une balise validate:"mandatory"
.Type Supplier struct {
Supplierld string 'json:"Supplierld" validate:"string,mandatory" id:"true"'
RawMaterialAvailable int 'json:"RawMaterialAvailable" validate:"int,min=0"'
License string 'json:"License" validate:"string,min=10"'
ExpiryDate date.Date 'json:"ExpiryDate" validate:"date,before=2020-06-26"'
Active bool 'json:"Active" validate:"bool" default :"true"'
Metadata interface{} 'json:"Metadata,omitempty"'
}
-
Par défaut
default:"<param>"
- Ce décorateur indique que la propriété suivante a une valeur par défaut. La valeur de la balise par défaut est utilisée lorsque la propriété est ignorée lors de l'enregistrement dans le livre. Dans l'exemple suivant, la valeur par défaut de
Active
est true
, indiquée en tant que balise default:"true"
.Type Supplier struct {
Supplierld string 'json:"Supplierld" validate:"string,mandatory" id:"true"'
RawMaterialAvailable int 'json:"RawMaterialAvailable" validate:"int,min=0"'
License string 'json:"License" validate:"string,min=10"'
ExpiryDate date.Date 'json:"ExpiryDate" validate:"date,before=2020-06-26"'
Active bool 'json:"Active" validate:"bool" default :"true"'
Metadata interface{} 'json:"Metadata,omitempty"'
}
-
Valider les types
- Les types Go de base sont validés pour une propriété en définissant une balise de validation. Les balises de validation suivantes sont basées sur les types de base :
- chaîne :
validate: "string"
- date :
validate: "date"
- numéro :
validate: "int"
- boolean :
validate: "bool"
-
Valideur minimum
validate:"min=<param>"
- Vous pouvez utiliser le valideur
min
pour définir la valeur minimale d'une propriété de type nombre ou chaîne.
- Pour le type int : dans l'exemple suivant, la propriété
RawMaterialAvailable
a une valeur minimale de 0. Si une valeur inférieure à 0 est appliquée à la propriété RawMaterialAvailable
, une erreur est renvoyée.
- Pour la chaîne de type : le validateur minimum vérifie la longueur de la chaîne par rapport à la valeur spécifiée. Dans l'exemple suivant, la propriété
License
doit comporter au moins dix caractères.
Type Supplier struct {
Supplierld string 'json:"Supplierld" validate:"string,mandatory" id:"true"'
RawMaterialAvailable int 'json:"RawMaterialAvailable" validate:"int,min=0"'
License string 'json:"License" validate:"string,min=10"'
ExpiryDate date.Date 'json:"ExpiryDate" validate:"date,before=2020-06-26"'
Active bool 'json:"Active" validate:"bool" default :"true"'
Metadata interface{} 'json:"Metadata,omitempty"'
}
-
Valideur maximal
validate:"max=<param>"
- Vous pouvez utiliser le valideur max pour définir la valeur maximale d'une propriété de type nombre et chaîne.
- Pour le type int : Similaire au valideur min, si une valeur spécifiée pour un champ de structure est supérieure à la valeur fournie dans le valideur, une erreur est renvoyée.
- Pour la chaîne de type : comme pour le valideur min., le valideur max vérifie la longueur de la chaîne par rapport à la valeur donnée. Dans l'exemple suivant, la propriété
Domain
a une valeur maximale de 50. Par conséquent, si la propriété Domain
a une chaîne de plus de 50 caractères, un message d'erreur est renvoyé.
-
type Retailer struct {
Retailerld string 'json:"Retailerld" validate:"string,mandatory" id:"true"'
ProductsOrdered int 'json:"ProductsOrdered" validate:"int,mandatory"'
ProductsAvailable int 'json:"ProductsAvailable" validate:"int" default:"1"'
ProductsSold int 'json:"ProductsSold" validate:"int"'
Remarks string 'json:"Remarks" validate:"string" default :"open for business"'
Items []int 'json:"Items" validate:"array=int,range=l-5"'
Domain string 'json:"Domain" validate:"url,min=30,max=50"'
Metadata interface{} 'json:"Metadata,omitempty"'
}
-
Valideurs de date
- Avant validation :
validate:"before=<param>"
- Le valideur "avant" valide une propriété de type
date
pour avoir une valeur inférieure au paramètre indiqué.
- Dans l'exemple suivant, la propriété
ExpiryDate
doit être antérieure à "2020-06-26"
et si ce n'est pas le cas, une erreur est renvoyée.Type Supplier struct {
Supplierld string 'json:"Supplierld" validate:"string,mandatory" id:"true"'
RawMaterialAvailable int 'json:"RawMaterialAvailable" validate:"int,min=0"'
License string 'json:"License" validate:"string,min=10"'
ExpiryDate date.Date 'json:"ExpiryDate" validate:"date,before=2020-06-26"'
Active bool 'json:"Active" validate:"bool" default :"true"'
Metadata interface{} 'json:"Metadata,omitempty"'
}
- Après validation :
validate:"after=<param>"
- Le valideur après valide une propriété de type
date
pour qu'elle ait une valeur supérieure au paramètre indiqué.
- Dans l'exemple suivant, la propriété
CompletionDate
doit être postérieure à "2020-06-26"
et, dans le cas contraire, elle renvoie une erreur.Type Supplier struct {
Manufacturerld string 'json:"Manufacturerld" validate:"string,mandatory" id:"true"'
RawMaterialAvailable int 'json:"RawMaterialAvailable" validate:"int,max=8"'
ProductsAvailable int 'json:"ProductsAvailable" validate:"int"'
CompletionDate date.Date 'json:"CompletionDate" validate:"date,after=2020-06-26"'
Metadata interface{} 'json:"Metadata,omitempty"'
}
-
Valideur d'URL
validate:"url"
- Le valideur d'URL valide une propriété pour les chaînes d'URL.
- Dans l'exemple suivant, la propriété
Domain
doit être une URL valide.type Retailer struct {
Retailerld string 'json:"Retailerld" validate:"string,mandatory" id:"true"'
ProductsOrdered int 'json:"ProductsOrdered" validate:"int,mandatory"'
ProductsAvailable int 'json:"ProductsAvailable" validate:"int" default:"1"'
ProductsSold int 'json:"ProductsSold" validate:"int"'
Remarks string 'json:"Remarks" validate:"string" default :"open for business"'
Items []int 'json:"Items" validate:"array=int,range=l-5"'
Domain string 'json:"Domain" validate:"string,url,min=30,max=50"'
Metadata interface{} 'json:"Metadata,omitempty"'
}
-
Valideur d'expression régulière
validate:"regexp=<param>"
- Le valideur d'expression régulière valide une propriété avec l'expression régulière spécifiée.
- Dans l'exemple suivant, la propriété
PhoneNumber
est validée pour un numéro de téléphone portable conformément à l'expression régulière.type Customer struct {
Customerld string 'json:"Customerld" validate:"string,mandatory" id:"true"'
Name string 'json:"Name" validate:"string,mandatory"'
ProductsBought int 'json:"ProductsBought" validate:"int"'
OfferApplied int 'json:"OfferApplied" validate :"int,nax=0"'
PhoneNumber string 'json:"PhoneNumber" validate:"string,regexp=A\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$"'
Received bool 'json:"Received" validate:"bool"'
Metadata interface{} 'json:"Metadata,omitempty"'
}
-
Validateurs multiples
- Plusieurs valideurs peuvent être appliqués à une propriété.
- Dans l'exemple suivant, la propriété
Domain
comporte une validation pour une chaîne, une URL et une longueur de chaîne minimale et maximale.type Retailer struct {
Retailerld string 'json:"Retailerld" validate:"string,mandatory" id:"true"'
ProductsOrdered int 'json:"ProductsOrdered" validate:"int,mandatory"'
ProductsAvailable int 'json:"ProductsAvailable" validate:"int" default:"1"'
ProductsSold int 'json:"ProductsSold" validate:"int"'
Remarks string 'json:"Remarks" validate:"string" default :"open for business"'
Items []int 'json:"Items" validate:"array=int,range=l-5"'
Domain string 'json:"Domain" validate:"string,url,min=30,max=50"'
Metadata interface{} 'json:"Metadata,omitempty"'
}
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 t.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.
Méthodes SDK
Les codes chaîne Go implémentent la capacité de persistance transparente (ORM) avec le package de modèle.
Remarques :
Depuis la version 21.2.3, 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 exposées en tant que méthodes statiques dans le package de modèle. Les méthodes sont maintenant définies sur le récepteur du modèle, qui contient le stub de transaction. Pour appeler ces méthodes, vous utilisez le récepteur de modèle détenu par le contexte de transaction dans le contrôleur. Vous appelez ces méthodes en tant que t.Ctx.Model.<method_name>
au lieu de model.<method_name>
.
L'exemple suivant présente les appels de méthode Save
et Get
dans les versions précédentes :
func (t *Controller) CreateSupplier(asset Supplier) (interface{}, error) {
return model.Save(&asset)
}
func (t *Controller) GetSupplierById(id string) (Supplier, error) {
var asset Supplier
_, err := model.Get(id, &asset)
return asset, err
}
L'exemple suivant présente les appels de méthode Save
et Get
à partir de la version 21.2.3 et des versions ultérieures :
func (t *Controller) CreateSupplier(asset Supplier) (interface{}, error) {
return t.Ctx.Model.Save(&asset)
}
func (t *Controller) GetSupplierById(id string) (Supplier, error) {
var asset Supplier
_, err := t.Ctx.Model.Get(id, &asset)
return asset, err
}
Après la mise à niveau vers la version 21.2.3, 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.
Les méthodes ORM suivantes sont exposées par le package de modèle :
-
Get
- Interroge le livre de l'immobilisation stockée en fonction du code indiqué.
-
func Get(Id string, result ...interface{}) (interface{}, error)
- Paramètres :
Id
- ID de l'immobilisation à extraire du livre.
result (interface{})
: objet de ressource vide d'un type particulier transmis par référence. Cet objet contiendra le résultat de cette méthode. Utilisez ce paramètre uniquement si un résultat spécifique au type est requis.
asset (interface)
: objet de ressource vide transmis par référence. Cet objet contiendra le résultat de cette méthode. Utilisez ce paramètre uniquement si un résultat spécifique au type est requis.
- Renvoie :
interface {}
: l'interface contient la ressource au format map[string]interface{}
. Avant d'utiliser cette carte, vous devez affirmer l'interface renvoyée avec le type map[string]interface{}
. Pour convertir cette correspondance en objet de ressource, vous pouvez utiliser l'API de l'utilitaire util.ConvertMaptoStruct
(reportez-vous à Package d'utilitaire).
error
: contient une erreur si elle est renvoyée ou est nulle.
-
Update
- Met à jour l'immobilisation indiquée dans le livre avec de nouvelles valeurs.
-
func Update(args ...interface{}) (interface{}, error)
- Paramètres :
obj (interface)
: l'objet à mettre à jour dans le livre est transmis par référence à cette API avec les nouvelles valeurs. L'immobilisation d'entrée est validée et vérifiée en fonction des balises de structure dans la spécification de modèle, puis stockée dans le livre.
- Renvoie :
interface{}
: la ressource enregistrée est renvoyée en tant qu'interface.
error
: contient une erreur si elle est renvoyée ou est nulle.
-
Save
- Enregistre l'immobilisation dans le livre après validation sur toutes les étiquettes de structure.
-
func Save(args ...interface{}) (interface{}, error)
- Paramètres :
obj/args[0] (interface{})
: l'objet à stocker dans le livre est transmis par référence dans cette méthode utilitaire.
metadata/args[1] (interface{})
: (facultatif) vous pouvez utiliser ce paramètre pour stocker des métadonnées dans le livre avec la ressource lors de l'exécution.
- Renvoie :
interface {}
: la ressource est renvoyée en tant qu'interface.
error
: contient une erreur si elle est renvoyée ou est nulle.
-
Delete
- Permet de supprimer l'immobilisation du livre.
-
func Delete(Id string) (interface{}, error)
- Paramètres :
id (string)
- ID de l'immobilisation à supprimer du livre.
- Renvoie :
interface {}
: contient la ressource en cours de suppression au format map[string]interface{}
.
-
GetByRange
- Renvoie une liste de ressources spécifiées par une plage d'ID.
-
func GetByRange(startKey string, endKey string, asset ...interface{})
([]map[string]interface{}, error)
- Paramètres :
startkey (string)
: ID de début de la plage d'objets à extraire.
endkey (string)
: ID de fin de la plage d'objets à extraire.
asset interface
: (facultatif) tableau vide de ressources transmis par référence. Ce tableau contiendra le résultat de la méthode. Utilisez ce paramètre si un résultat spécifique au type est requis.
- Renvoie :
[]map[string]interface{}
: ce tableau contient la liste des immobilisations obtenues à partir du livre. Vous pouvez accéder aux objets en les itérant sur ce tableau et en les affirmant en tant qu'objets map[string]interface{}
et en utilisant un utilitaire pour la conversion en objet de ressource.
error
: contient une erreur si elle est renvoyée ou est nulle.
-
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
, filtrées par taille de page et signet. 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
.
-
func (m *Model) GetByRangeWithPagination(startKey string, endKey string, pageSize int32, bookmark string, asset ...interface{}) ([]map[string]interface{}, error)
- Paramètres :
startkey : string
: clé de début de la plage, qui est incluse dans la plage.
endkey : 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.
asset interface
: (facultatif) tableau vide de ressources transmis par référence. Ce tableau contiendra le résultat de cette méthode. Utilisez ce paramètre pour obtenir des résultats propres au type.
- Renvoie :
[]map[string]interface{}
: tableau contenant la liste des immobilisations extraites du livre. Vous pouvez accéder aux objets en les itérant sur ce tableau et en les affirmant en tant qu'objets map[string]interface{}
et en utilisant un utilitaire de conversion en objet de ressource.
error
: contient une erreur si une erreur est renvoyée, sinon nulle.
-
GetHistoryById
- Renvoie l'historique de l'immobilisation avec l'ID indiqué.
-
func GetHistoryByID(Id string) ([]interface{}, error)
- Paramètres :
Id (string)
: ID de la ressource.
- Renvoie :
[]interface{}
: cette tranche contient l'historique de l'immobilisation obtenue à partir du livre sous la forme d'une tranche de map[string]interface{}
. Vous pouvez accéder à chaque élément d'historique en itérant sur cette tranche et en définissant les objets comme map[string]interface{}
et en utilisant un utilitaire pour la conversion en objet de ressource.
error
: contient l'erreur si une erreur est renvoyée.
-
Query
- Cette méthode exécute une requête SQL/Couch DB 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.
-
func Query(queryString string) ([]interface{}, error)
- Paramètres :
queryString (string)
: chaîne de requête.
- Renvoie :
[]interface{}
: sortie de requête sous la forme d'une tranche d'interfaces. Parcourez la tranche et utilisez les éléments en les convertissant en types appropriés.
error
: contient l'erreur si une erreur est renvoyée.
-
QueryWithPagination
- Cette méthode exécute une requête SQL/Couch DB sur le livre, filtrée par taille de page et signet. 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.
-
func (m *Model) QueryWithPagination(queryString string, pageSize int32, bookmark string) ([]interface{}, error)
- Paramètres :
queryString (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 :
[]interface{}
: sortie de requête sous la forme d'une tranche d'interfaces. Parcourez la tranche et utilisez les éléments en les convertissant en types appropriés.
error
: contient l'erreur si une erreur est renvoyée.
-
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.
-
func InvokeCrossChaincode(chaincodeName string, method string, args []string, channelName string) (interface{}, error)
- 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 :
interface{}
: renvoie un objet map[string]interface{}
qui contient trois clés :
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.
- Exemple de valeur renvoyée :
{
"isValid": true,
"message": "Successfully invoked method [CreateAccount] on sub-chaincode [erc721_go_453]",
"payload": {
"AccountId": "oaccount~6b83b8ab931f99442897dd04cd7a2a55f808686f49052a40334afe3753fda4c4",
"AssetType": "oaccount",
"BapAccountVersion": 0,
"NoOfNfts": 0,
"OrgId": "appdev",
"TokenType": "nonfungible",
"UserId": "user2"
}
}
-
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.
-
func InvokeChaincode(chaincodeName string, method string, args []string, channelName string) (interface{}, error)
- 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 :
interface{}
: renvoie un objet map[string]interface{}
qui contient trois clés :
isValid
: true
si l'appel est valide.
payload
: sortie renvoyée par l'appel inter-code chaîne, au format UTF-8.
message
: message renvoyé par l'appel inter-code chaîne, au format UTF-8.
- Exemple de valeur renvoyée :
{
"isValid": true,
"message": "Successfully invoked method [CreateAccount] on sub-chaincode [erc721_go_453]",
"payload": "{\"AssetType\":\"oaccount\",\"AccountId\":\"oaccount~c6bd7f8dcc339bf7144ea2e1cf953f8c1df2f28482b87ad7895ac29e7613a58f\",\"UserId\":\"user1\",\"OrgId\":\"appdev\",\"TokenType\":\"nonfungible\",\"NoOfNfts\":0,\"BapAccountVersion\":0}"
}
Méthodes à clé composite
-
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.
func GenerateCompositeKey(indexName string, attributes []string)
(string, error)
- Paramètres :
indexName (string)
: type d'objet de la clé composite.
attrbutes ([]string)
: attributs de la ressource sur la base desquels la clé composite sera formée.
- Renvoie :
string
: résultat de la clé composite.
error
: contient l'erreur si une erreur est renvoyée.
-
GetByCompositeKey
- Cette méthode renvoie la ressource correspondant à la clé et à la colonne indiquées. Le paramètre
index
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.
func GetByCompositeKey(key string, columns []string, index int)
(interface{}, error)
- Paramètres :
key (string)
: type d'objet fourni lors de la création de la clé composite.
column ([]string)
: tranche d'attributs sur laquelle le livre sera interrogé à l'aide de la clé composite.
index(int)
: index de l'attribut.
- Renvoie :
Interface{}
: liste des ressources correspondantes.
error
: contient l'erreur si une erreur est renvoyée.
Méthode stub
-
GetNetworkStub
- Cette méthode renvoie la valeur
chaincodeStub
d'Hyperledger Fabric.
- Vous pouvez accéder au stub shim en appelant la méthode
GetNetworkStub
. Cela peut vous aider à rédiger votre propre implémentation qui fonctionne directement avec les ressources.
func GetNetworkStub() shim.ChaincodeStubInterface
- Paramètres :
- Renvoie :
shim.ChaincodeStubInterface
: stub de code chaîne Hyperledger Fabric.
Autres méthodes
GetTransactionId()
GetTransactionTimestamp()
GetChannelID()
GetCreator()
GetSignedProposal()
GetArgs()
GetStringArgs()
GetCreatorMspId()
GetId
-
GetTransactionId
- Cette méthode 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.
func GetTransactionId() string
- Paramètres :
- Renvoie :
string
: ID de transaction.
-
GetTransactionTimestamp
- Renvoie l'horodatage de la création de la transaction. Etant donné que la valeur est extraite de la transaction
ChannelHeader
, elle indique l'horodatage du client et a la même valeur pour tous les approbateurs.
func GetTransactionTimestamp() (*timestamp.Timestamp, error)
- Paramètres :
- Renvoie :
timestamp.Timestamp
: horodatage.
error
: contient l'erreur si une erreur est renvoyée.
-
GetChannelID
- Renvoie l'ID de canal de la proposition de traitement du code chaîne.
func GetChannelID() string
- Paramètres :
- Renvoie :
string
: ID de canal demandé au format chaîne.
-
GetCreator
- Renvoie l'objet d'identité de la personne qui soumet l'appel de code chaîne.
func GetCreator() ([]byte, error)
- Paramètres :
- Renvoie :
[]byte
: objet d'identité requis sous forme sérialisée.
error
: contient l'erreur si une erreur est renvoyée.
-
GetSignedProposal
- Renvoie un objet entièrement décodé de la proposition de transaction signée.
func GetSignedProposal() (*peer.SignedProposal, error)
- Paramètres :
- Renvoie :
*peer.SignedProposal
: objet de proposition signé.
error
: contient l'erreur si une erreur est renvoyée.
-
GetArgs
- Renvoie les arguments sous forme de tableau de chaînes à partir de la demande d'appel de code chaîne.
func GetArgs() [][]byte
- Paramètres :
- Renvoie :
[][]byte
: arguments transmis.
-
GetStringArgs
- Renvoie les arguments prévus pour les méthodes de code chaîne
Init
et Invoke
sous forme de tableau de chaînes.
func GetStringArgs() []string
- Paramètres :
- Renvoie :
[]string
: arguments sous forme de tableau de chaînes.
-
GetCreatorMspId
- Renvoie l'ID MSP de l'identité appelante.
-
func GetCreatorMspId() string
- Paramètres :
- Renvoie :
string
: ID MSP de l'identité appelante.
-
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 :
func (t *Controller) CustomGetterForSupplier(License string, Name string)(interface{}, error){
var asset Supplier
asset.License = License
asset.Name = Name
id,err := t.Ctx.Model.GetId(&asset)
if err !=nil {
return nil, fmt.Errorf("error in getting ID %v", err.Error())
}
return t.GetSupplierById(id)
}
Package utilitaire
Les méthodes suivantes sont fournies dans le package de l'utilitaire.
-
Util.CreateModel
- Analyse la chaîne JSON indiquée et crée un objet de ressource du type indiqué.
func CreateModel(obj interface{}, inputString string) error
- Paramètres :
inputString (string)
: chaîne JSON d'entrée à utiliser pour créer l'objet.
obj (interface{})
: référence de l'objet à créer à partir de la chaîne JSON. Cet objet stockera le modèle créé, qui est également validé conformément aux balises de validation.
- Renvoie :
error
: contient l'erreur si une erreur est renvoyée lors de la création ou de la validation de la ressource.
-
util.ConvertMapToStruct
- Convertit la mappe spécifiée en un objet du type spécifié.
func ConvertMapToStruct(inputMap map[string](interface{}), resultStruct
interface{}) error
- Paramètres :
inputMap (map[string](interface{}))
: carte à convertir en objet de ressource.
resultStruct (interface{})
: référence de l'objet de ressource à créer à partir de la correspondance.
- Renvoie :
error
: contient l'erreur si une erreur est renvoyée lors de la création ou de la validation de la ressource.
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
Le fichier Controller.go
implémente les méthodes CRUD et personnalisées pour les ressources.
Vous pouvez créer autant de classes, de fonctions ou de fichiers que vous le souhaitez, mais seules les méthodes définies sur la structure de code chaîne 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 choisissez de générer toutes les méthodes, le résultat ressemblera au code suivant :
//
//Supplier
//
func (t *ChainCode) CreateSupplier(inputString string) (interface{}, error) {
var obj Supplier
err := util.CreateModel(&obj, inputString)
if err != nil {
return nil, err
}
return model.Save(&obj)
}
func (t *ChainCode) GetSupplierById(id string) (interface{}, error) {
asset, err := model.Get(id)
return asset, err
}
func (t *ChainCode) UpdateSupplier(inputString string) (interface{}, error) {
var obj Supplier
err := util.CreateModel(&obj, inputstring)
if err != nil {
return nil, err
}
return model.Update(&obj)
}
func (t *ChainCode) DeleteSupplier(id string) (interface{}, error) {
return model.Delete(id)
}
func (t *ChainCode) GetSupplierHistoryById(id string) (interface{}, error) {
historyArray, err := model.GetHistoryByld(id)
return historyArray, err
}
func (t *ChainCode) GetSupplierByRange(startkey string, endKey string) (interface{}, error) {
assetArray, err := model.GetByRange(startkey, endKey)
return assetArray, err
}
Méthodes personnalisées
Les méthodes personnalisées suivantes ont été générées à partir de l'exemple de fichier de spécification.
La fonction 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.
Vous pouvez implémenter les fonctionnalités en fonction de la logique métier nécessaire. Si vous ajoutez des méthodes personnalisées, ajoutez-les au fichier de contrôleur. Si vous ajoutez des méthodes personnalisées à la bibliothèque au lieu du fichier de contrôleur, vos modifications seront perdues lorsque le contenu du dossier de bibliothèque sera mis à jour lors des processus de synchronisation ou de mise à niveau du code chaîne.
//
//Custom Methods
//
/*
* 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.
*/
func (t *ChainCode) ExecuteQuery(inputQuery string) (interface{}, error) {
resultArray, err := model.Query(inputQuery)
return resultArray, err
}
func (t *ChainCode) FetchRawMaterial(supplierId string, rawMaterialSupply int) (interface{}, error) {
return nil, nil
}
func (t *ChainCode) GetRawMaterialFromSupplier(manufacturerId string, supplierId string, rawMaterialSupply int) (interface{} error) {
return nil, nil
}
Func (t *ChainCode) CreateProducts(manufacturerId string, rawMaterialConsumed int, productsCreated int) (interface{}, error) {
return nil, nil
}
func (t *ChainCode) SendProductsToDistribution() (interface{}, error) {
return nil, nil
}
Pour les codes chaîne Go, chaque méthode personnalisée doit renvoyer deux valeurs :
empty interface et
error, comme indiqué dans l'exemple suivant :
func (t *Controller) FetchRawMaterial(supplierId string, rawMaterialSupply int) (interface{}, error) {
return nil, nil
}
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.
type Controller struct {
}
func (t *Controller) Init(args string) (interface{}, error)
{ return nil, nil
}
Vous pouvez ensuite utiliser cette méthode pour initialiser n'importe quel état d'application.