Blockinformationen erhalten Sie mit dem Java SDK von Hyperledger Iroha

Artikelinhalt

Dies ist ein Beispiel zum Abrufen von Blockinformationen mithilfe des Java SDK von Hyperledger Iroha. Der Inhalt des Codes führt die folgende Verarbeitung durch.

  1. Senden Sie 3 Transaktionen gleichzeitig
  2. Blockinformationen abrufen und anzeigen
  3. Holen Sie sich Transaktionsinformationen aus dem Block und zeigen Sie sie an

Umgebung

Beispielcode

Dies ist der Code, den ich gemacht habe.

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.Senden Sie 3 Transaktionen gleichzeitig
    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.Blockinformationen abrufen und anzeigen
    for(Map.Entry<Descriptors.FieldDescriptor,Object> entry : map.entrySet()) {
        System.out.println("Key:" + entry.getKey() + " Value:" + entry.getValue());
    }

    // 3.Holen Sie sich Transaktionsinformationen aus dem Block und zeigen Sie sie an
    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) + "Artikel*********************/");
        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. Senden Sie 3 Transaktionen gleichzeitig

Wenn nur eine Transaktion gesendet wird, scheint es "Transaktion (tx)" und "transactionSync (tx)" zu geben. Der Unterschied besteht darin, ob darauf gewartet werden soll, dass es im Block erfasst wird. Im Java SDK von ethereum werden Methoden mit "Async" fortgesetzt, ohne darauf zu warten, dass sie in den Block aufgenommen werden. Irohas SDK scheint nicht darauf zu warten, dass die Methode mit "Sync" in den Block aufgenommen wird.

Derzeit wird anscheinend nur "transactionListSync" als Methode zum Senden von Transaktionen in einem Stapel bereitgestellt.

2. Blockinformationen abrufen und anzeigen

Lassen Sie uns zunächst den Inhalt von QryResponses anzeigen, der durch Ausführen einer Abfrage abgerufen werden kann.

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"
    }
  }
}

Für den angezeigten Inhalt konnten der Hashwert der Abfrage und der Inhalt des Blocks erhalten werden. Diese Informationen allein sind nicht einfach zu verwenden, daher habe ich nach einer Möglichkeit gesucht, die Informationen einzeln zu erhalten.

3. Holen Sie sich Transaktionsinformationen aus dem Block und zeigen Sie sie an

Wenn Sie den Inhalt des Blocks mit dem folgenden Code vergleichen, ist dies leichter zu verstehen.

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();

Informationen werden aus der Antwort erhalten, und für jedes Element der JSON-Informationen des Blocks wird eine Klasse vorbereitet. Daher ist es möglich, Daten in der Reihenfolge Block → Block_v1 → Nutzlast → Transaktionen → Nutzlast → Reduzierte_Lastlast → Befehle zu erfassen.

Der Beispielcode zeigt den Inhalt der Transaktion. Das Ausführungsergebnis ist wie folgt.

/*********************1. Fall*********************/
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
/*********************2 ..*********************/
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
/*********************3. Fall*********************/
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

Impressionen

Persönlich hatte ich den Eindruck, dass das SDK von Ethereum leichter zu verstehen ist, wie man Transaktionsinformationen erhält und Informationen blockiert.

Ich wollte unbedingt die neuesten Blockinformationen erhalten, weiß aber nicht, wie ich sie erhalten soll. Deshalb versuche ich, die Blocknummer direkt anzugeben. Es scheint, dass wir noch herausfinden müssen, wie man es benutzt.

Recommended Posts

Blockinformationen erhalten Sie mit dem Java SDK von Hyperledger Iroha
Versuchen Sie es mit dem Java SDK von Hyperledger Iroha
Holen Sie sich Zeitstempel mit dem Azure BlobStorage Java SDK
Holen Sie sich EXIF-Informationen in Java
[Java] Listen- / Kartenelemente mit Iterator abrufen
Holen Sie sich eine Liste der S3-Dateien mit ListObjectsV2Request (AWS SDK für Java)
[Java] Tag-Informationen aus Musikdateien abrufen
[Java] Ermitteln Sie das Datum mit der LocalDateTime-Klasse
Erstellen Sie eine CSR mit erweiterten Informationen in Java
[Java] Holen Sie sich Bilder mit der Google Custom Search API
Bibliothek "OSHI" zum Erfassen von Systeminformationen mit Java
[LeJOS] EV3-Sensorwert per Fernzugriff mit Java abrufen
Ich habe versucht, den Block mit Java zu brechen (1)
Kommen Sie mit Java-Containern in Cloud Run zurecht
Rufen Sie eine Liste mit MBean-Informationen für Java-Anwendungen ab
Erfahrene Java-Benutzer beginnen mit der Entwicklung von Android-Apps
[Spring Boot] Benutzerinformationen mit Rest API abrufen (Anfänger)
Rufen Sie eine Methode mit Kotlins Rückrufblock von Java aus auf
Verwenden Sie die aggregierte Abfrage (Anzahl) mit dem Azure CosmosDB Java SDK
Rufen Sie den Azure App Service für die Java-Konfiguration mit System.getEnv () ab.
[Java] Holen Sie sich das Datum 10 Tage später mit der Calendar-Klasse
Holen Sie sich die S3-Objektgröße mit AWS SDK for Ruby
Beginnen Sie mit serverlosem Java mit dem leichtgewichtigen Framework Micronaut!