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