Résumé Il n'y a rien de particulier. Dois-je y prêter attention? .. .. J'ai ressenti cela, alors j'ai écrit un article. Si vous avez des commentaires, veuillez. Obtenez des informations de bloc avec le SDK Java de Python, Python3, Glossy Hyperledger Iroha

Contenu de l'article

Voici un exemple pour obtenir des informations de bloc à l'aide du SDK Java d'Hyperledger Iroha. Le contenu du code effectue le traitement suivant.

  1. Envoyez 3 transactions à la fois
  2. Obtenir et afficher les informations de bloc
  3. Récupérez les informations de transaction du bloc et affichez-les

environnement

Exemple de code

C'est le code que j'ai créé.

Sample.java


 public static void main(String[] args) throws Exception{

    URI uri = new URI(null,null, "192.168.33.10",50051,null,null,null);

    IrohaAPI api = new IrohaAPI(uri);

    byte[] pubByte = Hex.decodeHex("313a07e6384776ed95447710d15e59148473ccfc052a681317a72a69f2a49910");
    byte[] privByte = Hex.decodeHex("f101537e319568c765b2cc89698325604991dca57b9716b58016b253506cab70");

    KeyPair adminKeyPair = Ed25519Sha3.keyPairFromBytes(privByte, pubByte);

    // transfer 100 usd from user_a to user_b
    val tx1 = Transaction.builder("admin@test")
        .transferAsset("admin@test", "test@test", "odocoin#test", "For pizza", "10")
        .sign(adminKeyPair)
        .build();

    val tx2 = Transaction.builder("admin@test")
            .transferAsset("admin@test", "test@test", "odocoin#test", "For sushi", "10")
            .sign(adminKeyPair)
            .build();

    val tx3 = Transaction.builder("admin@test")
            .transferAsset("admin@test", "test@test", "odocoin#test", "For hamburger", "10")
            .sign(adminKeyPair)
            .build();

    List<TransactionOuterClass.Transaction> txList = new ArrayList<>();
    txList.add(tx1);
    txList.add(tx2);
    txList.add(tx3);

    val observer = TransactionStatusObserver.builder()
        // executed when stateless or stateful validation is failed
        .onTransactionFailed(t -> System.out.println(String.format(
            "transaction %s failed with msg: %s",
            t.getTxHash(),
            t.getErrOrCmdName()
        )))
        // executed when got any exception in handlers or grpc
        .onError(e -> System.out.println("Failed with exception: " + e))
        // executed when we receive "committed" status
        .onTransactionCommitted((t) -> System.out.println("Committed :)"))
        // executed when transfer is complete (failed or succeed) and observable is closed
        .onComplete(() -> System.out.println("Complete"))
        .build();

    // 1.Envoyez 3 transactions à la fois
    api.transactionListSync(txList);

    Thread.sleep(10000);

    val query = Query.builder("admin@test", 3).getBlock(Long.valueOf("9")).buildSigned(adminKeyPair);
    QryResponses.QueryResponse response = api.query(query);

    Map<FieldDescriptor, Object> map = response.getAllFields();
    // 2.Obtenir et afficher les informations de bloc
    for(Map.Entry<Descriptors.FieldDescriptor,Object> entry : map.entrySet()) {
        System.out.println("Key:" + entry.getKey() + " Value:" + entry.getValue());
    }

    // 3.Obtenez les informations de transaction du bloc et affichez-les
    BlockResponse block = response.getBlockResponse();
    Payload payload = block.getBlock().getBlockV1().getPayload();
    for(int i=0; i < payload.getTransactionsCount(); i++) {

        TransactionOuterClass.Transaction tx = payload.getTransactions(i);

        ReducedPayload reducePayload = tx.getPayload().getReducedPayload();

        System.out.println("/********************* " + (i+1) + "Article*********************/");
        System.out.println("CreatorAccountId :" + reducePayload.getCreatorAccountId());
        System.out.println("CreatedTime      :" + new Date(reducePayload.getCreatedTime()));
        System.out.println("Quorum           :" + reducePayload.getQuorum());
        System.out.println("CommandCount     :" + reducePayload.getCommandsCount());
        for(int j=0; j < reducePayload.getCommandsCount(); j++) {
            Command command = reducePayload.getCommands(j);
            TransferAsset asset = command.getTransferAsset();
            System.out.println("SrcAccountId     :" + asset.getSrcAccountId());
            System.out.println("DestAccountId    :" + asset.getDestAccountId());
            System.out.println("AssetId          :" + asset.getAssetId());
            System.out.println("Description      :" + asset.getDescription());
            System.out.println("Amount           :" + asset.getAmount());
        }
    }
    api.close();
  }

