Proyecto de código de cadena TypeScript andamio

Blockchain App Builder toma la entrada de su archivo de especificación y genera un proyecto de código de cadena 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 chaincode utiliza el lenguaje TypeScript, el proyecto andamiaje 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 decoradores de model.ts y controller.ts admiten funciones como la validación automática de argumentos, la canalización/anulación de 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 propiedad por defecto es <modelName>.

La clase OchainModel aplica los comportamientos del 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 en el estado del código de cadenas. Este decorador se aplica automáticamente cuando se andamiaja 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()
Este decorador marca la siguiente propiedad como obligatoria, por lo que no se puede omitir al guardar en el libro mayor. Si se omite, se devuelve un error.
@Mandatory()
public supplierID: string;
@Default(param)
Este decorador indica que la siguiente propiedad tiene un valor por defecto. 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 propiedad que sigue a este decorador se valida con respecto al esquema especificado por el parámetro. El argumento param toma un esquema yup y se pueden encadenar varios métodos de esquema para agregar validaciones complejas. Para obtener más información, consulte https://www.npmjs.com/package/yup.
@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. Después de definir 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. Este requisito es validado por el decorador.
En el siguiente ejemplo, la clase Employee tiene una propiedad denominada address de tipo Address, que se embeberá en el activo Employee. Esto lo indica 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 la contabilidad 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 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 se andamiaja 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 CONCAT o HASH. Si se especifica HASH, se necesita el parámetro adicional ALGORITHM. El algoritmo por defecto es sha256; también se soporta 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 de modelo/tipo. Los métodos de controlador deben tener este decorador para poder invocarlo. 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 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, 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. 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; se corresponden con los tipos de objetos 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 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 los 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 o el ORM simplificado se capturan 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 siguientes métodos SDK implantan ORM:
  • 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>.

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 del emisor de llamada asset al libro mayor.
Este método llama a Hyperledger Fabric putState internamente. Todas las operaciones de canalización/anulación de canalización se gestionan 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): se utiliza 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 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.
Para devolver cualquier activo de un determinado id, 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) modele la clase de activo para devolver.
Devuelve:
  • Promise: <Asset>: si no se proporciona el parámetro modelName y los datos existen en la contabilidad, 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 cualquier activo con id determinado se devuelva desde la contabilidad, este método gestionará la conversión en el tipo de emisor de llamada Asset. Si el activo devuelto de la contabilidad no es del tipo Asset, el método 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 la contabilidad. Este método devuelve una promesa.
Este método llama a Hyperledger Fabric putState internamente. Todas las operaciones de canalización/anulación de canalización se gestionan 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): se utiliza 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 desde el 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 devueltos 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.
Este método 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 de emisor de llamada Model. En el siguiente ejemplo, la matriz de resultados es del tipo Supplier. Si el activo devuelto de la contabilidad 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, que se incluye en el rango.
  • endId : string: clave de finalización del rango, que se excluye del rango.
  • modelName: <Model Asset Class Name>: (opcional) modele la clase de activo para 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.
Este método 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 de emisor de llamada Model. En el siguiente ejemplo, la matriz de resultados es del tipo Supplier. Si el activo devuelto de la contabilidad 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, que se incluye en el rango.
  • endId : string: clave de finalización del rango, que se excluye del rango.
  • pageSize : number: tamaño de página de la consulta.
  • bookmark : string: marcador de la consulta. La salida comienza desde este marcador.
  • modelName: <Model Asset Class Name>: (opcional) modele la clase de activo para 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 devuelve 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 ver los métodos de SDK de token, consulte los temas de Soporte de tokenización mediante Blockchain App Builder.

Controlador

La clase de controlador principal amplía la clase 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 definidos en 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 Input Specification File (Archivo de especificación de entrada), puede especificar qué métodos CRUD generar en el archivo de especificación. Por ejemplo, si ha especificado generar todos los métodos, el resultado sería similar al siguiente código:

@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

