Testar Seu Chaincode Usando a CLI

Se o seu chaincode estiver em execução 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 ricas em SQL se seu chaincode for implantado em uma rede do Oracle Blockchain Platform.

Testar seu Chaincode em uma Rede Local do Hyperledger Fabric

Depois que seu projeto de 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 do seu chaincode usando os comandos ochain invoke e ochain query.

ochain invoke

Uso: ochain invoke <methodName> <methodArguments>

A seguir estão argumentos e opções usados pelo comando ochain invoke:
my-mac:TSProject myname$ 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) URL of the remote OBP instance. Example: https://<blockchain-instance-url>:7443/

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 <url of the remote OBP instance> -u <username> -s <password>
(for remote invocation)

Mac OSX e Linux

Se o método pegar um argumento, insira-o como uma string. Por exemplo:
ochain invoke createSupplier
'{"supplierId":"s01","rawMaterialAvailable":5,"license":"valid supplier","expiryDate":"2020-05-30","active":true}'
Outro exemplo:
ochain invoke getSupplierDetails 's01'
'{"supplierId":"s01","rawMaterialAvailable":5,"license":"valid supplier","expiryDate":"2020-05-30","active":true}'
Se o método usar 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:
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
Você usaria algo 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"}}'

Janelas

Como o prompt de comando do Windows não aceita aspas simples ('), todos os argumentos precisam ser mantidos entre aspas duplas ("). Qualquer argumento que contenha aspas duplas deve ter escape.

Por exemplo:
ochain invoke createSupplier
"{\"supplierId\":\"s01\",\"rawMaterialAvailable\":5,\"license\":\"valid
supplier\",\"expiryDate\":\"2020-05-30\",\"active\":true}"
Se o método usar 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 acima, poderá usar algo 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 alguma validação falhar, os erros serão listados na saída.

Quando ele chama com sucesso, deve exibir um log semelhante a:
========== 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 ==========

ochain query

Uso: ochain query <methodName> <methodArguments>

Veja a seguir os argumentos e as opções tomadas pelo comando ochain query:
my-mac:TSProject myname$ 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) URL of the remote OBP instance. Example: https://<blockchain-instance-url>:7443/

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 <url of the remote OBP instance> -u <username> -s <password>
(for remote query)
O comando ochain query segue as mesmas regras de transmissão <methodName> e <methodArguments> que ochain invoke.
  • No Mac OSX e no Linux, aspas simples podem ser usadas e não há necessidade de escape de aspas dentro de argumentos.
  • No Windows, todos os argumentos devem estar entre aspas duplas e qualquer aspa 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 com andaime 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 ele for implantado em uma rede local. Não há necessidade de remover ou abrir 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 de chaincode tiver sido implantado com sucesso na sua rede remota do Oracle Blockchain Platform, você poderá testá-lo 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 é suportado na rede local também é suportado na rede remota. Informe o URL das opções de instância remota do Oracle Blockchain Platform (-r), nome de usuário (-u) e senha (-s) para o comando.

Exemplo

ochain invoke createSupplier 
'{"supplierId":"s01","rawMaterialAvailable":5,"license":"valid 
supplier","expiryDate":"2020-05-30","active":true}' -r 
[https://%3cblockchain-instance-url%3e:7443/]https://<blockchain-instance-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.

Blockchain App Builder

Você pode usar a CLI do Blockchain App Builder para chamar 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 Proxy REST, como o Cliente REST Postman, para testar seu projeto de chaincode.

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

Executar Consultas Berkeley DB SQL Rich

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

Se você tiver usado 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 ricas em SQL do BD Berkeley na rede do Oracle Blockchain Platform, garantindo que você use as opções -r, -u e -s para especificar o URL, o nome de usuário e a senha da instância remota do Oracle Blockchain Platform, respectivamente.

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

Como toda a consulta SQL é feita no argumento, você pode fazer alterações na consulta em tempo real. A sintaxe é diferente para TypeScript e para o chaincode Go. Conforme 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 barras invertidas.