quarta-feira, 17 de maio de 2017

Blockchain chaincode para desenvolvedores Java – parte 01b

Por Steve Perry
Em 08/05/2017 no site iMasters

Fazer deploy e executar um exemplo de chaincode Java
Agora que definiu e iniciou a sua rede blockchain local e construiu e instalou o cliente JAR Java shim no seu repositório Maven local, está pronto para criar, registrar e invocar transações num dos exemplos de chaincode Java que é enviado com o Hyperledger Fabric que você baixou anteriormente.
Aqui estão os passos que você irá seguir:
  1. Crie o exemplo usando Gradle.
  2. Registre o exemplo com a rede de pares de validação, executando um script que é criado para você pela compilação Gradle.
  3. Implante o exemplo para a rede local blockchain usando SoapUI.
  4. Invoque transações no chaincode exemplo usando SoapUI.
  5. Crie o exemplo

1. Crie o exemplo usando Gradle

Navegue até o diretório $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/java/Example.
Em seguida, inicie a compilação Gradle através da linha de comando utilizando este comando:
1gradle -b build.gradle build
Você deve obter um resultado como este:
1$ cd GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/java/Example
2$ gradle -b build.gradle build
3Starting a Gradle Daemon (subsequent builds will be faster)
4:examples:chaincode:java:Example:compileJava
5:examples:chaincode:java:Example:processResources UP-TO-DATE
6:examples:chaincode:java:Example:classes
7:examples:chaincode:java:Example:jar
8:examples:chaincode:java:Example:startScripts
9:examples:chaincode:java:Example:distTar
10:examples:chaincode:java:Example:distZip
11:examples:chaincode:java:Example:assemble
12:examples:chaincode:java:Example:compileTestJava UP-TO-DATE
13:examples:chaincode:java:Example:processTestResources UP-TO-DATE
14:examples:chaincode:java:Example:testClasses UP-TO-DATE
15:examples:chaincode:java:Example:test UP-TO-DATE
16:examples:chaincode:java:Example:check UP-TO-DATE
17:examples:chaincode:java:Example:build
18:examples:chaincode:java:Example:copyToLib
19  
20BUILD SUCCESSFUL
21  
22Total time: 6.935 secs
A compilação cria uma distribuição autônoma que está localizada dentro do diretório compilar/distribuições em duas formas: um arquivo TAR e um arquivo ZIP e cada um desses arquivos contém tudo o que você precisa para executar o chaincode, incluindo um script para conduzi-lo chamado Example.
O chaincode Example agora está pronto para ser registrado com a rede blockchain local.

2. Registre o exemplo

