Andaime TypeScript Projeto Chaincode

O Blockchain App Builder pega a entrada do seu arquivo de especificação e gera um projeto de chaincode totalmente funcional. O projeto contém classes e funções geradas automaticamente, métodos CRUD, métodos SDK, validação automática de argumentos, marshalling/un-marshalling e recurso de persistência transparente (ORM).

Se o projeto chaincode usar a linguagem TypeScript, o projeto scaffolded conterá três arquivos principais:
  • main.ts
  • <chaincodeName>.model.ts
  • <chaincodeName>.controller.ts
Todas as bibliotecas necessárias são instaladas e empacotadas. O arquivo tsconfig.json contém a configuração necessária para compilar e criar o projeto TypeScript.

O arquivo <chaincodeName>.model.ts no subdiretório model contém várias definições de ativos e o arquivo <chaincodeName>.controller.ts no subdiretório controller contém o comportamento dos ativos e os métodos CRUD.

Os vários decoradores em model.ts e controller.ts fornecem suporte para recursos como validação automática de argumentos, marshalling/unmarshalling de argumentos, recurso de persistência transparente (ORM) e chamada de consultas avançadas.

Modelos

Cada classe de modelo estende a classe OchainModel, que tem uma propriedade adicional somente para leitura chamada assetType. Essa propriedade pode ser usada para extrair somente ativos desse tipo. Todas as alterações feitas nesta propriedade são ignoradas durante a criação e atualização do ativo. Por padrão, o valor da propriedade é <modelName>.

A classe OchainModel impõe comportamentos decoradores nas propriedades da classe.
@Id('supplierId')
export class Supplier extends OchainModel<Supplier> {
    public readonly assetType = 'supplier';
    @Mandatory()
    @Validate(yup.string()) 
    public supplierId: string;

Decoradores

Decoradores de classe
@Id(identifier)
Este decorador identifica a propriedade que define exclusivamente o ativo subjacente. Essa propriedade é usada como uma chave do registro, que representa esse ativo no estado do chaincode. Este decorador é aplicado automaticamente quando um novo projeto TypeScript é andaime. O argumento 'identificador' do decorador obtém o valor do arquivo de especificação.
@Id('supplierId')
export class Supplier extends OchainModel{
...
}
Decoradores de propriedades
Vários decoradores de propriedade podem ser usados. Os decoradores são resolvidos em ordem de cima para baixo.
@Mandatory()
Isso marca a propriedade a seguir como obrigatória, portanto, ela não pode ser ignorada ao salvar no razão. Se ignorado, ele lança um erro.
@Mandatory()
public supplierID: string;
@Default(param)
Essa propriedade pode ter um valor padrão. O valor padrão no argumento (param) é usado quando a propriedade é ignorada ao salvar no razão.
@Default('open for business')
@Validate(yup.string())
public remarks: string;
@Validate(param)
A propriedade a seguir é validada em relação ao esquema apresentado no parâmetro. O argumento param usa um esquema yup e muitos métodos de esquema podem ser encadeados juntos. Muitas validações complexas podem ser adicionadas. Consulte https://www.npmjs.com/package/yup para obter mais detalhes.
@Validate(yup.number().min(3))
public productsShipped: number;
@ReadOnly(param)
Este decorador de propriedade marca a propriedade subjacente como tendo um valor somente leitura. O valor no argumento, por exemplo, param, é usado quando a propriedade é salva no razão. Depois que o valor for definido, ele não poderá ser editado nem removido.
@ReadOnly('digicur')
public token_name: string;
@Embedded(PropertyClass)
Este decorador de propriedade marca a propriedade subjacente como um ativo incorporável. Ele toma a classe incorporável como um parâmetro. Essa classe deve estender a classe EmbeddedModel. Isso é validado pelo decorador.
Neste exemplo, Employee tem uma propriedade chamada address do tipo Address, que deve ser incorporada ao ativo Employee. Isso é indicado pelo 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;
}
Quando uma nova instância da classe Address é criada, todas as propriedades da classe Address são validadas automaticamente pelo decorador @Validate(). Observe que a classe Address não tem a propriedade assetType ou o decorador de classe @Id(). Este ativo e suas propriedades não são salvos no razão separadamente, mas são salvos junto com o ativo Employee. Ativos incorporados são classes definidas pelo usuário que funcionam como tipos de valor. A instância dessa classe só pode ser armazenada no razão como parte do objeto contido (ativos OchainModel). Todos os decoradores acima são aplicados automaticamente com base no arquivo de entrada durante o andaime do projeto.
@Derived(STRATEGY, ALGORITHM, FORMAT)
Este decorador é usado para definir o atributo derivado de outras propriedades. Este decorador tem dois parâmetros obrigatórios:
  • STRATEGY: usa valores de CONCAT ou HASH. Requer um parâmetro adicional ALGORITHM se HASH for selecionado. O algoritmo padrão é sha256; md5 também é suportado.
  • FORMAT: usa um array de strings de especificação e valores a serem usados pela estratégia.
