Testar seu Chaincode Usando a CLI

Se o seu chaincode estiver sendo executado em uma rede, você poderá testar qualquer um dos métodos gerados. Além disso, se você optar por criar o método executeQuery durante o desenvolvimento do seu chaincode, poderá executar consultas rich SQL se seu chaincode for implantado em uma rede do Oracle Blockchain Platform.

Teste seu Chaincode em uma rede local do Hyperledger Fabric

Depois que seu projeto chaincode estiver em execução em uma rede local, você poderá testá-lo.

Abra um novo shell e navegue até o diretório do projeto para interagir com seus chaincodes. Depois que um chaincode é instalado e implantado, você pode enviar transações para as funções dentro de seu chaincode usando os comandos ochain invoke e ochain query.

ochain invoke

Uso: ochain invoke <methodName> <methodArguments>

Os seguintes argumentos e opções estão disponíveis para o comando ochain invoke:
ochain invoke -h 
Usage: invoke [options] <methodName> [...args] 
Invoke a Chaincode transaction

Arguments :
    <methodName>  (required) Name of chaincode method to invoke.
    [...args]     (optional) Chaincode method input parameters if any. Parameters should be space separated strings/JSON strings for objects.

Options:
    -h, --help                output command usage information
    -D, --debug               enable debug logging
    -P, --project <path>      (optional) Path to Chaincode project to deploy. If not specified, it defaults to current directory.
    -c, --channel <channel>   (optional) Blockchain Channel to deploy chaincode to. If not specified, it defaults to the 'default' channel.
    -u, --username <username> (optional, if -r option is applied) A user name that has install chaincode privileges. Contact your administrator for more details.
    -s, --sign <password>     (optional) Password to authenticate user.
    -r, --url <url>           (required) Restproxy Url of the remote OBP instance.
    For example,
    OBP Cloud Services: https://test-xyz-abc.blockchain.ocp.oraclecloud.com:7443/restproxy
    OBP Enterprise Edition: https://restproxy.test-xyz-abc.blockchain.platform.com:443/restproxy

Examples:
$> ochain invoke <method>
(without chaincode initial arguments)  
$> ochain invoke <method> '{"manufacturerId":"m01","rawMaterialAvailable":9,"productsAvailable":4,"completionDate":"05-26-2020"}'
(for a single parameter)
$> ochain invoke <method> 's01' 's10'
$> ochain invoke <method> 's01' '{"manufacturerId":"m01","rawMaterialAvailable":9,"productsAvailable":4,"completionDate":"05-26-2020"}'
(for multiple parameters)
$> ochain invoke <method> 's01' 's10' -r <REST proxy URL of the remote instance> -u <username> -s <password>
(for remote invocation)

Linux e macOS

Se um método pegar um argumento, insira-o como uma string, conforme mostrado nos seguintes exemplos:
ochain invoke createSupplier
'{"supplierId":"s01","rawMaterialAvailable":5,"license":"valid supplier","expiryDate":"2020-05-30","active":true}'
ochain invoke getSupplierDetails 's01'
'{"supplierId":"s01","rawMaterialAvailable":5,"license":"valid supplier","expiryDate":"2020-05-30","active":true}'
Se um método utilizar mais de um argumento, os argumentos deverão ser separados por um espaço. Por exemplo:
ochain invoke getSupplierByRange 's01' 's03'
Você deve usar um formato diferente para especificar ativos incorporados em seu chaincode, como um ativo de funcionário que usa um ativo de endereço incorporado, conforme mostrado nos seguintes exemplos:
name: employee
  properties:
     name: employeeId
     type: string
     mandatory: true
     id: true

     name: firstName
     type: string
     validate: max(30)
     mandatory: true

     name: lastName
     type: string
     validate: max(30)
     mandatory: true

     name: age
     type: number
     validate: positive(),min(18)

     name: address
     type: address
name: address

type: embedded

properties:
   name: street
   type: string

   name: city
   type: string

   name: state
   type: string

   name: country
   type: string
Para esses ativos incorporados, você pode usar um formato semelhante ao seguinte para chamar o chaincode:
ochain invoke createEmployee '{"employeeID":"e01", "firstName":"John", "lastName":"Doe", 
"age":35, "address":{"street":"Elm Ave", "city":"LA", "state":"California", "country":"US"}}'

Microsoft Windows