Certifique-se de que a sua rede blockchain local está em execução. Se não estiver, você precisará iniciá-la. Consulte a seção “Inicie a rede blockchain” se precisar de uma atualização.
Se você ainda não estiver lá, navegue para $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/java/Example.
Em seguida, extraia Example.zip (ou Example.tar) no diretório compilar/distribuições:
1$ cd $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/java/Example
2$ cd build/distributions/
3$ unzip Example.zip
4Archive:  Example.zip
5  inflating: Example/lib/chaincode.jar 
6  inflating: Example/lib/grpc-all-0.13.2.jar 
7  inflating: Example/lib/commons-cli-1.3.1.jar 
8  inflating: Example/lib/shim-client-1.0.jar 
9  inflating: Example/lib/grpc-netty-0.13.2.jar 
10  inflating: Example/lib/grpc-auth-0.13.2.jar 
11  inflating: Example/lib/grpc-protobuf-nano-0.13.2.jar 
12  inflating: Example/lib/grpc-core-0.13.2.jar 
13  inflating: Example/lib/grpc-protobuf-0.13.2.jar 
14  inflating: Example/lib/grpc-okhttp-0.13.2.jar 
15  inflating: Example/lib/grpc-stub-0.13.2.jar 
16  inflating: Example/lib/protobuf-java-3.0.0.jar 
17  inflating: Example/lib/netty-tcnative-boringssl-static-1.1.33.Fork21-osx-x86_64.jar 
18  inflating: Example/lib/netty-codec-http2-4.1.0.CR3.jar 
19  inflating: Example/lib/google-auth-library-oauth2-http-0.3.0.jar 
20  inflating: Example/lib/guava-18.0.jar 
21  inflating: Example/lib/protobuf-javanano-3.0.0-alpha-5.jar 
22  inflating: Example/lib/jsr305-3.0.0.jar 
23  inflating: Example/lib/okio-1.6.0.jar 
24  inflating: Example/lib/okhttp-2.5.0.jar 
25  inflating: Example/lib/netty-codec-http-4.1.0.CR3.jar 
26  inflating: Example/lib/netty-handler-4.1.0.CR3.jar 
27  inflating: Example/lib/google-auth-library-credentials-0.3.0.jar 
28  inflating: Example/lib/google-http-client-1.19.0.jar 
29  inflating: Example/lib/google-http-client-jackson2-1.19.0.jar 
30  inflating: Example/lib/netty-codec-4.1.0.CR3.jar 
31  inflating: Example/lib/netty-buffer-4.1.0.CR3.jar 
32  inflating: Example/lib/netty-transport-4.1.0.CR3.jar 
33  inflating: Example/lib/httpclient-4.0.1.jar 
34  inflating: Example/lib/jackson-core-2.1.3.jar 
35  inflating: Example/lib/netty-common-4.1.0.CR3.jar 
36  inflating: Example/lib/netty-resolver-4.1.0.CR3.jar 
37  inflating: Example/lib/httpcore-4.0.1.jar 
38  inflating: Example/lib/commons-logging-1.1.1.jar 
39  inflating: Example/lib/commons-codec-1.3.jar 
40  inflating: Example/bin/Example    
41  inflating: Example/bin/Example.bat
“Por que tantos arquivos?”, você pode se perguntar. A distribuição contém tudo o que você precisa para executar o chaincode autonomamente (em seu próprio processo), juntamente com todos os JARs dependentes.
Para registrar o chaincode exemplo, dentro da pasta compilar/distribuições, execute o seguinte script:
1./Example/bin/Example
Isso executa um processo autônomo que registra o chaincode exemplo com a rede local blockchain. Você deve ver o resultado da janela do terminal assim:
1$ ./Example/bin/Example
2Hello world! starting [Ljava.lang.String;@7ef20235
3Feb 22, 2017 10:05:08 AM example.Example main
4INFO: starting
5Feb 22, 2017 10:05:08 AM org.hyperledger.java.shim.ChaincodeBase newPeerClientConnection
6INFO: Inside newPeerCLientConnection
7Feb 22, 2017 10:05:08 AM io.grpc.internal.TransportSet$1 call
8INFO: Created transport io.grpc.netty.NettyClientTransport@3dd7b80b(/127.0.0.1:7051) for /127.0.0.1:7051
9Feb 22, 2017 10:05:14 AM io.grpc.internal.TransportSet$TransportListener transportReady
10INFO: Transport io.grpc.netty.NettyClientTransport@3dd7b80b(/127.0.0.1:7051) for /127.0.0.1:7051 is ready
Dê uma olhada no console para sua rede local blockchain e você deve ver linhas de resultado que se parecem com isso:
1.
2.
3vp0_1         | 16:05:14.048 [chaincode] HandleChaincodeStream -> DEBU 06d Current context deadline = 0001-01-01 00:00:00 +0000 UTC, ok = false
4vp0_1         | 16:05:14.065 [chaincode] processStream -> DEBU 06e []Received message REGISTER from shim
5vp0_1         | 16:05:14.065 [chaincode] HandleMessage -> DEBU 06f []Handling ChaincodeMessage of type: REGISTER in state created
6vp0_1         | 16:05:14.065 [chaincode] beforeRegisterEvent -> DEBU 070 Received REGISTER in state created
7vp0_1         | 16:05:14.065 [chaincode] registerHandler -> DEBU 071 registered handler complete for chaincode hello
8vp0_1         | 16:05:14.065 [chaincode] beforeRegisterEvent -> DEBU 072 Got REGISTER for chaincodeID = name:"hello" , sending back REGISTERED
9.
10.
Anote o nome do chaincodeID no resultado do log de registro (hello para o Example, veja a linha 8 no anterior). Você precisará disso mais tarde para a mensagem JSON ao implantar o chaincode Example através da interface REST do fabric.
O resultado anterior indica que o chaincode Example está em execução e foi registrado com a rede local de pares de validação de blockchain e está pronto para ser implantado.

3. Implante o exemplo

O Hyperledger Fabric fornece uma interface de serviço da web REST que você usa para interagir com o fabric. A primeira interação com o fabric é implantar o seu chaincode. Certifique-se de que sua rede local blockchain esteja em execução, então inicie o SoapUI e clique no botão REST para criar um novo projeto REST. Você deve ver uma caixa de diálogo como na Figura 3, onde você digita o URL baseado usado para todas as solicitações REST:


Figura 3. SoapUI Nova caixa de diálogo do projeto REST

Digite http://localhost:7050 como a URL e, em seguida, clique em OK. A porta 7050 é a porta REST padrão usada pelo fabric e, uma vez que sua rede blockchain está sendo executada no seu computador local, você usará o localhost como o nome do host.
Quando SoapUI surgir, você pode fazer um smoke test rápido para se certificar de que ele pode se comunicar com sua rede local blockchain. Expanda o novo recurso REST que você acabou de criar até ver Request 1. Em seguida, abra-o na janela Editor. Use GET para o método e em resource digite /chain. Certifique-se de clicar na opção JSON na guia de resultado e, em seguida, execute a solicitação (clicando no ícone de seta). Quando você executa esta requisi;áo, você simplesmente retorna o bloco hash atual na guia de resultado, localizada no lado direito da janela do editor, como você pode ver na Figura 4:


Figura 4. Smoke Test do Blockchain

Se você vir uma mensagem JSON semelhante à da Figura 4 (o valor currentBlockHash para sua rede será diferente, é claro), então você está pronto para implantar o chaincode Example.
Clique com o botão direito do mouse na extremidade de REST Project 1 (http://localhost:7050) e escolha New Resource; você deverá ver uma caixa de diálogo “Novo Recurso REST” (veja a Figura 5) com um campo Resource Path:


Figura 5. Caixa de Diálogo Novo Recurso SoapUI

Digite /chaincode como o resource path, em seguida, clique em OK e você deve ver o novo recurso aparecer no painel SoapUI Projects. Abra a solicitação para este recurso (por padrão, ele será chamado Request 1), mude o método para POST e cole este JSON na área de solicitação, localizada no canto inferior esquerdo da janela do editor de solicitações:
1{
2"jsonrpc": "2.0",
3  "method": "deploy",
4  "params": {
5    "type": 1,
6    "chaincodeID":{
7        "name": "hello"
8    },
9    "CtorMsg": {
10        "args": [""]
11    }
12  },
13  "id": 1
14}
Três coisas a observar:
  • Linha 3: O valor do método deve ser deploy.
  • Linhas 6-7: O chaincodeID.name na mensagem JSON deve corresponder ao chaincodeID quando você registrou o chaincode Example na seção anterior (hello para o chaincode Example).
  • Linha 13: O valor id é usado para coordenar solicitações. Você não precisa se preocupar tanto com isto para este tutorial, mas observe que ele sempre é enviado de volta na resposta (veja a próxima listagem).
Quando você envia essa solicitação, o resultado JSON deve se parecer com isto:
1{
2   "jsonrpc": "2.0",
3   "result":    {
4      "status": "OK",
5      "message": "hello"
6   },
7   "id": 1
8}
A Figura 6 mostra uma imagem de como isso se apresenta em SoapUI. A mensagem de resultado JSON aparecerá na guia de resultado, que está localizada no lado direito do editor de solicitação.
O resultado de log de rede na janela do terminal deve incluir linhas que se parecem com isso:
1.
2.
3vp0_1         | 20:48:39.482 [rest] ProcessChaincode -> INFO 0c4 REST processing chaincode request...
4vp0_1         | 20:48:39.482 [rest] processChaincodeDeploy -> INFO 0c5 REST deploying chaincode...
5vp0_1         | 20:48:39.483 [devops] Deploy -> DEBU 0c6 Creating deployment transaction (hello)
6vp0_1         | 20:48:39.483 [devops] Deploy -> DEBU 0c7 Sending deploy transaction (hello) to validator
7vp0_1         | 20:48:39.483 [peer] sendTransactionsToLocalEngine -> DEBU 0c8 Marshalling transaction CHAINCODE_DEPLOY to send to local engine
8vp0_1         | 20:48:39.483 [peer] sendTransactionsToLocalEngine -> DEBU 0c9 Sending message CHAIN_TRANSACTION with timestamp seconds:1487796519 nanos:483661510  to local engine
9vp0_1         | 20:48:39.483 [consensus/noops] RecvMsg -> DEBU 0ca Handling Message of type: CHAIN_TRANSACTION
10vp0_1         | 20:48:39.483 [consensus/noops] broadcastConsensusMsg -> DEBU 0cb Broadcasting CONSENSUS
11vp0_1         | 20:48:39.483 [peer] Broadcast -> DEBU 0cc Broadcast took 1.135s
12vp0_1         | 20:48:39.483 [consensus/noops] RecvMsg -> DEBU 0cd Sending to channel tx uuid: hello
13vp0_1         | 20:48:39.483 [rest] processChaincodeDeploy -> INFO 0ce Successfully deployed chainCode: hello
14vp0_1         | 20:48:39.484 [rest] ProcessChaincode -> INFO 0cf REST successfully deploy chaincode: {"jsonrpc":"2.0","result":{"status":"OK","message":"hello"},"id":1}
15.
16.
As linhas 3-4 mostram o resultado indicando que a rede recebeu a mensagem de implantação e o fabric está implantando seu chaincode. As linhas 13-14 mostram que seu chaincode foi implantado com êxito.
Tome nota de resultado como este na janela do terminal executando o seu chaincode:
1$ ./build/distributions/Example/bin/Example
2Hello world! starting [Ljava.lang.String;@7ef20235
3Feb 22, 2017 2:44:43 PM example.Example main
4INFO: starting
5Feb 22, 2017 2:44:43 PM org.hyperledger.java.shim.ChaincodeBase newPeerClientConnection
6INFO: Inside newPeerCLientConnection
7Feb 22, 2017 2:44:43 PM io.grpc.internal.TransportSet$1 call
8INFO: Created transport io.grpc.netty.NettyClientTransport@46adccd3(/127.0.0.1:7051) for /127.0.0.1:7051
9Feb 22, 2017 2:44:48 PM io.grpc.internal.TransportSet$TransportListener transportReady
10INFO: Transport io.grpc.netty.NettyClientTransport@46adccd3(/127.0.0.1:7051) for /127.0.0.1:7051 is ready
11Feb 22, 2017 2:48:40 PM example.Example run
12INFO: In run, function:
13Feb 22, 2017 2:48:40 PM example.Example run
Eu incluí todas os resultados para o contexto e você deve ver linhas como 11-13 quando você envia a mensagem de implantação para sua rede blockchain.

Nenhum comentário:

Postar um comentário