@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 é aplicado em métodos da classe de controlador principal. Este decorador é importante para analisar os argumentos, validando contra todos os decoradores da propriedade e retornando um objeto modelo/tipo. Os métodos da Controladora devem ter esse decorador para serem invocáveis. Ele usa vários modelos criados pelo usuário ou esquemas yup como parâmetros.
A ordem dos parâmetros deve ser exatamente a mesma que a ordem dos argumentos no método.
No exemplo a seguir, a referência do modelo Supplier é informada no parâmetro que corresponde ao tipo asset no argumento do método. No runtime, o decorador analisa e converte o argumento de método em um objeto JSON, valida com base nos validadores Supplier e, após uma validação bem-sucedida, converte o objeto JSON em um objeto Supplier e o designa à variável asset. Em seguida, o método subjacente é finalmente chamado.
@Validator(Supplier)
public async createSupplier(asset: Supplier) {
    return await this.Ctx.Model.save(asset);
}
No exemplo a seguir, várias referências de ativo são passadas; elas correspondem aos tipos de objeto dos argumentos do método. Observe a ordem dos parâmetros.
@Validator(Supplier, Manufacturer)
public async createProducts(supplier: Supplier, manufacturer: Manufacturer) {
}
Além das referências de ativos, os objetos de esquema yup também poderão ser passados se os argumentos forem de tipos básicos. No exemplo a seguir, supplierId e rawMaterialSupply são do tipo string e number respectivamente, portanto, o esquema yup de tipo semelhante e ordem correta é passado para o decorador. Observe o encadeamento 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

O Recurso de Persistência Transparente ou o ORM simplificado é capturado na classe Model do objeto Contexto (Ctx). Se seu modelo chamar qualquer um dos métodos SDK a seguir, acesse-os usando this.Ctx.Model.

Os métodos SDK que implementam o ORM são os seguintes:
  • save – isso chama o método Hyperledger Fabric putState
  • get – isso chama o método Hyperledger Fabric getState
  • update – isso chama o método Hyperledger Fabric putState
  • delete – isso chama o método Hyperledger Fabric deleteState
  • history – isso chama o método Hyperledger Fabric getHistoryForKey
  • getByRange – isso chama o método Hyperledger Fabric getStateByRange
  • getByRangeWithPagination – isso chama o método Hyperledger Fabric getStateByRangeWithPagination
Para obter mais informações, consulte: Métodos do SDK.

Métodos SDK

Observação:

A partir da versão 21.3.2, a maneira de acessar os métodos do ORM foi alterada. Execute o comando ochain --version para determinar a versão do Blockchain App Builder.

Nas versões anteriores, os métodos ORM eram herdados da classe OchainModel. Na versão 21.3.2 e posterior, os métodos são definidos na classe Model do objeto Contexto (Ctx). Para chamar esses métodos, acesse-os usando this.Ctx.Model.<method_name>.

O exemplo a seguir mostra uma chamada de método nas versões anteriores:

@Validator(Supplier)
public async createSupplier(asset: Supplier){
    return await asset.save();
}

O exemplo a seguir mostra uma chamada de método da versão 21.3.2 e posterior:

@Validator(Supplier)
public async createSupplier(asset: Supplier) {
      return await this.Ctx.Model.save(asset);
}

Depois de fazer upgrade para a versão 21.3.2, faça essa alteração em todos os projetos de chaincode que você criou com uma versão anterior do Blockchain App Builder. Se você usar o comando sync para sincronizar as alterações entre o arquivo de especificação e o código-fonte, as alterações serão trazidas automaticamente ao controlador para os métodos prontos para uso. Você ainda precisa resolver manualmente quaisquer conflitos.