1. Envoyez 3 transactions à la fois

Lors de l'envoi d'une seule transaction, il semble qu'il y ait "transaction (tx)" et "transactionSync (tx)". La différence est de savoir s'il faut attendre qu'il soit capturé dans le bloc. Dans le SDK Java d'Ethereum, les méthodes avec "Async" se déroulent sans attendre qu'elles soient incluses dans le bloc. Le SDK d'Iroha ne semble pas attendre que la méthode avec "Sync" soit incluse dans le bloc.

Pour le moment, il semble que seul "transactionListSync" soit fourni comme méthode pour envoyer des transactions dans un lot.

2. Obtenir et afficher les informations de bloc

Tout d'abord, affichons le contenu de QryResponses qui peut être obtenu en exécutant une requête.

Key:iroha.protocol.QueryResponse.query_hash Value:429b50118a1d691706408045ea1ac55ed9f4138d10a15450dc70850c7869fe9e
Key:iroha.protocol.QueryResponse.block_response Value:block {
  block_v1 {
    payload {
      transactions {
        payload {
          reduced_payload {
            commands {
              transfer_asset {
                src_account_id: "admin@test"
                dest_account_id: "test@test"
                asset_id: "odocoin#test"
                description: "For sushi"
                amount: "10"
              }
            }
            creator_account_id: "admin@test"
            created_time: 1570927096936
            quorum: 1
          }
        }
        signatures {
          public_key: "313A07E6384776ED95447710D15E59148473CCFC052A681317A72A69F2A49910"
          signature: "924FAE8C33A4AFB9B713E443B5C6BBC5B9D26069B71C688112B8BE74DEE40192A096CA6460396D67876A684C1950E0632A4C41B0362D55FEA085706C9B305F0C"
        }
      }
      transactions {
        payload {
          reduced_payload {
            commands {
              transfer_asset {
                src_account_id: "admin@test"
                dest_account_id: "test@test"
                asset_id: "odocoin#test"
                description: "For pizza"
                amount: "10"
              }
            }
            creator_account_id: "admin@test"
            created_time: 1570927096854
            quorum: 1
          }
        }
        signatures {
          public_key: "313A07E6384776ED95447710D15E59148473CCFC052A681317A72A69F2A49910"
          signature: "09A3E58AEFF340B2E975049B066B445A14E9F0984D48CEDA8612E4794E51A290A5263AB3C4C3121A4B839CE29262100F349AA08262878A1C53344E1EBCDFD50C"
        }
      }
      transactions {
        payload {
          reduced_payload {
            commands {
              transfer_asset {
                src_account_id: "admin@test"
                dest_account_id: "test@test"
                asset_id: "odocoin#test"
                description: "For hamburger"
                amount: "10"
              }
            }
            creator_account_id: "admin@test"
            created_time: 1570927096938
            quorum: 1
          }
        }
        signatures {
          public_key: "313A07E6384776ED95447710D15E59148473CCFC052A681317A72A69F2A49910"
          signature: "1D97980C8A1CDA550CB08E1561127516ABF6A756F4C62A703ACDD1DE91FC3741A7DD4BC5E5995CEC71144622CDA685A1390FBB5C98FBAFB63260CE838F33A80D"
        }
      }
      height: 9
      prev_block_hash: "497f75888812ba4cd825322284840051c4ab0c26a1b966839510af86f7aca203"
      created_time: 1570927100956
    }
    signatures {
      public_key: "bddd58404d1315e0eb27902c5d7c8eb0602c16238f005773df406bc191308929"
      signature: "0eff2986883e19325c33b2b59447e1ece486c981eeb1efcb69c61adf69e77df52228fa9e1ea5ed7aa987c3465e2c055797853e0802dcd6aea6fdf8fa201ce405"
    }
  }
}

