Proyecto de código de cadena TypeScript Andamio

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:
  • 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 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:
  • ninguno
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:
  • 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 llamada de código de cadenas.
this.getArgs(): string[]
Parámetros:
  • ninguno
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:
  • ninguno
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:
  • 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 trabajo 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 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.