save
O método save adiciona os detalhes do chamador asset ao razão.
Esse método chama o Hyperledger Fabric putState internamente. Todo o marshalling/unmarshalling é tratado internamente. O método save faz parte da classe Model, que você acessa usando o objeto Ctx.
Ctx.Model.save(asset: <Instance of Asset Class> , extraMetadata?: any) : Promise <any>
Parâmetros:
  • extraMetadata : any (opcional) – Para salvar metadados separados do ativo no razão.
Retorna:
  • Promise<any> - Retorna uma promessa na conclusão
Exemplo:
@Validator(Supplier)
public async createSupplier(asset: Supplier) {
	return await this.Ctx.Model.save(asset);
}
get
O método get é um método da classe OchainModel que é herdado pelas classes de modelo concretas de {chaincodeName}.model.ts. O método get faz parte da classe Model, que você acessa usando o objeto Ctx.
Se você quiser retornar qualquer ativo pelo id fornecido, use o método do controlador genérico getAssetById.
Ctx.Model.get(id: string, modelName: <Model Asset Class Name>) : Promise<asset>
Parâmetros:
  • id : string – Chave usada para salvar dados no razão.
  • modelName: <Model Asset Class Name> – (Opcional) Modele a classe de ativo a ser retornada.
Retorna:
  • Promise: <Asset> - Se o parâmetro modelName não for fornecido e os dados existirem no razão, Promise<object> será retornado. Se o parâmetro id não existir no razão, uma mensagem de erro será retornada. Se o parâmetro modelName for fornecido, um objeto do tipo <Asset> será retornado. Mesmo que qualquer ativo com id fornecido seja retornado do razão, esse método cuidará da conversão no tipo Asset do chamador. Se o ativo retornado do razão não for do tipo Asset, ele lançará um erro. Essa verificação é feita pela propriedade assetType somente para leitura na classe Model.
Exemplo:
@Validator(yup.string())
public async getSupplierById(id: string) {
	const asset = await this.Ctx.Model.get(id, Supplier);
	return asset;
}
No exemplo, asset é do tipo Supplier.
update
O método update atualiza os detalhes do chamador asset no razão. Este método retorna uma promessa.
Esse método chama o Hyperledger Fabric putState internamente. Todo o marshalling/unmarshalling é tratado internamente. O método update faz parte da classe Model, que você pode acessar usando o objeto Ctx.
Ctx.Model.update(asset: <Instance of Asset Class> , extraMetadata?: any) : Promise <any>
Parâmetros:
  • extraMetadata : any (opcional) – Para salvar metadados separados do ativo no razão.
Retorna:
  • Promise<any> - Retorna uma promessa na conclusão
Exemplo:
@Validator(Supplier)
public async updateSupplier(asset: Supplier) {
	return await this.Ctx.Model.update(asset);
}
delete
Isso exclui o ativo do razão fornecido por id, se ele existir. Esse método chama internamente o método Hyperledger Fabric deleteState. O método delete faz parte da classe Model, que você pode acessar usando o objeto Ctx.
Ctx.Model.delete(id: string): Promise <any>
Parâmetros:
  • id : string – Chave usada para salvar dados no razão.
Retorna:
  • Promise <any> - Retorna uma promessa na conclusão.
Exemplo:
@Validator(yup.string())
public async deleteSupplier(id: string) {
	const result = await this.Ctx.Model.delete(id);
	return result;
}
history
O método history faz parte da classe Model, que você pode acessar usando o objeto Ctx. Este método retorna o histórico de ativos fornecido por id do razão, se ele existir.
Esse método chama internamente o método Hyperledger Fabric getHistoryForKey.
Ctx.Model.history(id: string): Promise <any>
Parâmetros:
  • id : string – Chave usada para salvar dados no razão.
Retorna:
  • Promise <any[]> - Retorna qualquer [] na conclusão.
Exemplo
@Validator(yup.string())
public async getSupplierHistoryById(id: string) {
	const result = await this.Ctx.Model.history(id);
	return result;
}
Exemplo do histórico de ativos retornados 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
O método getByRange é um método estático da classe OchainModel que é herdado pelas classes Model concretas de {chaincodeName}.model.ts.
Isso retorna uma lista de ativos entre o intervalo startId e endId. Esse método chama internamente o método Hyperledger Fabric getStateByRange.
Se o parâmetro modelName não for fornecido, o método retornará Promise<Object [ ] >. Se o parâmetro modelName for fornecido, o método tratará a conversão no tipo Model do chamador. No exemplo a seguir, o array de resultados é do tipo Supplier. Se o ativo retornado do razão não for do tipo Model, ele não será incluído na lista. Essa verificação é feita pela propriedade assetType somente para leitura na classe Model.
Para retornar todos os ativos entre o intervalo startId e endId, use o 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 – Chave inicial do intervalo. Incluído no intervalo.
  • endId : string – Chave final do intervalo. Excluído do intervalo.
  • modelName: <Model Asset Class Name> – (Opcional) Modele a classe de ativo a ser retornada.