O prompt de comando do Windows não aceita aspas simples ('). Portanto, todos os argumentos devem ser especificados entre aspas duplas ("). Qualquer argumento que contenha aspas duplas deve ser escapado, conforme mostrado no exemplo a seguir.

ochain invoke createSupplier
"{\"supplierId\":\"s01\",\"rawMaterialAvailable\":5,\"license\":\"valid
supplier\",\"expiryDate\":\"2020-05-30\",\"active\":true}"
Se o método utilizar mais de um argumento, ele deverá ser separado por um espaço. Por exemplo:
ochain invoke getSupplierByRange "s01" "s03"
Se você tiver ativos incorporados em seu chaincode, como um ativo de funcionário que usa um ativo de endereço incorporado, conforme mostrado anteriormente, poderá usar um formato semelhante ao seguinte para chamar o chaincode:
ochain invoke createEmployee "{\"employeeID\":\"e01\", \"firstName\":\"John\", 
\"lastName\":\"Doe\", \"age\":35, \"address\":{\"street\":\"Elm Ave\", \"city\":\"LA\", 
\"state\":\"California\", \"country\":\"US\"}}"

Validações

Os argumentos do método são validados em relação às validações especificadas no arquivo de especificação. Se qualquer validação falhar, os erros serão listados na saída.

Quando o chaincode for chamado com sucesso, ele exibirá um log semelhante ao seguinte texto:
========== Started Invoke Chaincode ==========
[2020-06-23T18:37:54.563] [INFO] default - Successfully sent Proposal and received ProposalResponse
[2020-06-23T18:37:56.619] [INFO default - The chaincode invoke transaction has been committed on peer localhost:7051
[2020-06-23T18:37:56.619] [INFO] default - The chaincode invoke transaction was valid.
[2020-06-23T18:37:56.620] [INFO default - Successfully sent transaction to the orderer.
[2020-06-23T18:37:56.620] [INFO] default - Successfully invoked method "createSupplier" on chaincode "TSProject" on channel "mychannel"
[2020-06-23T18:37:56.620] [INFO] default - 
========== Finished Invoke Chaincode ==========

O Comando ochain query

Uso: ochain query <methodName> <methodArguments>

Os seguintes argumentos e opções estão disponíveis para o comando ochain query:
ochain query -h 
Usage: query [options] <methodName> [...args] 
Invoke a Chaincode Query.

Arguments :
    <methodName>     (required) Name of chaincode method to invoke.
    [...args]        (optional) Chaincode method input parameters if any. Parameters should be space separated strings/JSON strings for objects.

Options:
    -h, --help                output command usage information
    -D, --debug               enable debug logging
    -P, --project <path>      (optional) Path to Chaincode project to deploy. If not specified, it defaults to current directory.
    -c, --channel <channel>   (optional) Blockchain Channel to deploy chaincode to. If not specified, it defaults to the 'default' channel.
    -u, --username <username> (optional, if -r option is applied) A user name that has install chaincode privileges. Contact your administrator for more details.
    -s, --sign <password>     (optional) Password to authenticate user.
    -r, --url <url>           (required) Restproxy Url of the remote OBP instance.
    For example,
    OBP Cloud Services: https://test-xyz-abc.blockchain.ocp.oraclecloud.com:7443/restproxy  
    OBP Enterprise Edition: https://restproxy.test-xyz-abc.blockchain.platform.com:443/restproxy

Examples:
$> ochain query <method>
(without chaincode initial arguments)
$> ochain query <method> s01
(for a single parameter)
$> ochain query <method> 's01' 's10'
$> ochain query <method> 's01' '{"manufacturerId":"m01"}'
(for multiple parameters)
$> ochain query <method> 's01' 's10' -r <REST proxy URL of the remote instance> -u <username> -s <password>
(for remote query)
O comando ochain query segue as mesmas regras de especificação de <methodName> e <methodArguments> do comando ochain invoke.
  • Em macOS e Linux, aspas simples podem ser usadas e não há necessidade de escape de aspas dentro de argumentos.
  • No Microsoft Windows, todos os argumentos devem estar entre aspas duplas e qualquer aspas dentro de um argumento deve ter escape.

Testando Vários Usuários de Token Localmente

Para testar um projeto de token com vários usuários localmente, você pode usar a propriedade tokenUser para alterar o chamador de cada transação. Cada projeto de chaincode scaffolded inclui um arquivo .ochain.json, que armazena metadados do chaincode. Você altera o chamador atualizando o valor do campo tokenUser no arquivo .ochain.json.

{
  "name": "digiCurrCC",
  "description": "Chaincode package for digiCurrCC",
  "chaincodeName": "digiCurrCC",
  "chaincodeType": "node",
  "configFileLocation": "/Users/user1/token.yml",
  "appBuilderVersion": "21.2.3",
  "nodeVersion": "v12.18.1",
  "tokenUser": "admin"
}

Quando um projeto é scaffolded, a propriedade tokenUser é definida como o usuário admin padrão da rede local. Para alterar o chamador de uma transação, altere a propriedade tokenUser para corresponder à propriedade user_id que foi definida quando a conta foi criada quando o método createAccount (TypeScript) ou CreateAccount (Go) foi chamado.

Instalação e Implantação Automáticas Após Atualização

Sempre que você atualizar seu chaincode, as alterações serão compiladas, instaladas e implantadas automaticamente quando forem implantadas em uma rede local. Não há necessidade de derrubar ou trazer a rede local novamente. Todos os projetos serão compilados e implantados automaticamente em cada alteração.

Teste seu Chaincode em uma Rede Remota do Oracle Blockchain Platform

Depois que seu projeto chaincode tiver sido implantado com sucesso na sua rede remota do Oracle Blockchain Platform, você poderá testá-lo.

Você testa o chaincode em execução em uma rede remota similar a testá-lo em uma rede local, conforme descrito em Testar seu Chaincode em uma Rede Local do Hyperledger Fabric.

Se você implantou seu chaincode manualmente, em vez de usar o Blockchain App Builder, chame a função init manualmente antes de testar seu chaincode.

Você pode usar os mesmos comandos ochain invoke e ochain query para executar todas as transações de método em uma rede remota do Oracle Blockchain Platform Cloud ou Enterprise Edition; tudo o que for suportado na rede local também será suportado na rede remota. Informe o URL do proxy REST da instância remota do Oracle Blockchain Platform (-r), as opções de nome de usuário (-u) e senha (-s) para o comando. Certifique-se de especificar a porta de proxy REST correta, que geralmente é 7443 ou 443.

Exemplo

ochain invoke createSupplier 
'{"supplierId":"s01","rawMaterialAvailable":5,"license":"valid 
supplier","expiryDate":"2020-05-30","active":true}' -r 
[https://%3cblockchain-restproxy-url%3e:7443/]https://<blockchain-proxy-url>:7443/ 
-u idcqa -s password

Testando Projetos de Token em uma Rede Remota do Oracle Blockchain Platform

Você pode testar projetos de chaincode que funcionam com tokens usando o Blockchain App Builder, o proxy REST do Oracle Blockchain Platform ou o SDK do Hyperledger Fabric.

Construtor de Aplicativos Blockchain

Você pode usar a CLI do Blockchain App Builder para concluir transações com vários usuários para testar códigos de cadeia de token.

Para testar com vários usuários, altere os parâmetros de autorização (opções de nome de usuário e senha) nos comandos de chamada e consulta.

Proxy REST do Oracle Blockchain Platform

Você pode usar o proxy REST no Oracle Blockchain Platform para executar seu código de cadeia de token em uma rede remota do Oracle Blockchain Platform. Use qualquer cliente de proxy REST, como Cliente REST Postman, para testar seu projeto chaincode.

Para testar vários usuários, altere os parâmetros de autorização (nome de usuário e senha) no seu cliente REST ou conecte-se a outra instância do Oracle Blockchain Platform.

Executar Berkeley DB SQL Rich Queries

Se você optar por criar o método executeQuery durante o desenvolvimento do seu chaincode, poderá executar consultas rich SQL se seu chaincode for implantado em uma rede do Oracle Blockchain Platform.

Se você especificou executeQuery na seção customMethods do arquivo de especificação, um método executeQuery correspondente será criado no controlador.

Arquivo de especificação:
customMethods:
    - executeQuery
    - "fetchRawMaterial(supplierid: string, rawMaterialSupply: number)"
    - "getRawMaterialFromSupplier(manufacturerId: string, supplierld: string, rawMaterialSupply: number)"
    - "createProducts(manufacturerId: string, rawMaterialConsumed: number, productsCreated: number)"
    - "sendProductsToDistribution()"
Arquivo de controle:
**
*
* 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 this.query(query);
    return result;
    }

Você pode chamar esse método para executar consultas avançadas de SQL do BD Berkeley na rede do Oracle Blockchain Platform usando as opções -r, -u e -s para especificar o URL do proxy REST remoto do Oracle Blockchain Platform, o nome do usuário e a senha, respectivamente.

Exemplo de consulta para TypeScript:
ochain query  executeQuery "SELECT key, valueJson FROM <STATE> WHERE 
json_extract(valueJson, '$.rawMaterialAvailable') = 4" -r 
[https://%3cblockchain-restproxy-url%3e:7443/]https://<blockchain-restproxy-url>:7443/ 
-u idcqa -s password
Exemplo de consulta para Go:
ochain query  executeQuery "SELECT key, valueJson FROM <STATE> WHERE 
json_extract(valueJson, \"$.rawMaterialAvailable\") = 4" -r 
[https://%3cblockchain-restproxy-url%3e:7443/]https://<blockchain-restproxy-url>:7443/ 
-u idcqa -s password

A consulta SQL inteira é usada no argumento para que você possa fazer alterações na consulta rapidamente. Certifique-se de especificar a porta correta para o proxy REST, que geralmente é 7443 ou 443. A sintaxe é diferente para o chaincode TypeScript e Go. Como mostrado no exemplo anterior, a consulta Go usa aspas duplas para os parâmetros de consulta, em vez de aspas simples. As aspas duplas devem ser precedidas por caracteres de barra invertida.