Blockchain App Builder toma la entrada de su archivo de especificaciones y genera un proyecto de código de cadenas completamente funcional. El proyecto contiene clases y funciones generadas automáticamente, métodos CRUD, métodos SDK, validación automática de argumentos, marshalling/un-marshalling y capacidad de persistencia transparente (ORM).
Si el proyecto de código de cadenas utiliza el idioma TypeScript, el proyecto andamio contiene tres archivos principales:
main.ts
<chaincodeName>.model.ts
<chaincodeName>.controller.ts
Se instalan y empaquetan todas las bibliotecas necesarias. 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 canalizaciones 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 de solo lectura adicional 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 predeterminado de la propiedad es <modelName>
.
La clase
OchainModel
aplica comportamientos de decorador en 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 con el estado del código de cadenas. Este decorador se aplica automáticamente cuando se monta un nuevo proyecto TypeScript. El argumento 'identifier' 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 de arriba a abajo.
@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 respecto al 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 que tiene 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 incrustable. 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 va a embeber con el activo Employee
. Esto se denota con 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 clases @Id()
. Este activo y sus propiedades no se guardan en el libro mayor por separado, sino junto con el activo Employee
. Los activos embebidos son clases definidas por el usuario que funcionan como tipos de valor. La instancia de esta clase solo se puede almacenar en el libro mayor como parte del objeto contenedor (activos OchainModel
). Todos los decoradores anteriores se aplican automáticamente en función del archivo de entrada mientras 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 los 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 en todos los decoradores de propiedades y devolver un objeto de tipo/modelo. Los métodos de controlador deben tener este decorador para que se pueda invocar. Toma varios modelos creados por el usuario o esquemas 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 de 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, valida con los validadores Supplier
y, después de la validación correcta, convierte el objeto JSON en un objeto Supplier
y lo asigna a la variable asset
. Finalmente se llama al método subyacente.@Validator(Supplier)
public async createSupplier(asset: Supplier) {
return await this.Ctx.Model.save(asset);
}
- En el siguiente ejemplo, se transfieren varias referencias de activos; 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, también se pueden transferir objetos de esquema yup si los argumentos son de tipos básicos. En el siguiente ejemplo,
supplierId
y rawMaterialSupply
son de 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 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 Context (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 implementan 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 Context (Ctx
). Para llamar a estos métodos, acceda a ellos mediante this.Ctx.Model.<method_name>
.
El siguiente ejemplo muestra una llamada de 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 desde 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 los conflictos.
-
save
- El método
save
agrega los detalles del emisor de llamada asset
al libro mayor.
- Este método llama internamente a Hyperledger Fabric
putState
. Todos los marshalling/unmarshalling se manejan 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): para 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 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
especificado, 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 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 id
proporcionado, este método se encargará de convertirlo 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 la realiza 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 internamente a Hyperledger Fabric
putState
. Todos los marshalling/unmarshalling se manejan 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): para 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
- De esta forma, se suprime el activo de la contabilidad proporcionada por
id
si existe. Este método llama internamente al método deleteState
de Hyperledger Fabric. 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 internamente al método
getHistoryForKey
de Hyperledger Fabric.
-
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
.
- Esto devuelve una lista de activos entre el rango
startId
y endId
. Este método llama internamente al método getStateByRange
de Hyperledger Fabric.
- 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 la realiza 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 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
.
- Esto devuelve una lista de activos entre el rango
startId
y endId
. Este método llama internamente al método getStateByRangeWithPagination
de Hyperledger Fabric.
- 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 la realiza 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 a partir de este marcador.
modelName: <Model Asset Class Name>
: (opcional) clase de activo de modelo que se 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 sólo los métodos definidos dentro de la clase de controlador principal se pueden invocar 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 de los métodos CRUD y no CRUD del modelo anterior, 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 un 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 [ ]>
: devuelve la promesa al finalizar. Debe convertir byte[]
en un objeto.
-
getAssetsByRange
- El método
getAssetsByRange
devuelve todos los activos presentes de startId
(inclusive) a endId
(exclusive) 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 ella.
-
getAssetHistoryById
- El método
getAssetHistoryById
devuelve el iterador del 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 ella.
-
query
- El método
query
ejecutará una consulta enriquecida de SQL/Couch DB en el libro mayor. Este método solo está soportado para el despliegue remoto en Oracle Blockchain Platform. Este es 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 ella.
-
queryWithPagination
- Este método ejecuta una consulta enriquecida de SQL/Couch DB 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. Este es 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 SQL/Couch DB enriquecida.
pageSize : number
: tamaño de página de la consulta.
bookmark : string
: marcador de la consulta. La salida comienza a partir de este marcador.
- Devuelve:
Promise<shim.Iterators.StateQueryIterator>
: devuelve un iterador de consulta de estado. Tienes que iterar sobre ella.
-
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 los que se formará la clave compuesta.
- Devuelve:
string
: devuelve una clave compuesta.
-
getByCompositeKey
- Este método devuelve el activo que coincide con la clave y la columna proporcionadas 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 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 cadena 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 de la creación de 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 endosadores.
this.getTransactionTimestamp(): Timestamp
- Parámetros:
id : string
: clave utilizada para guardar datos en el libro mayor.
- Devuelve:
Timestamp
: devuelve el registro de hora de la creación de 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 al código de cadena.
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 llamada de código de cadenas.
this.getArgs(): string[]
- Parámetros:
- Devuelve:
string [ ]
: devuelve argumentos como matriz de cadenas de la llamada al código de cadenas.
-
getStringArgs
- Devuelve los argumentos como matriz de cadenas de la solicitud de llamada de código de cadenas.
this.getStringArgs(): string[]
- Parámetros:
- Devuelve:
string [ ]
: devuelve argumentos como matriz de cadenas de la llamada al 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 trabajo 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 se deben instalar 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 se va a llamar.
methodName
: nombre del método al que se llama en el código de cadenas.
arg
: argumento del método de llamada.
channelName
: canal donde se encuentra el código de cadena al que 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 cross-chaincode, como objeto JSON.
message
: mensaje devuelto por la llamada cross-chaincode, 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 se deben instalar 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 se va a llamar.
methodName
: nombre del método al que se llama en el código de cadenas.
arg
: argumento del método de llamada.
channelName
: canal donde se encuentra el código de cadena al que 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 cross-chaincode, como objeto JSON.
message
: mensaje devuelto por la llamada cross-chaincode, 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 pueden llamar las consultas enriquecidas SQL. Blockchain App Builder agrega automáticamente los validadores de los argumentos según el 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 implementa 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.