Retorna:
  • Promise< Asset[ ] > - Retorna o array de <Asset> na conclusão.
Exemplo:
@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
O método getByRangeWithPagination é um método estático da classe OchainModel que é herdado pelas classes Model concretas de {chaincodeName}.model.ts.
Isso retorna uma lista de ativos entre o intervalo startId e endId. Esse método chama internamente o método Hyperledger Fabric getStateByRangeWithPagination.
Se o parâmetro modelName não for fornecido, o método retornará Promise<Object [ ] >. Se o parâmetro modelName for fornecido, o método tratará a conversão no tipo Model do chamador. No exemplo a seguir, o array de resultados é do tipo Supplier. Se o ativo retornado do razão não for do tipo Model, ele não será incluído na lista. Essa verificação é feita pela propriedade assetType somente para leitura na classe Model.
Para retornar todos os ativos entre o intervalo startId e endId, filtrados por tamanho de página e marcadores, use o 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 – Chave inicial do intervalo. Incluído no intervalo.
  • endId : string – Chave final do intervalo. Excluído do intervalo.
  • pageSize : number - O tamanho da página da consulta.
  • bookmark : string - O marcador da consulta. A saída começa com este marcador.
  • modelName: <Model Asset Class Name> – (Opcional) Modele a classe de ativo a ser retornada.
Retorna:
  • Promise< Asset[ ] > - Retorna o array de <Asset> na conclusão.
getId
Quando o ativo tiver uma chave derivada como Id, você poderá usar esse método para obter um ID derivado. Este método retornará um erro se a chave derivada contiver %t (timestamp).
Parâmetros:
  • object – O objeto deve conter todas as propriedades das quais a chave derivada é dependente.
Retorna:
  • Retorna a chave derivada como uma string.
Exemplo:
@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 métodos SDK de token, consulte os tópicos em Suporte à Tokenização Usando o Blockchain App Builder.

Controlador

A classe do controlador principal estende OchainController. Há apenas um controlador principal.

export class TSProjectController extends OchainController{

Você pode criar qualquer número de classes, funções ou arquivos, mas apenas os métodos que são definidos dentro da classe controlador principal são invocáveis de fora, o resto deles estão ocultos.

Métodos Gerados Automaticamente

Conforme descrito em Arquivo de Especificação de Entrada, você pode especificar quais métodos CRUD deseja gerar no arquivo de especificação. Por exemplo, se você selecionou gerar todos os métodos, o resultado seria semelhante 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;
}

Detalhes do Método da Controladora

Além dos métodos CRUD e não CRUD do modelo acima, o Blockchain App Builder fornece suporte pronto para uso para outros métodos do Hyperledger Fabric do nosso controlador. Esses métodos são:
  • getAssetById
  • getAssetsByRange
  • getAssetHistoryById
  • query
  • queryWithPagination
  • generateCompositeKey
  • getByCompositeKey
  • getTransactionId
  • getTransactionTimestamp
  • getChannelID
  • getCreator
  • getSignedProposal
  • getArgs
  • getStringArgs
  • getMspID
  • getNetworkStub

Observação:

Esses métodos estão disponíveis com o contexto this em qualquer classe que estenda a classe OChainController.
Por exemplo:
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
O método getAssetById retorna o ativo com base em id fornecido. Este é um método genérico e ser usado para obter ativos de qualquer tipo.
this.getAssetById(id: string): Promise<byte[]>
Parâmetros:
  • id : string – Chave usada para salvar dados no razão.
Retorna:
  • Promise <byte [ ]> - Retorna a promessa na conclusão. Você precisa converter byte[] em um objeto.
getAssetsByRange
O método getAssetsByRange retorna todos os ativos presentes de startId (inclusive) para endId (exclusive), independentemente dos tipos de ativos. Este é um método genérico e pode ser usado para obter ativos de qualquer tipo.
this.getAssetsByRange(startId: string, endId: string):
Promise<shim.Iterators.StateQueryIterator>
Parâmetros:
  • startId : string – Chave inicial do intervalo. Incluído no intervalo.
  • endId : string – Chave final do intervalo. Excluído do intervalo.
