Proyecto de código de cadenas TypeScript andamio

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:
  • ninguno
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:
  • ninguno
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:
  • ninguno
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:
  • ninguno
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:
  • ninguno
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:
  • ninguno
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:
  • ninguno
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:
  • ninguno
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.