Quant au contenu affiché, la valeur de hachage de la requête et le contenu du bloc peuvent être obtenus. Ces informations à elles seules ne sont pas faciles à utiliser, j'ai donc cherché un moyen d'obtenir les informations individuellement.

3. Récupérez les informations de transaction du bloc et affichez-les

Si vous comparez le contenu du bloc avec le code ci-dessous, il sera plus facile à comprendre.

Sample.java


BlockResponse block = response.getBlockResponse();
Payload payload = block.getBlock().getBlockV1().getPayload();
for(int i=0; i < payload.getTransactionsCount(); i++) {

  TransactionOuterClass.Transaction tx = payload.getTransactions(i);

  ReducedPayload reducePayload = tx.getPayload().getReducedPayload();

Les informations sont obtenues à partir de la réponse et une classe est préparée pour chaque élément des informations JSON du bloc. Par conséquent, il est possible d'acquérir des données dans l'ordre des commandes Bloc → Block_v1 → Payload → Transactions → Payload → Red_payload →.

L'exemple de code montre le contenu de la transaction. Le résultat de l'exécution est le suivant.

/*********************1er cas*********************/
CreatorAccountId :admin@test
CreatedTime      :Sun Oct 13 09:38:16 JST 2019
Quorum           :1
CommandCount     :1
SrcAccountId     :admin@test
DestAccountId    :test@test
AssetId          :odocoin#test
Description      :For sushi
Amount           :10
/*********************2e*********************/
CreatorAccountId :admin@test
CreatedTime      :Sun Oct 13 09:38:16 JST 2019
Quorum           :1
CommandCount     :1
SrcAccountId     :admin@test
DestAccountId    :test@test
AssetId          :odocoin#test
Description      :For pizza
Amount           :10
/*********************3e cas*********************/
CreatorAccountId :admin@test
CreatedTime      :Sun Oct 13 09:38:16 JST 2019
Quorum           :1
CommandCount     :1
SrcAccountId     :admin@test
DestAccountId    :test@test
AssetId          :odocoin#test
Description      :For hamburger
Amount           :10

Impressions

Personnellement, j'ai eu l'impression que le SDK d'Ethereum était plus facile à comprendre pour savoir comment obtenir des informations de transaction et bloquer des informations.

Je voulais vraiment obtenir les dernières informations de bloc, mais je ne sais pas comment l'obtenir, alors j'essaye de spécifier directement le numéro de bloc. Il semble que nous ayons encore besoin de savoir comment l'utiliser.

Recommended Posts

Résumé Il n'y a rien de particulier. Dois-je y prêter attention? .. .. J'ai ressenti cela, alors j'ai écrit un article. Si vous avez des commentaires, veuillez. Obtenez des informations de bloc avec le SDK Java de Python, Python3, Glossy Hyperledger Iroha
Essayez d'utiliser le SDK Java d'Hyperledger Iroha
Obtenez des horodatages avec le SDK Java Azure BlobStorage
Obtenir des informations EXIF en Java
[Java] Obtenir des éléments List / Map avec Iterator
Obtenir une liste de fichiers S3 avec ListObjectsV2Request (AWS SDK for Java)
[Java] Obtenir des informations sur les balises à partir de fichiers musicaux
[Java] Obtenez la date avec la classe LocalDateTime
Créer un CSR avec des informations étendues en Java
[Java] Obtenez des images avec l'API Google Custom Search
Bibliothèque "OSHI" pour acquérir des informations système avec Java
[LeJOS] Obtenez la valeur du capteur EV3 à distance avec Java
J'ai essayé de casser le bloc avec java (1)
S'entendre avec les conteneurs Java dans Cloud Run
Obtenir une liste d'informations MBean pour les applications Java
Les utilisateurs Java expérimentés se lancent dans le développement d'applications Android
[Spring Boot] Obtenez des informations utilisateur avec l'API Rest (débutant)
Appeler une méthode avec le bloc de rappel de Kotlin depuis Java
Utiliser la requête agrégée (nombre) avec le SDK Java Azure CosmosDB
Obtenez la configuration Azure App Service pour Java avec System.getEnv ()
[Java] Obtenez la date 10 jours plus tard avec la classe Calendar
Obtenir la taille de l'objet S3 avec AWS SDK pour Ruby
Commencez avec Java sans serveur avec le framework léger Micronaut!