Retorna:
  • Promise< shim.Iterators.StateQueryIterator> - Retorna um iterador na conclusão. Você tem que iterar sobre isso.
getAssetHistoryById
O método getAssetHistoryById retorna o iterador do histórico de um ativo para id fornecido.
this.getAssetHistoryById(id: string):
Promise<shim.Iterators.HistoryQueryIterator>
Parâmetros:
  • id : string – Chave usada para salvar dados no razão.
Retorna:
  • Promise<shim.Iterators.HistoryQueryIterator> - Retorna um iterador de consulta de histórico. Você tem que iterar sobre isso.
query
O método query executará uma consulta Rich SQL/Couch DB no razão. Esse método só é suportado para implantação remota no Oracle Blockchain Platform. Este é um método genérico para executar consultas SQL no razão.
this.query(queryStr: string):
Promise<shim.Iterators.StateQueryIterator>
Parâmetros:
  • queryStr : string - Consulta Rich SQL/Couch DB.
Retorna:
  • Promise<shim.Iterators.StateQueryIterator> - Retorna um iterador de consulta de estado. Você tem que iterar sobre isso.
queryWithPagination
Este método executa uma consulta Rich SQL/Couch DB no razão, filtrada por tamanho de página e marcadores. Esse método só é suportado para implantação remota no Oracle Blockchain Platform. Este é um método genérico para executar consultas SQL no razão.
public async queryWithPagination(query: string, pageSize: number, bookmark?: string)
Parâmetros:
  • query : string - Consulta de banco de dados Rich SQL/Couch.
  • pageSize : number - O tamanho da página da consulta.
  • bookmark : string - O marcador da consulta. A saída começa com este marcador.
Retorna:
  • Promise<shim.Iterators.StateQueryIterator> - Retorna um iterador de consulta de estado. Você tem que iterar sobre isso.
generateCompositeKey
Esse método gera e retorna a chave composta com base em indexName e nos atributos fornecidos nos argumentos.
this.generateCompositeKey(indexName: string, attributes:
string[]): string
Parâmetros:
  • indexName : string - Tipo de Objeto da chave usada para salvar dados no razão.
  • attributes: string[ ] - Atributos baseados em qual chave composta será formada.
Retorna:
  • string - Retorna uma chave composta.
getByCompositeKey
Esse método retorna o ativo que corresponde à chave e à coluna fornecidas no parâmetro de atributo ao criar a chave composta. O parâmetro indexOfId indica o índice da chave retornada no array do método stub SplitCompositeKey. Internamente, esse método chama getStateByPartialCompositeKey, splitCompositeKey e getState do Hyperledger Fabric.
this.getByCompositeKey(key: string, columns: string[],
indexOfId: number): Promise<any []>
Parâmetros:
  • key: string – Chave usada para salvar dados no razão.
  • columns: string[ ] - Os atributos baseados na chave são gerados.
  • indexOfId: number - Índice do atributo a ser recuperado da Chave.
Retorna:
  • Promise< any [ ] - Retorna qualquer [] na conclusão.
getTransactionId
Retorna o ID da transação para a solicitação de chamada de chaincode atual. O ID da transação identifica exclusivamente a transação dentro do escopo do canal.
this.getTransactionId(): string
Parâmetros:
  • nenhuma
Retorna:
  • string - Retorna o ID da transação para a solicitação de chamada de chaincode atual.
getTransactionTimestamp
Retorna o timestamp quando a transação foi criada. Isso é obtido da transação ChannelHeader, portanto, indicará o timestamp do cliente e terá o mesmo valor em todos os endossadores.
this.getTransactionTimestamp(): Timestamp
Parâmetros:
  • id : string – Chave usada para salvar dados no razão.
Retorna:
  • Timestamp - Retorna o timestamp quando a transação foi criada.
getChannelID
Retorna o ID do canal para a proposta de chaincode a ser processada.
this.getChannelID(): string
Parâmetros:
  • nenhuma
Retorna:
  • string - Retorna o ID do canal.
getCreator
Retorna o objeto de identidade do remetente da chamada de chaincode.
this.getCreator(): shim.SerializedIdentity
Parâmetros:
  • nenhuma
