O Blockchain App Builder pega a entrada do seu arquivo de especificação e gera um projeto de chaincode andaime 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 capacidade de persistência transparente (ORM).
Se o projeto chaincode usar o idioma 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 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 somente leitura adicional chamada assetType
. Esta propriedade pode ser usada para extrair somente ativos deste tipo. Todas as alterações nesta propriedade são ignoradas durante a criação e atualização do ativo. O valor da propriedade por padrão é <modelName>
.
A classe
OchainModel
impõe comportamentos do decorador 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 é scaffolded. O argumento
identifier
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 propriedades podem ser usados. Os decoradores são resolvidos de cima para baixo.
@Mandatory()
- Este decorador marca a propriedade a seguir como obrigatória, de modo que não possa ser ignorada ao salvar no razão. Se ignorado, um erro é gerado.
@Mandatory()
public supplierID: string;
@Default(param)
- Este decorador indica que a propriedade a seguir tem um valor padrão. O valor padrão no argumento (
param
) é usado quando a propriedade é ignorada durante o salvamento no razão.@Default('open for business')
@Validate(yup.string())
public remarks: string;
@Validate(param)
- A propriedade que segue este decorador é validada em relação ao esquema especificado pelo parâmetro. O argumento
param
usa um esquema yup, e vários métodos de esquema podem ser encadeados para adicionar validações complexas. Para obter mais informações, consulte https://www.npmjs.com/package/yup.@Validate(yup.number().min(3))
public productsShipped: number;
@ReadOnly(param)
- Este decorador de propriedades 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. Após o valor ser definido, ele não poderá ser editado nem removido.
@ReadOnly('digicur')
public token_name: string;
@Embedded(PropertyClass)
- Este decorador de propriedades marca a propriedade subjacente como um ativo incorporável. Ele usa a classe incorporável como um parâmetro. Essa classe deve estender a classe
EmbeddedModel
. Este requisito é validado pelo decorador.
- No exemplo a seguir, a classe
Employee
tem uma propriedade chamada address
do tipo Address
, que será incorporada no 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
. Os 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 que a contém (ativos OchainModel
). Todos os decoradores acima são aplicados automaticamente com base no arquivo de entrada enquanto andaime o 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
: Obtém valores de CONCAT
ou HASH
. Se o parâmetro HASH
for especificado, o parâmetro adicional ALGORITHM
será obrigatório. O algoritmo padrão é sha256
; md5
também é suportado.
FORMAT
: Usa um array de strings e valores de especificação para 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, validar contra todos os decoradores de propriedades e retornar um objeto de modelo/tipo. Os métodos do controlador devem ter este decorador para ser invocável. 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
é passada no parâmetro que corresponde ao tipo asset
no argumento de método. No runtime, o decorador analisa e converte o argumento de método em um objeto JSON, valida em relação aos validadores Supplier
e, após a validação bem-sucedida, converte o objeto JSON em um objeto Supplier
e o atribui à variável asset
. Então 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 ativos são passadas; elas correspondem aos tipos de objeto dos argumentos do método. Anote 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 podem 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 ORM simplificado é capturado na classe Model
do objeto de Contexto (Ctx
). Se seu modelo chamar qualquer um dos métodos SDK a seguir, acesse-os usando this.Ctx.Model
.
Os seguintes métodos SDK implementam o ORM:
- O
save
chama o método putState
do Hyperledger Fabric.
- O
get
chama o método getState
do Hyperledger Fabric.
- O
update
chama o método putState
do Hyperledger Fabric.
- O
delete
chama o método deleteState
do Hyperledger Fabric.
- O
history
chama o método getHistoryForKey
do Hyperledger Fabric.
- O
getByRange
chama o método getStateByRange
do Hyperledger Fabric.
- O
getByRangeWithPagination
chama o método getStateByRangeWithPagination
do Hyperledger Fabric.
Para obter mais informações, consulte:
Métodos de SDK.
Métodos SDK
Observação:
A partir da versão 21.3.2, a maneira de acessar os métodos ORM mudou. 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 de 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 em 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 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 de asset
do chamador 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) – Usada 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 de classe OchainModel
, que é herdado pelas classes de modelo concreto de {chaincodeName}.model.ts
. O método get
faz parte da classe Model
, que você acessa usando o objeto Ctx
.
- Para retornar qualquer ativo de um determinado
id
, 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) Modelar classe de ativo a ser devolvida.
- 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 tratará a conversão no tipo Asset
do chamador. Se o ativo retornado do razão não for do tipo Asset
, o método gerará 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 de asset
do chamador 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) – Usada 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 excluirá o ativo do razão fornecido por
id
se ele existir. Esse método chama o método deleteState
do Hyperledger Fabric internamente. 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 o método
getHistoryForKey
do Hyperledger Fabric internamente.
-
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
.
- Este método retorna uma lista de ativos entre o intervalo
startId
e endId
. Esse método chama o método getStateByRange
do Hyperledger Fabric internamente.
- 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 a faixa
startId
e endId
, use o método do 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, que é incluída no intervalo.
endId : string
– Chave final do intervalo, que é excluída do intervalo.
modelName: <Model Asset Class Name>
– (Opcional) Modelar classe de ativo a ser devolvida.
- 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
.
- Este método retorna uma lista de ativos entre o intervalo
startId
e endId
. Esse método chama o método getStateByRangeWithPagination
do Hyperledger Fabric internamente.
- 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 a faixa
startId
e endId
, filtrados por tamanho de página e marcadores, use o método do 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, que é incluída no intervalo.
endId : string
– Chave final do intervalo, que é excluída do intervalo.
pageSize : number
- O tamanho da página da consulta.
bookmark : string
- O marcador da consulta. Esta saída começa neste marcador.
modelName: <Model Asset Class Name>
– (Opcional) Modelar classe de ativo a ser devolvida.
- 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
(carimbo de data/hora).
- 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 de token SDK, consulte os tópicos em Suporte à Tokenização Usando o Blockchain App Builder.
Controladora
A classe do controlador principal estende a classe 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 definidos na classe do controlador principal podem ser invocados de fora; o resto deles está oculto.
Métodos Gerados Automaticamente
Conforme descrito em Arquivo de Especificação de Entrada, você pode especificar quais métodos CRUD serão gerados no arquivo de especificação. Por exemplo, se você especificou para gerar todos os métodos, o resultado será semelhante ao seguinte 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;
}
Detalhes do Método da Controladora
Além dos métodos CRUD e não CRUD do modelo anterior, o Blockchain App Builder fornece suporte pronto para uso do nosso controlador para os seguintes métodos do Hyperledger Fabric:
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 um ativo com base em um ID especificado. Este é um método genérico e pode 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 promessa na conclusão. Você precisa converter byte[]
em um objeto.
-
getAssetsByRange
- O método
getAssetsByRange
retorna todos os ativos presentes de startId
(inclusive) a 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, que é incluída no intervalo.
endId : string
– Chave final do intervalo, que é excluída 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 de histórico de um ativo para um ID especificado.
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
executa uma consulta avançada do SQL/Couch DB no razão. Esse método só é suportado para implantações remotas 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 rica do SQL/Couch DB sobre o razão, filtrada por tamanho de página e marcadores. Esse método só é suportado para implantações remotas 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 Rich SQL/Couch DB.
pageSize : number
- O tamanho da página da consulta.
bookmark : string
- O marcador da consulta. Esta saída começa neste 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 no
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 com base nos quais uma chave composta será formada.
- Retorna:
string
- Retorna uma chave composta.
-
getByCompositeKey
- Este método retorna o ativo que corresponde à chave e à coluna fornecidas no parâmetro de atributo ao criar uma chave composta. O parâmetro
indexOfId
indica o índice da chave retornada no array do método stub SplitCompositeKey
. Internamente, esse método chama os métodos 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[ ]
- Atributos com base nos quais uma chave é gerada.
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 no escopo do canal.
this.getTransactionId(): string
- Parâmetros:
- 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 é retirado 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 em que a transação foi criada.
-
getChannelID
- Retorna o ID do canal para a proposta de chaincode a ser processada.
this.getChannelID(): string
- Parâmetros:
- 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:
- 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:
- 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:
- Retorna:
string [ ]
- Retorna argumentos como array de strings da chamada chaincode.
-
getStringArgs
- Retorna os argumentos como array de strings da solicitação de chamada de chaincode.
this.getStringArgs(): string[]
- Parâmetros:
- Retorna:
string [ ]
- Retorna argumentos como array de strings da chamada chaincode.
-
getMspID
- Retorna o ID do MSP da identidade de chamada.
this.getMspID(): string
- Parâmetros:
- Retorna:
string
- Retorna o ID do MSP da identidade de chamada.
-
getNetworkStub
- Você pode acessar o stub de shim chamando esse método. Isso pode ajudá-lo a criar sua própria implementação de trabalho diretamente com os ativos.
this.getNetworkStub(): shim.ChaincodeStub
- Parâmetros:
- Retorna:
shim.ChaincodeStub
- Retorna stub de rede 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 cross-chaincode, como um objeto JSON.
message
- A mensagem retornada pela chamada de código de cadeia cruzada, no formato UTF-8.
-
invokeChaincode
- Este método chama 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 cross-chaincode, 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 do nosso arquivo de especificação de exemplo.
O método executeQuery
mostra como as consultas rich SQL podem ser chamadas. Os validadores contra os argumentos são adicionados automaticamente pelo Blockchain App Builder com base no tipo do 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 Init
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, 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;
}
Em seguida, você pode usar esse método para inicializar qualquer estado do aplicativo.