Además de los métodos CRUD y no CRUD del modelo anterior, Blockchain App Builder proporciona soporte listo para usar de nuestro controlador para los siguientes métodos de Hyperledger Fabric:
  • 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 basado en un ID especificado. Se trata de un método genérico que se puede 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. Se trata de un método genérico que 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, que se incluye en el rango.
  • endId : string: clave de finalización del rango, que se excluye 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 de historial de un activo para un ID especificado.
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 ejecuta una consulta de base de datos SQL/Couch enriquecida en el libro mayor. Este método solo está soportado para despliegues remotos en Oracle Blockchain Platform. Se trata de un método genérico para ejecutar consultas SQL en la contabilidad.
this.query(queryStr: string):
Promise<shim.Iterators.StateQueryIterator>
Parámetros:
  • queryStr : string: consulta de base de datos SQL/couch 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 SQL/Couch DB enriquecida en el libro mayor, filtrada por tamaño de página y marcadores. Este método solo está soportado para despliegues remotos en Oracle Blockchain Platform. Se trata de un método genérico para ejecutar consultas SQL en la contabilidad.
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 desde 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á una 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 una 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 los métodos 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[ ]: atributos basados en los que se genera una clave.
  • indexOfId: number: índice del atributo que se recuperará de la clave.
Devuelve:
  • Promise< any [ ]: devuelve cualquier valor [] 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 en el á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 cuando se creó la transacción. Esto se toma de la transacción ChannelHeader, por lo tanto, indicará el registro de hora del cliente y tendrá el mismo valor en todos los avalistas.
this.getTransactionTimestamp(): Timestamp
Parámetros:
  • id : string: clave utilizada para guardar datos en el libro mayor.
Devuelve:
  • Timestamp: devuelve el registro de hora cuando se creó la transacción.
getChannelID
Devuelve el ID de canal para la propuesta de código de cadena que se va a procesar.
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 cadena.
this.getArgs(): string[]
Parámetros:
  • ninguno
Devuelve:
  • string [ ]: devuelve argumentos como matriz de cadenas de la llamada al código de cadena.
getStringArgs
Devuelve los argumentos como matriz de cadenas de la solicitud de llamada de código de cadena.
this.getStringArgs(): string[]
Parámetros:
  • ninguno
Devuelve:
  • string [ ]: devuelve argumentos como matriz de cadenas de la llamada al código de cadena.
getMspID
Devuelve el ID de MSP de la identidad de llamada.
this.getMspID(): string
Parámetros:
  • ninguno
Devuelve:
  • string: devuelve el ID de MSP de la identidad de llamada.
getNetworkStub
Puede acceder al stub shim llamando a este método. Esto puede ayudarle 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
Este método se puede utilizar en un código de cadenas para llamar a una función en otro código de cadenas. Ambos códigos de cadena 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 cadena que se va a llamar.
  • methodName: nombre del método al que llamar en el código de cadena.
  • arg: argumento del método de llamada.
  • channelName: canal en el que 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 de código de cadenas cruzadas, como un objeto JSON.
    • message: mensaje devuelto por la llamada de código de cadena cruzada, en formato UTF-8.
invokeChaincode
Este método llama a una función en otro código de cadena. Ambos códigos de cadena 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 cadena que se va a llamar.
  • methodName: nombre del método al que llamar en el código de cadena.
  • arg: argumento del método de llamada.
  • channelName: canal en el que 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 de código de cadenas cruzadas, como un objeto JSON.
    • message: mensaje devuelto por la llamada de código de cadena cruzada, en formato UTF-8.

Métodos personalizados

Los siguientes métodos personalizados se generaron a partir de nuestro archivo de especificación de ejemplo.

El método executeQuery muestra cómo se pueden llamar a las consultas enriquecidas SQL. Blockchain App Builder agrega automáticamente los validadores de los argumentos 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

En el controlador se proporciona un método init personalizado con una definición vacía. Si utiliza Blockchain App Builder para desplegar o actualizar, se llama automáticamente al método init. Si despliega o actualiza desde la consola de Oracle Blockchain Platform, 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;
}

A continuación, puede utilizar este método para inicializar cualquier estado de aplicación.