Retorna:
  • shim.SerializedIdentity - Retorna o objeto de identidade.
getSignedProposal
Retorna um objeto totalmente decodificado da proposta de transação assinada.
this.getSignedProposal():
shim.ChaincodeProposal.SignedProposal
Parâmetros:
  • nenhuma
Retorna:
  • shim.ChaincodeProposal.SignedProposal - Retorna o objeto decodificado da proposta de transação assinada.
getArgs
Retorna os argumentos como array de strings da solicitação de chamada de chaincode.
this.getArgs(): string[]
Parâmetros:
  • nenhuma
Retorna:
  • string [ ] - Retorna argumentos como array de strings da chamada de chaincode.
getStringArgs
Retorna os argumentos como array de strings da solicitação de chamada de chaincode.
this.getStringArgs(): string[]
Parâmetros:
  • nenhuma
Retorna:
  • string [ ] - Retorna argumentos como array de strings da chamada de chaincode.
getMspID
Retorna o ID MSP da identidade de chamada.
this.getMspID(): string
Parâmetros:
  • nenhuma
Retorna:
  • string - Retorna o ID do MSP da identidade de chamada.
getNetworkStub
O usuário pode obter acesso ao shim stub chamando o método getNetworkStub. Isso ajudará o usuário a escrever sua própria implementação de trabalhar diretamente com os ativos.
this.getNetworkStub(): shim.ChaincodeStub
Parâmetros:
  • nenhuma
Retorna:
  • shim.ChaincodeStub - Retorna stub de rede de chaincode.
invokeCrossChaincode
Você pode usar esse método em um chaincode para chamar uma função em outro chaincode. Ambos os chaincodes devem ser instalados no mesmo par.
this.invokeCrossChaincode(chaincodeName: string, methodName: string, args: string[], channelName: string): Promise<any>
Parâmetros:
  • chaincodeName – O nome do chaincode a ser chamado.
  • methodName - O nome do método a ser chamado no chaincode.
  • arg - O argumento do método de chamada.
  • channelName - O canal onde o chaincode a ser chamado está localizado.
Retorna:
  • Promise<any> - Retorna um objeto JSON que contém três campos:
    • isValid - true se a chamada for válida.
    • payload - A saída retornada pela chamada de código de cadeia cruzada, como um objeto JSON.
    • message - A mensagem retornada pela chamada de código de cadeia cruzada, no formato UTF-8.
invokeChaincode
Você pode usar esse método em um chaincode para chamar uma função em outro chaincode. Ambos os chaincodes devem ser instalados no mesmo par.
this.invokeChaincode(chaincodeName: string, methodName: string, args: string[], channelName: string): Promise<any>
Parâmetros:
  • chaincodeName – O nome do chaincode a ser chamado.
  • methodName - O nome do método a ser chamado no chaincode.
  • arg - O argumento do método de chamada.
  • channelName - O canal onde o chaincode a ser chamado está localizado.
Retorna:
  • Promise<any> - Retorna um objeto JSON que contém três campos:
    • isValid - true se a chamada for válida.
    • payload - A saída retornada pela chamada de código de cadeia cruzada, como um objeto JSON.
    • message - A mensagem retornada pela chamada de código de cadeia cruzada, no formato UTF-8.

Métodos Personalizados

Os métodos personalizados a seguir foram gerados a partir do arquivo de especificação de exemplo.

O executeQuery mostra como as consultas ricas em SQL podem ser chamadas. Os validadores contra os argumentos são adicionados automaticamente pelo Blockchain App Builder com base no tipo de argumento especificado no arquivo de especificação.


/**
*
*	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 inicialização

Um método init personalizado é fornecido no controlador com uma definição vazia. Se você usar o Blockchain App Builder para implantar ou fazer upgrade, o método init será chamado automaticamente. Se você implantar ou fazer upgrade da console do Oracle Blockchain Platform na plataforma Hyperledger Fabric v1.4.7, o método init também será chamado automaticamente. Se você implantar ou fazer upgrade da console do Oracle Blockchain Platform na plataforma Hyperledger Fabric v2.x, deverá chamar o método init manualmente. Você pode usar uma ferramenta de terceiros, como Postman, para chamar o método init manualmente.

export class TestTsProjectController extends OchainController {
    public async init(params: any) { 
        return;
}

Se quiser inicializar qualquer estado de aplicativo nesse ponto, você poderá usar esse método para fazer isso.