Blockchain App Builder toma la entrada de su archivo de especificación y genera un proyecto de código de cadenas de andamios totalmente funcional. El proyecto contiene clases y funciones generadas automáticamente, métodos CRUD, métodos SDK, validación automática de argumentos, canalización/anulación de canalización y capacidad de persistencia transparente (ORM).
Si el proyecto de código de cadenas utiliza el lenguaje TypeScript, el proyecto con andamios contiene tres archivos principales:
main.ts
<chaincodeName>.model.ts
<chaincodeName>.controller.ts
Todas las bibliotecas necesarias están instaladas y empaquetadas. El archivo
tsconfig.json
contiene la configuración necesaria para compilar y crear el proyecto TypeScript.
El archivo <chaincodeName>.model.ts
del subdirectorio model
contiene varias definiciones de activos y el archivo <chaincodeName>.controller.ts
del subdirectorio controller
contiene el comportamiento de los activos y los métodos CRUD.
Los distintos decoradores de model.ts
y controller.ts
proporcionan soporte para funciones como la validación automática de argumentos, la canalización/anulación de la canalización de argumentos, la capacidad de persistencia transparente (ORM) y la llamada a consultas enriquecidas.
Modelos
Cada clase de modelo amplía la clase OchainModel
, que tiene una propiedad adicional de solo lectura denominada assetType
. Esta propiedad se puede utilizar para recuperar solo activos de este tipo. Los cambios realizados en esta propiedad se ignoran durante la creación y actualización del activo. El valor de la propiedad por defecto es <modelName>
.
La clase
OchainModel
aplica comportamientos de decorador a las propiedades de la clase.
@Id('supplierId')
export class Supplier extends OchainModel<Supplier> {
public readonly assetType = 'supplier';
@Mandatory()
@Validate(yup.string())
public supplierId: string;
Decoradores
-
Decoradores de clase
@Id(identifier)
- Este decorador identifica la propiedad que define de forma única el activo subyacente. Esta propiedad se utiliza como clave del registro, que representa este activo en el estado del código de cadenas. Este decorador se aplica automáticamente cuando se andamia un nuevo proyecto TypeScript. El argumento 'identificador' del decorador toma el valor del archivo de especificación.
@Id('supplierId')
export class Supplier extends OchainModel{
...
}
-
Decoradores de propiedades
- Se pueden utilizar varios decoradores de propiedades. Los decoradores se resuelven en orden superior a inferior.
@Mandatory()
- Esto marca la siguiente propiedad como obligatoria, por lo que no se puede omitir al guardar en el libro mayor. Si se omite, devuelve un error.
@Mandatory()
public supplierID: string;
@Default(param)
- Esta propiedad puede tener un valor predeterminado. El valor por defecto del argumento (
param
) se utiliza cuando se omite la propiedad al guardar en el libro mayor.@Default('open for business')
@Validate(yup.string())
public remarks: string;
@Validate(param)
- La siguiente propiedad se valida con el esquema presentado en el parámetro. El argumento
param
toma un esquema yup y muchos métodos de esquema se pueden encadenar juntos. Se pueden agregar muchas validaciones complejas. Consulte https://www.npmjs.com/package/yup para obtener más información.@Validate(yup.number().min(3))
public productsShipped: number;
@ReadOnly(param)
- Este decorador de propiedades marca la propiedad subyacente como un valor de solo lectura. El valor del argumento, por ejemplo param, se utiliza cuando la propiedad se guarda en el libro mayor. Una vez definido el valor, no se puede editar ni eliminar.
@ReadOnly('digicur')
public token_name: string;
@Embedded(PropertyClass)
- Este decorador de propiedades marca la propiedad subyacente como un activo que se puede embeber. Toma la clase embebible como parámetro. Esta clase debe ampliar la clase
EmbeddedModel
. Esto es validado por el decorador.
- En este ejemplo,
Employee
tiene una propiedad denominada address
de tipo Address
, que se embeberá con el activo Employee
. Esto se indica mediante el decorador @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;
}
- Cuando se crea una nueva instancia de la clase
Address
, el decorador @Validate()
valida automáticamente todas las propiedades de la clase Address
. Tenga en cuenta que la clase Address
no tiene la propiedad assetType
ni el decorador de clase @Id()
. Este activo y sus propiedades no se guardan en el libro mayor por separado, sino que se guardan junto con el activo Employee
. Los activos embebidos son clases definidas por el usuario que funcionan como tipos de valores. La instancia de esta clase solo se puede almacenar en el libro mayor como parte del objeto que lo contiene (activos OchainModel
). Todos los decoradores anteriores se aplican automáticamente en función del archivo de entrada mientras se andamiaje el proyecto.
@Derived(STRATEGY, ALGORITHM, FORMAT)
- Este decorador se utiliza para definir el atributo derivado de otras propiedades. Este decorador tiene dos parámetros obligatorios:
STRATEGY
: toma valores de CONCAT
o HASH
. Necesita un parámetro adicional ALGORITHM
si se selecciona HASH
. El algoritmo por defecto es sha256
; también se admite md5
.
FORMAT
: toma una matriz de cadenas y valores de especificación que utilizará la estrategia.
@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;
-
Decoradores de métodos
@Validator(…params)
- Este decorador se aplica a los métodos de la clase de controlador principal. Este decorador es importante para analizar los argumentos, validar con todos los decoradores de propiedades y devolver un objeto modelo/tipo. Los métodos de controlador deben tener este decorador para que se pueda invocar. Toma varios modelos creados por el usuario o esquemas de yup como parámetros.
- El orden de los parámetros debe ser exactamente el mismo que el orden de los argumentos del método.
- En el siguiente ejemplo, la referencia del modelo
Supplier
se transfiere en el parámetro que corresponde al tipo asset
en el argumento de método. En tiempo de ejecución, el decorador analiza y convierte el argumento de método en un objeto JSON, lo valida en los validadores Supplier
y, después de una validación correcta, convierte el objeto JSON en un objeto Supplier
y lo asigna a la variable asset
. Entonces el método subyacente finalmente se llama.@Validator(Supplier)
public async createSupplier(asset: Supplier) {
return await this.Ctx.Model.save(asset);
}
- En el siguiente ejemplo, se transfieren varias referencias de activos, que corresponden a los tipos de objeto de los argumentos del método. Observe el orden de los parámetros.
@Validator(Supplier, Manufacturer)
public async createProducts(supplier: Supplier, manufacturer: Manufacturer) {
}
- Además de las referencias de activos, los objetos de esquema yup también se pueden transferir si los argumentos son de tipos básicos. En el siguiente ejemplo,
supplierId
y rawMaterialSupply
son del tipo string
y number
respectivamente, por lo que el esquema yup de tipo similar y orden correcto se transfiere al decorador. Observe el encadenamiento de métodos de esquema de 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 capacidad de persistencia transparente u ORM simplificado se captura en la clase Model
del objeto de contexto (Ctx
). Si el modelo llama a cualquiera de los siguientes métodos de SDK, acceda a ellos mediante this.Ctx.Model
.
Los métodos de SDK que implantan ORM son los siguientes:
save
: llama al método putState
de Hyperledger Fabric
get
: llama al método getState
de Hyperledger Fabric
update
: llama al método putState
de Hyperledger Fabric
delete
: llama al método deleteState
de Hyperledger Fabric
history
: llama al método getHistoryForKey
de Hyperledger Fabric
getByRange
: llama al método getStateByRange
de Hyperledger Fabric
getByRangeWithPagination
: llama al método getStateByRangeWithPagination
de Hyperledger Fabric
Para obtener más información, consulte:
Métodos de SDK.
Métodos de SDK
Note:
A partir de la versión 21.3.2, la forma de acceder a los métodos ORM ha cambiado. Ejecute el comando
ochain --version
para determinar la versión de Blockchain App Builder.
En versiones anteriores, los métodos ORM se heredaban de la clase OchainModel
. En la versión 21.3.2 y posteriores, los métodos se definen en la clase Model
del objeto de contexto (Ctx
). Para llamar a estos métodos, acceda a ellos mediante this.Ctx.Model.<method_name>
.
En el siguiente ejemplo, se muestra una llamada al método en versiones anteriores:
@Validator(Supplier)
public async createSupplier(asset: Supplier){
return await asset.save();
}
En el siguiente ejemplo, se muestra una llamada al método de la versión 21.3.2 y posteriores:
@Validator(Supplier)
public async createSupplier(asset: Supplier) {
return await this.Ctx.Model.save(asset);
}
Después de actualizar a la versión 21.3.2, realice este cambio en todos los proyectos de código de cadenas que haya creado con una versión anterior de Blockchain App Builder. Si utiliza el comando sync
para sincronizar los cambios entre el archivo de especificación y el código fuente, los cambios se llevan automáticamente al controlador para los métodos listos para usar. Aún debe resolver manualmente cualquier conflicto.
-
save
- El método
save
agrega los detalles de asset
del emisor de llamada al libro mayor.
- Este método llama a Hyperledger Fabric
putState
internamente. Todas las operaciones de canalización y canalización se llevan a cabo internamente. El método save
forma parte de la clase Model
, a la que se accede mediante el objeto Ctx
.
-
Ctx.Model.save(asset: <Instance of Asset Class> , extraMetadata?: any) : Promise <any>
- Parámetros:
extraMetadata : any
(opcional): permite guardar metadatos aparte del activo en el libro mayor.
- Devuelve:
Promise<any>
: devuelve una promesa al finalizar
- Por ejemplo:
@Validator(Supplier)
public async createSupplier(asset: Supplier) {
return await this.Ctx.Model.save(asset);
}
-
get
- El método
get
es un método de la clase OchainModel
que heredan las clases de modelo concretas de {chaincodeName}.model.ts
. El método get
forma parte de la clase Model
, a la que se accede mediante el objeto Ctx
.
- Si desea devolver cualquier activo mediante el
id
proporcionado, utilice el método de controlador genérico getAssetById
.
-
Ctx.Model.get(id: string, modelName: <Model Asset Class Name>) : Promise<asset>
- Parámetros:
id : string
: clave utilizada para guardar datos en el libro mayor.
modelName: <Model Asset Class Name>
: (opcional) clase de activo de modelo que se va a devolver.
- Devuelve:
Promise: <Asset>
: si no se proporciona el parámetro modelName
y existen datos en el libro mayor, se devuelve Promise<object>
. Si el parámetro id
no existe en el libro mayor, se devuelve un mensaje de error. Si se proporciona el parámetro modelName
, se devuelve un objeto de tipo <Asset>
. Aunque el libro mayor devuelva cualquier activo con el valor id
proporcionado, este método se encargará de convertir en el tipo Asset
del emisor de llamada. Si el activo devuelto del libro mayor no es del tipo Asset
, devuelve un error. Esta comprobación se realiza mediante la propiedad assetType
de solo lectura en la clase Model
.
- Por ejemplo:
@Validator(yup.string())
public async getSupplierById(id: string) {
const asset = await this.Ctx.Model.get(id, Supplier);
return asset;
}
En el ejemplo, asset
es del tipo Supplier
.
-
update
- El método
update
actualiza los detalles del emisor de llamada asset
en el libro mayor. Este método devuelve una promesa.
- Este método llama a Hyperledger Fabric
putState
internamente. Toda la canalización/cancelación se realiza internamente. El método update
forma parte de la clase Model
, a la que puede acceder mediante el objeto Ctx
.
-
Ctx.Model.update(asset: <Instance of Asset Class> , extraMetadata?: any) : Promise <any>
- Parámetros:
extraMetadata : any
(opcional): permite guardar metadatos aparte del activo en el libro mayor.
- Devuelve:
Promise<any>
: devuelve una promesa al finalizar
- Por ejemplo:
@Validator(Supplier)
public async updateSupplier(asset: Supplier) {
return await this.Ctx.Model.update(asset);
}
-
delete
- Esto suprime el activo del libro mayor proporcionado por
id
si existe. Este método llama al método deleteState
de Hyperledger Fabric internamente. El método delete
forma parte de la clase Model
, a la que puede acceder mediante el objeto Ctx
.
-
Ctx.Model.delete(id: string): Promise <any>
- Parámetros:
id : string
: clave utilizada para guardar datos en el libro mayor.
- Devuelve:
Promise <any>
: devuelve una promesa al finalizar.
- Por ejemplo:
@Validator(yup.string())
public async deleteSupplier(id: string) {
const result = await this.Ctx.Model.delete(id);
return result;
}
-
history
- El método
history
forma parte de la clase Model
, a la que puede acceder mediante el objeto Ctx
. Este método devuelve el historial de activos proporcionado por id
del libro mayor, si existe.
- Este método llama al método
getHistoryForKey
de Hyperledger Fabric internamente.
-
Ctx.Model.history(id: string): Promise <any>
- Parámetros:
id : string
: clave utilizada para guardar datos en el libro mayor.
- Devuelve:
Promise <any[]>
: devuelve cualquier [] al finalizar.
- Ejemplo
@Validator(yup.string())
public async getSupplierHistoryById(id: string) {
const result = await this.Ctx.Model.history(id);
return result;
}
- Ejemplo del historial de activos devuelto para
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
- El método
getByRange
es un método estático de la clase OchainModel
que heredan las clases Model
concretas de {chaincodeName}.model.ts
.
- De esta forma se devuelve una lista de activos entre el rango
startId
y endId
. Este método llama al método getStateByRange
de Hyperledger Fabric internamente.
- Si no se proporciona el parámetro
modelName
, el método devuelve Promise<Object [ ] >
. Si se proporciona el parámetro modelName
, el método maneja la conversión en el tipo Model
del emisor de llamada. En el siguiente ejemplo, la matriz de resultados es del tipo Supplier
. Si el activo devuelto del libro mayor no es del tipo Model
, no se incluirá en la lista. Esta comprobación se realiza mediante la propiedad assetType
de solo lectura en la clase Model
.
- Para devolver todos los activos entre el rango
startId
y endId
, utilice el método de controlador genérico getAssetsByRange
.
-
Ctx.Model.getByRange(startId: string, endId: string, modelName: <Asset Model Class Name> ): Promise <any>
- Parámetros:
startId : string
: clave de inicio del rango. Incluido en el rango.
endId : string
: clave de finalización del rango. Excluido del rango.
modelName: <Model Asset Class Name>
: (opcional) clase de activo de modelo que se va a devolver.
- Devuelve:
Promise< Asset[ ] >
: devuelve la matriz de <Asset>
al finalizar.
- Por ejemplo:
@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
- El método
getByRangeWithPagination
es un método estático de la clase OchainModel
que heredan las clases Model
concretas de {chaincodeName}.model.ts
.
- De esta forma se devuelve una lista de activos entre el rango
startId
y endId
. Este método llama al método getStateByRangeWithPagination
de Hyperledger Fabric internamente.
- Si no se proporciona el parámetro
modelName
, el método devuelve Promise<Object [ ] >
. Si se proporciona el parámetro modelName
, el método maneja la conversión en el tipo Model
del emisor de llamada. En el siguiente ejemplo, la matriz de resultados es del tipo Supplier
. Si el activo devuelto del libro mayor no es del tipo Model
, no se incluirá en la lista. Esta comprobación se realiza mediante la propiedad assetType
de solo lectura en la clase Model
.
- Para devolver todos los activos entre el rango
startId
y endId
, filtrados por tamaño de página y marcadores, utilice el método de controlador genérico 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[]>
- Parámetros:
startId : string
: clave de inicio del rango. Incluido en el rango.
endId : string
: clave de finalización del rango. Excluido del rango.
pageSize : number
: tamaño de página de la consulta.
bookmark : string
: marcador de la consulta. La salida comienza con este marcador.
modelName: <Model Asset Class Name>
: (opcional) clase de activo de modelo que se va a devolver.
- Devuelve:
Promise< Asset[ ] >
: devuelve la matriz de <Asset>
al finalizar.
-
getId
- Cuando el activo tiene una clave derivada como
Id
, puede utilizar este método para obtener un ID derivado. Este método devolverá un error si la clave derivada contiene %t
(registro de hora).
- Parámetros:
object
: el objeto debe contener todas las propiedades de las que depende la clave derivada.
- Devuelve:
- Devuelve la clave derivada como una cadena.
- Por ejemplo:
@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);
}
Para conocer los métodos de SDK de token, consulte los temas de Soporte de tokenización mediante el creador de aplicaciones de blockchain.
Controlador
La clase de controlador principal amplía OchainController
. Solo hay un controlador principal.
export class TSProjectController extends OchainController{
Puede crear cualquier número de clases, funciones o archivos, pero solo los métodos que se definen dentro de la clase de controlador principal son invocables desde el exterior, el resto de ellos están ocultos.
Métodos generados automáticamente
Como se describe en Archivo de Especificación de Entrada, puede especificar los métodos CRUD que desea generar en el archivo de especificación. Por ejemplo, si ha seleccionado generar todos los métodos, el resultado sería similar a:
@Validator(Supplier)
public async createSupplier(asset: Supplier) {
return await this.Ctx.Model.save(asset);
}
@Validator(yup.string())
public async getSupplierById(id: string) {
const asset = await this.Ctx.Model.get(id, Supplier);
return asset;
}
@Validator(Supplier)
public async updateSupplier(asset: Supplier) {
return await this.Ctx.Model.update(asset);
}
@Validator(yup.string())
public async deleteSupplier(id: string) {
const result = await this.Ctx.Model.delete(id);
return result;
}
@Validator(yup.string())
public async getSupplierHistoryById(id: string) {
const result = await this.Ctx.Model.history(id);
return result;
}
@Validator(yup.string(), yup.string())
public async getSupplierByRange(startId: string, endId: string) {
const result = await this.Ctx.Model.getByRange(startId, endId, Supplier);
return result;
}
Detalles de método de controlador
Aparte del modelo anterior, los métodos CRUD y no CRUD, Blockchain App Builder proporciona soporte listo para usar para otros métodos de Hyperledger Fabric de nuestro controlador. Estos métodos son:
getAssetById
getAssetsByRange
getAssetHistoryById
query
queryWithPagination
generateCompositeKey
getByCompositeKey
getTransactionId
getTransactionTimestamp
getChannelID
getCreator
getSignedProposal
getArgs
getStringArgs
getMspID
getNetworkStub
Note:
Estos métodos están disponibles con el contexto
this
en cualquier clase que amplíe la clase
OChainController
.
Por ejemplo:
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
- El método
getAssetById
devuelve el activo según id
proporcionado. Este es un método genérico y se utilizará para obtener activos de cualquier tipo.
this.getAssetById(id: string): Promise<byte[]>
- Parámetros:
id : string
: clave utilizada para guardar datos en el libro mayor.
- Devuelve:
Promise <byte [ ]>
: promesa de devoluciones al finalizar. Debe convertir byte[]
en un objeto.
-
getAssetsByRange
- El método
getAssetsByRange
devuelve todos los activos presentes de startId
(incluidos) a endId
(excluidos) independientemente de los tipos de activos. Este es un método genérico y se puede utilizar para obtener activos de cualquier tipo.
this.getAssetsByRange(startId: string, endId: string):
Promise<shim.Iterators.StateQueryIterator>
- Parámetros:
startId : string
: clave de inicio del rango. Incluido en el rango.
endId : string
: clave de finalización del rango. Excluido del rango.
- Devuelve:
Promise< shim.Iterators.StateQueryIterator>
: devuelve un iterador al finalizar. Tienes que iterar sobre ello.
-
getAssetHistoryById
- El método
getAssetHistoryById
devuelve el iterador de historial de un activo para id
proporcionado.
this.getAssetHistoryById(id: string):
Promise<shim.Iterators.HistoryQueryIterator>
- Parámetros:
id : string
: clave utilizada para guardar datos en el libro mayor.
- Devuelve:
Promise<shim.Iterators.HistoryQueryIterator>
: devuelve un iterador de consulta de historial. Tienes que iterar sobre ello.
-
query
- El método
query
ejecutará una consulta de base de datos SQL/Couch enriquecida en el libro mayor. Este método solo está soportado para el despliegue remoto en Oracle Blockchain Platform. Se trata de un método genérico para ejecutar consultas SQL en el libro mayor.
this.query(queryStr: string):
Promise<shim.Iterators.StateQueryIterator>
- Parámetros:
queryStr : string
: consulta SQL/Couch DB enriquecida.
- Devuelve:
Promise<shim.Iterators.StateQueryIterator>
: devuelve un iterador de consulta de estado. Tienes que iterar sobre ello.
-
queryWithPagination
- Este método ejecuta una consulta SQL/Couch DB enriquecida en el libro mayor, filtrada por tamaño de página y marcadores. Este método solo está soportado para el despliegue remoto en Oracle Blockchain Platform. Se trata de un método genérico para ejecutar consultas SQL en el libro mayor.
-
public async queryWithPagination(query: string, pageSize: number, bookmark?: string)
- Parámetros:
query : string
: consulta de base de datos SQL/Couch enriquecida.
pageSize : number
: tamaño de página de la consulta.
bookmark : string
: marcador de la consulta. La salida comienza con este marcador.
- Devuelve:
Promise<shim.Iterators.StateQueryIterator>
: devuelve un iterador de consulta de estado. Tienes que iterar sobre ello.
-
generateCompositeKey
- Este método genera y devuelve la clave compuesta basada en
indexName
y los atributos proporcionados en los argumentos.
this.generateCompositeKey(indexName: string, attributes:
string[]): string
- Parámetros:
indexName : string
: tipo de objeto de la clave utilizada para guardar datos en el libro mayor.
attributes: string[ ]
: atributos basados en la clave compuesta que se formará.
- Devuelve:
string
: devuelve una clave compuesta.
-
getByCompositeKey
- Este método devuelve el activo que coincide con la clave y la columna proporcionada en el parámetro de atributo al crear la clave compuesta. El parámetro
indexOfId
indica el índice de la clave devuelta en la matriz del método de stub SplitCompositeKey
. Internamente, este método llama a getStateByPartialCompositeKey
, splitCompositeKey
y getState
de Hyperledger Fabric.
this.getByCompositeKey(key: string, columns: string[],
indexOfId: number): Promise<any []>
- Parámetros:
key: string
: clave utilizada para guardar datos en el libro mayor.
columns: string[ ]
: se generan atributos basados en la clave.
indexOfId: number
: índice del atributo que se va a recuperar de la clave.
- Devuelve:
Promise< any [ ]
: devuelve cualquier []
al finalizar.
-
getTransactionId
- Devuelve el ID de transacción para la solicitud de llamada de código de cadenas actual. El ID de transacción identifica de manera única la transacción dentro del ámbito del canal.
this.getTransactionId(): string
- Parámetros:
- Devuelve:
string
: devuelve el ID de transacción para la solicitud de llamada de código de cadena actual.
-
getTransactionTimestamp
- Devuelve el registro de hora en que se creó la transacción. Esto se toma de la transacción
ChannelHeader
, por lo que indicará el registro de hora del cliente y tendrá el mismo valor en todos los avales.
this.getTransactionTimestamp(): Timestamp
- Parámetros:
id : string
: clave utilizada para guardar datos en el libro mayor.
- Devuelve:
Timestamp
: devuelve el registro de hora en el que se creó la transacción.
-
getChannelID
- Devuelve el ID de canal de la propuesta para que se procese el código de cadenas.
this.getChannelID(): string
- Parámetros:
- Devuelve:
string
: devuelve el ID de canal.
-
getCreator
- Devuelve el objeto de identidad del remitente de la llamada de código de cadenas.
this.getCreator(): shim.SerializedIdentity
- Parámetros:
- Devuelve:
shim.SerializedIdentity
: devuelve el objeto de identidad.
-
getSignedProposal
- Devuelve un objeto totalmente descodificado de la propuesta de transacción firmada.
this.getSignedProposal():
shim.ChaincodeProposal.SignedProposal
- Parámetros:
- Devuelve:
shim.ChaincodeProposal.SignedProposal
: devuelve el objeto descodificado de la propuesta de transacción firmada.
-
getArgs
- Devuelve los argumentos como matriz de cadenas de la solicitud de invocación de código de cadena.
this.getArgs(): string[]
- Parámetros:
- Devuelve:
string [ ]
: devuelve argumentos como matriz de cadenas de la llamada de código de cadenas.
-
getStringArgs
- Devuelve los argumentos como matriz de cadenas de la solicitud de invocación de código de cadena.
this.getStringArgs(): string[]
- Parámetros:
- Devuelve:
string [ ]
: devuelve argumentos como matriz de cadenas de la llamada de código de cadenas.
-
getMspID
- Devuelve el ID de MSP de la identidad que llama.
this.getMspID(): string
- Parámetros:
- Devuelve:
string
: devuelve el ID de MSP de la identidad que llama.
-
getNetworkStub
- El usuario puede obtener acceso al stub shim llamando al método
getNetworkStub
. Esto ayudará al usuario a escribir su propia implantación de trabajar directamente con los activos.
this.getNetworkStub(): shim.ChaincodeStub
- Parámetros:
- Devuelve:
shim.ChaincodeStub
: devuelve el stub de red de código de cadena.
-
invokeCrossChaincode
- Puede utilizar este método en un código de cadenas para llamar a una función en otro código de cadenas. Ambos códigos de cadenas deben estar instalados en el mismo par.
-
this.invokeCrossChaincode(chaincodeName: string, methodName: string, args: string[], channelName: string): Promise<any>
- Parámetros:
chaincodeName
: nombre del código de cadenas al que llamar.
methodName
: nombre del método al que se llama en el código de cadena.
arg
: argumento del método de llamada.
channelName
: canal donde se encuentra el código de cadena a llamar.
- Devuelve:
Promise<any>
: devuelve un objeto JSON que contiene tres campos:
isValid
: true
si la llamada es válida.
payload
: salida devuelta por la llamada entre cadenas, como un objeto JSON.
message
: mensaje devuelto por la llamada entre cadenas, en formato UTF-8.
-
invokeChaincode
- Puede utilizar este método en un código de cadenas para llamar a una función en otro código de cadenas. Ambos códigos de cadenas deben estar instalados en el mismo par.
-
this.invokeChaincode(chaincodeName: string, methodName: string, args: string[], channelName: string): Promise<any>
- Parámetros:
chaincodeName
: nombre del código de cadenas al que llamar.
methodName
: nombre del método al que se llama en el código de cadena.
arg
: argumento del método de llamada.
channelName
: canal donde se encuentra el código de cadena a llamar.
- Devuelve:
Promise<any>
: devuelve un objeto JSON que contiene tres campos:
isValid
: true
si la llamada es válida.
payload
: salida devuelta por la llamada entre cadenas, como un objeto JSON.
message
: mensaje devuelto por la llamada entre cadenas, en formato UTF-8.
Métodos personalizados
Los siguientes métodos personalizados se han generado a partir de nuestro archivo de especificación de ejemplo.
executeQuery
muestra cómo se puede llamar a consultas enriquecidas con SQL. Los validadores de los argumentos los agrega automáticamente Blockchain App Builder en función del tipo de argumento especificado en el archivo de especificación.
/**
*
* 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étodo de inicialización
Se proporciona un método init
personalizado en el controlador con una definición vacía. Si utiliza Blockchain App Builder para desplegar o actualizar, el método init
se llama automáticamente. Si despliega o actualiza desde la consola de Oracle Blockchain Platform en la plataforma Hyperledger Fabric v1.4.7, el método init
también se llama automáticamente. Si despliega o actualiza desde la consola de Oracle Blockchain Platform en la plataforma Hyperledger Fabric v2.x, debe llamar al método init
manualmente. Puede utilizar una herramienta de terceros como Postman para llamar al método init
manualmente.
export class TestTsProjectController extends OchainController {
public async init(params: any) {
return;
}
Si desea inicializar cualquier estado de aplicación en este punto, puede utilizar este método para hacerlo.