From 0f386fdad43d30a4eb12dabe8f4274f8c980369e Mon Sep 17 00:00:00 2001 From: Sauli Ketola Date: Fri, 12 Jul 2019 20:15:35 +0300 Subject: [PATCH 1/6] AdmissionControl class on top of grpc admission control --- pom.xml | 1 + src/main/java/dev/jlibra/KeyUtils.java | 7 +- .../admissioncontrol/AddressArgument.java | 21 ++++ .../admissioncontrol/AdmissionControl.java | 96 +++++++++++++++++++ .../dev/jlibra/admissioncontrol/Program.java | 25 +++++ .../dev/jlibra/admissioncontrol/Result.java | 38 ++++++++ .../jlibra/admissioncontrol/Transaction.java | 22 +++++ .../admissioncontrol/TransactionArgument.java | 13 +++ .../jlibra/admissioncontrol/U64Argument.java | 26 +++++ .../dev/jlibra/example/TransferExample.java | 90 +++++------------ src/main/java/dev/jlibra/move/Move.java | 10 +- src/test/java/dev/jlibra/KeyUtilsTest.java | 2 +- src/test/java/dev/jlibra/move/MoveTest.java | 2 +- 13 files changed, 277 insertions(+), 76 deletions(-) create mode 100644 src/main/java/dev/jlibra/admissioncontrol/AddressArgument.java create mode 100644 src/main/java/dev/jlibra/admissioncontrol/AdmissionControl.java create mode 100644 src/main/java/dev/jlibra/admissioncontrol/Program.java create mode 100644 src/main/java/dev/jlibra/admissioncontrol/Result.java create mode 100644 src/main/java/dev/jlibra/admissioncontrol/Transaction.java create mode 100644 src/main/java/dev/jlibra/admissioncontrol/TransactionArgument.java create mode 100644 src/main/java/dev/jlibra/admissioncontrol/U64Argument.java diff --git a/pom.xml b/pom.xml index d072f024..14ef3c38 100644 --- a/pom.xml +++ b/pom.xml @@ -54,6 +54,7 @@ commons-io commons-io 2.6 + test junit diff --git a/src/main/java/dev/jlibra/KeyUtils.java b/src/main/java/dev/jlibra/KeyUtils.java index f448be68..4d034c70 100644 --- a/src/main/java/dev/jlibra/KeyUtils.java +++ b/src/main/java/dev/jlibra/KeyUtils.java @@ -13,11 +13,16 @@ public class KeyUtils { - public static String toLibraAddress(byte[] publicKeyBytes) { + public static String toHexStringLibraAddress(byte[] publicKeyBytes) { SHA3.DigestSHA3 digestSHA3 = new SHA3.Digest256(); return new String(Hex.encode(digestSHA3.digest(stripPublicKeyPrefix(publicKeyBytes)))); } + public static byte[] toByteArrayLibraAddress(byte[] publicKeyBytes) { + SHA3.DigestSHA3 digestSHA3 = new SHA3.Digest256(); + return digestSHA3.digest(stripPublicKeyPrefix(publicKeyBytes)); + } + public static byte[] stripPublicKeyPrefix(byte[] pubKeyBytes) { byte[] publicKeyWithoutPrefix = new byte[32]; System.arraycopy(pubKeyBytes, 12, publicKeyWithoutPrefix, 0, 32); diff --git a/src/main/java/dev/jlibra/admissioncontrol/AddressArgument.java b/src/main/java/dev/jlibra/admissioncontrol/AddressArgument.java new file mode 100644 index 00000000..37efa9b2 --- /dev/null +++ b/src/main/java/dev/jlibra/admissioncontrol/AddressArgument.java @@ -0,0 +1,21 @@ +package dev.jlibra.admissioncontrol; + +public class AddressArgument implements TransactionArgument { + + private byte[] address; + + public AddressArgument(byte[] address) { + this.address = address; + } + + @Override + public byte[] toByteArray() { + return address; + } + + @Override + public Type type() { + return Type.ADDRESS; + } + +} diff --git a/src/main/java/dev/jlibra/admissioncontrol/AdmissionControl.java b/src/main/java/dev/jlibra/admissioncontrol/AdmissionControl.java new file mode 100644 index 00000000..21e94fcd --- /dev/null +++ b/src/main/java/dev/jlibra/admissioncontrol/AdmissionControl.java @@ -0,0 +1,96 @@ +package dev.jlibra.admissioncontrol; + +import static java.util.stream.Collectors.toList; + +import java.io.IOException; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.google.protobuf.ByteString; + +import admission_control.AdmissionControlGrpc; +import admission_control.AdmissionControlGrpc.AdmissionControlBlockingStub; +import admission_control.AdmissionControlOuterClass.SubmitTransactionRequest; +import admission_control.AdmissionControlOuterClass.SubmitTransactionResponse; +import dev.jlibra.KeyUtils; +import dev.jlibra.LibraHelper; +import dev.jlibra.admissioncontrol.TransactionArgument.Type; +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import types.Transaction.Program; +import types.Transaction.RawTransaction; +import types.Transaction.SignedTransaction; +import types.Transaction.TransactionArgument; +import types.Transaction.TransactionArgument.ArgType; + +public class AdmissionControl { + + private static Map jlibraArgumentTypeToGrpcArgumentType; + + static { + jlibraArgumentTypeToGrpcArgumentType = new HashMap<>(); + jlibraArgumentTypeToGrpcArgumentType.put(Type.ADDRESS, ArgType.ADDRESS); + jlibraArgumentTypeToGrpcArgumentType.put(Type.U64, ArgType.U64); + } + + public Result sendTransaction(PublicKey publicKey, PrivateKey privateKey, Transaction transaction) { + + ManagedChannel channel = ManagedChannelBuilder.forAddress("ac.testnet.libra.org", 8000) + .usePlaintext() + .build(); + + AdmissionControlBlockingStub stub = AdmissionControlGrpc.newBlockingStub(channel); + + List transactionArguments = transaction.getProgram().getArguments().stream() + .map(txArgument -> TransactionArgument.newBuilder() + .setType(jlibraArgumentTypeToGrpcArgumentType.get(txArgument.type())) + .setData(ByteString.copyFrom(txArgument.toByteArray())) + .build()) + .collect(toList()); + + Program program = Program.newBuilder() + .addAllArguments(transactionArguments) + .setCode(readCodeFromStream(transaction)) + .addAllModules(new ArrayList()) + .build(); + + RawTransaction rawTransaction = RawTransaction.newBuilder() + .setProgram(program) + .setExpirationTime(600) + .setGasUnitPrice(1) + .setMaxGasAmount(6000) + .setSenderAccount(ByteString.copyFrom(KeyUtils.toByteArrayLibraAddress(publicKey.getEncoded()))) + .setSequenceNumber(transaction.getSequenceNumber()) + .build(); + + SignedTransaction signedTransaction = SignedTransaction.newBuilder() + .setRawTxnBytes(rawTransaction.toByteString()) + .setSenderPublicKey(ByteString.copyFrom(KeyUtils.stripPublicKeyPrefix(publicKey.getEncoded()))) + .setSenderSignature(ByteString.copyFrom(LibraHelper.signTransaction(rawTransaction, privateKey))) + .build(); + + SubmitTransactionRequest submitTransactionRequest = SubmitTransactionRequest.newBuilder() + .setSignedTxn(signedTransaction) + .build(); + + SubmitTransactionResponse response = stub.submitTransaction(submitTransactionRequest); + + channel.shutdown(); + + return new Result(response.getAcStatus(), response.getMempoolStatus(), response.getVmStatus()); + + } + + private ByteString readCodeFromStream(Transaction transaction) { + try { + return ByteString.readFrom(transaction.getProgram().getCode()); + } catch (IOException e) { + throw new RuntimeException("Could not read move code from input stream", e); + } + } + +} diff --git a/src/main/java/dev/jlibra/admissioncontrol/Program.java b/src/main/java/dev/jlibra/admissioncontrol/Program.java new file mode 100644 index 00000000..1e93f4c6 --- /dev/null +++ b/src/main/java/dev/jlibra/admissioncontrol/Program.java @@ -0,0 +1,25 @@ +package dev.jlibra.admissioncontrol; + +import java.io.InputStream; +import java.util.Set; + +public class Program { + + private InputStream code; + + private Set arguments; + + public Program(InputStream code, Set arguments) { + this.code = code; + this.arguments = arguments; + } + + public InputStream getCode() { + return code; + } + + public Set getArguments() { + return arguments; + } + +} diff --git a/src/main/java/dev/jlibra/admissioncontrol/Result.java b/src/main/java/dev/jlibra/admissioncontrol/Result.java new file mode 100644 index 00000000..04917de7 --- /dev/null +++ b/src/main/java/dev/jlibra/admissioncontrol/Result.java @@ -0,0 +1,38 @@ +package dev.jlibra.admissioncontrol; + +import admission_control.AdmissionControlOuterClass.AdmissionControlStatus; +import mempool.MempoolStatus; +import types.VmErrors.VMStatus; + +public class Result { + + // TODO: Create own enum types instead of putting grpc enums directly here + // Could also add the description texts for clearer errors + + private AdmissionControlStatus admissionControlStatus; + + private MempoolStatus.MempoolAddTransactionStatus mempoolStatus; + + private VMStatus vmStatus; + + public Result(AdmissionControlStatus admissionControlStatus, + MempoolStatus.MempoolAddTransactionStatus mempoolStatus, + VMStatus vmStatus) { + this.admissionControlStatus = admissionControlStatus; + this.mempoolStatus = mempoolStatus; + this.vmStatus = vmStatus; + } + + public AdmissionControlStatus getAdmissionControlStatus() { + return admissionControlStatus; + } + + public MempoolStatus.MempoolAddTransactionStatus getMempoolStatus() { + return mempoolStatus; + } + + public VMStatus getVmStatus() { + return vmStatus; + } + +} diff --git a/src/main/java/dev/jlibra/admissioncontrol/Transaction.java b/src/main/java/dev/jlibra/admissioncontrol/Transaction.java new file mode 100644 index 00000000..fdb31466 --- /dev/null +++ b/src/main/java/dev/jlibra/admissioncontrol/Transaction.java @@ -0,0 +1,22 @@ +package dev.jlibra.admissioncontrol; + +public class Transaction { + + private long sequenceNumber; + + private Program program; + + public Transaction(long sequenceNumber, Program program) { + this.sequenceNumber = sequenceNumber; + this.program = program; + } + + public long getSequenceNumber() { + return sequenceNumber; + } + + public Program getProgram() { + return program; + } + +} diff --git a/src/main/java/dev/jlibra/admissioncontrol/TransactionArgument.java b/src/main/java/dev/jlibra/admissioncontrol/TransactionArgument.java new file mode 100644 index 00000000..9b92c589 --- /dev/null +++ b/src/main/java/dev/jlibra/admissioncontrol/TransactionArgument.java @@ -0,0 +1,13 @@ +package dev.jlibra.admissioncontrol; + +public interface TransactionArgument { + + public enum Type { + U64, ADDRESS + } + + byte[] toByteArray(); + + Type type(); + +} diff --git a/src/main/java/dev/jlibra/admissioncontrol/U64Argument.java b/src/main/java/dev/jlibra/admissioncontrol/U64Argument.java new file mode 100644 index 00000000..373cd625 --- /dev/null +++ b/src/main/java/dev/jlibra/admissioncontrol/U64Argument.java @@ -0,0 +1,26 @@ +package dev.jlibra.admissioncontrol; + +import static java.nio.ByteOrder.LITTLE_ENDIAN; + +import java.nio.ByteBuffer; + +public class U64Argument implements TransactionArgument { + + private long value; + + public U64Argument(long value) { + this.value = value; + } + + @Override + public byte[] toByteArray() { + return ByteBuffer.allocate(Long.BYTES).order(LITTLE_ENDIAN).putLong(value) + .order(LITTLE_ENDIAN).array(); + } + + @Override + public Type type() { + return Type.U64; + } + +} diff --git a/src/main/java/dev/jlibra/example/TransferExample.java b/src/main/java/dev/jlibra/example/TransferExample.java index 156d39b4..c6f9b00a 100644 --- a/src/main/java/dev/jlibra/example/TransferExample.java +++ b/src/main/java/dev/jlibra/example/TransferExample.java @@ -1,31 +1,23 @@ package dev.jlibra.example; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; +import static dev.jlibra.KeyUtils.toHexStringLibraAddress; +import static java.util.Arrays.asList; + import java.security.PrivateKey; import java.security.PublicKey; import java.security.Security; -import java.util.ArrayList; -import java.util.Arrays; +import java.util.HashSet; import org.bouncycastle.util.encoders.Hex; -import com.google.protobuf.ByteString; - -import admission_control.AdmissionControlGrpc; -import admission_control.AdmissionControlGrpc.AdmissionControlBlockingStub; -import admission_control.AdmissionControlOuterClass.SubmitTransactionRequest; -import admission_control.AdmissionControlOuterClass.SubmitTransactionResponse; import dev.jlibra.KeyUtils; -import dev.jlibra.LibraHelper; +import dev.jlibra.admissioncontrol.AddressArgument; +import dev.jlibra.admissioncontrol.AdmissionControl; +import dev.jlibra.admissioncontrol.Program; +import dev.jlibra.admissioncontrol.Result; +import dev.jlibra.admissioncontrol.Transaction; +import dev.jlibra.admissioncontrol.U64Argument; import dev.jlibra.move.Move; -import io.grpc.ManagedChannel; -import io.grpc.ManagedChannelBuilder; -import types.Transaction.Program; -import types.Transaction.RawTransaction; -import types.Transaction.SignedTransaction; -import types.Transaction.TransactionArgument; -import types.Transaction.TransactionArgument.ArgType; public class TransferExample { @@ -36,63 +28,29 @@ public static void main(String[] args) throws Exception { "3051020101300506032b6570042204207422e9df27029f7b83c37035622f93cd0e9b3a2a705d0745d573252756fd8c888121008e23fbceaa5b7a038c8994ca8258c8815e6e9007e3de86598cd46357e5e60024"); PublicKey publicKey = KeyUtils.publicKeyFromHexString( "302a300506032b65700321008e23fbceaa5b7a038c8994ca8258c8815e6e9007e3de86598cd46357e5e60024"); - String fromAddress = "6674633c78e2e00c69fd6e027aa6d1db2abc2a6c80d78a3e129eaf33dd49ce1c"; String toAddress = "045d3e63dba85f759d66f9bed4a0e4c262d17f9713f25e846fdae63891837a98"; - long amount = 7; - - ManagedChannel channel = ManagedChannelBuilder.forAddress("ac.testnet.libra.org", 8000) - .usePlaintext() - .build(); - - AdmissionControlBlockingStub stub = AdmissionControlGrpc.newBlockingStub(channel); - - TransactionArgument arg = TransactionArgument.newBuilder() - .setType(ArgType.ADDRESS) - .setData(ByteString.copyFrom(Hex.decode(toAddress))) - .build(); + long amount = 5; + int sequenceNumber = 2; - TransactionArgument arg2 = TransactionArgument.newBuilder() - .setType(ArgType.U64) - .setData(ByteString - .copyFrom( - ByteBuffer.allocate(Long.BYTES).order(ByteOrder.LITTLE_ENDIAN).putLong(amount * 1000000) - .order(ByteOrder.LITTLE_ENDIAN).array())) - .build(); + System.out.println( + String.format("Sending from %s to %s", toHexStringLibraAddress(publicKey.getEncoded()), toAddress)); - Program program = Program.newBuilder() - .addAllArguments(Arrays.asList(arg, arg2)) - .setCode(ByteString.copyFrom(Move.peerToPeerTransfer())) - .addAllModules(new ArrayList()) - .build(); + // Arguments for the peer to peer transaction + U64Argument amountArgument = new U64Argument(amount * 1000000); + AddressArgument addressArgument = new AddressArgument(Hex.decode(toAddress)); - RawTransaction rawTransaction = RawTransaction.newBuilder() - .setProgram(program) - .setExpirationTime(600) - .setGasUnitPrice(1) - .setMaxGasAmount(6000) - .setSenderAccount(ByteString.copyFrom(Hex.decode(fromAddress))) - .setSequenceNumber(0) - .build(); + Transaction transaction = new Transaction(sequenceNumber, + new Program(Move.peerToPeerTransfer(), new HashSet<>(asList(amountArgument, addressArgument)))); + Result result = new AdmissionControl().sendTransaction(publicKey, privateKey, + transaction); - SignedTransaction signedTransaction = SignedTransaction.newBuilder() - .setRawTxnBytes(rawTransaction.toByteString()) - .setSenderPublicKey(ByteString.copyFrom(KeyUtils.stripPublicKeyPrefix(publicKey.getEncoded()))) - .setSenderSignature(ByteString.copyFrom(LibraHelper.signTransaction(rawTransaction, privateKey))) - .build(); - - SubmitTransactionRequest submitTransactionRequest = SubmitTransactionRequest.newBuilder() - .setSignedTxn(signedTransaction) - .build(); - - SubmitTransactionResponse response = stub.submitTransaction(submitTransactionRequest); + System.out.println("Admission control status: " + result.getAdmissionControlStatus()); + System.out.println("Mempool status: " + result.getMempoolStatus()); + System.out.println("VM status: " + result.getVmStatus()); Thread.sleep(2000); // add sleep to prevent premature closing of channel - - System.out.println("response: " + response); - - channel.shutdown(); } } diff --git a/src/main/java/dev/jlibra/move/Move.java b/src/main/java/dev/jlibra/move/Move.java index b6f02b66..fcddf705 100644 --- a/src/main/java/dev/jlibra/move/Move.java +++ b/src/main/java/dev/jlibra/move/Move.java @@ -1,15 +1,11 @@ package dev.jlibra.move; -import org.apache.commons.io.IOUtils; +import java.io.InputStream; public class Move { - public static byte[] peerToPeerTransfer() { - try { - return IOUtils.toByteArray(Move.class.getResourceAsStream("/move/peer_to_peer_transfer.bin")); - } catch (Exception e) { - throw new RuntimeException("Reading the transfer script file failed", e); - } + public static InputStream peerToPeerTransfer() { + return Move.class.getResourceAsStream("/move/peer_to_peer_transfer.bin"); } } diff --git a/src/test/java/dev/jlibra/KeyUtilsTest.java b/src/test/java/dev/jlibra/KeyUtilsTest.java index d1aab6ed..25c73b5b 100644 --- a/src/test/java/dev/jlibra/KeyUtilsTest.java +++ b/src/test/java/dev/jlibra/KeyUtilsTest.java @@ -31,7 +31,7 @@ public void testToLibraAddress() throws Exception { PublicKey publicKey = getKeyFactory().generatePublic(new X509EncodedKeySpec(Hex .decode(PUBLIC_KEY_HEX))); - assertThat(KeyUtils.toLibraAddress(publicKey.getEncoded()), + assertThat(KeyUtils.toHexStringLibraAddress(publicKey.getEncoded()), is("eb99fc3808a8e439c58f87935cbe6774e4cc83459b463ea0813b34ef96f0ba87")); } diff --git a/src/test/java/dev/jlibra/move/MoveTest.java b/src/test/java/dev/jlibra/move/MoveTest.java index 269edb21..5ba785d1 100644 --- a/src/test/java/dev/jlibra/move/MoveTest.java +++ b/src/test/java/dev/jlibra/move/MoveTest.java @@ -10,7 +10,7 @@ public class MoveTest { @Test public void testPeerToPeerTransfer() throws Exception { - assertThat(Move.peerToPeerTransfer(), + assertThat(toByteArray(Move.peerToPeerTransfer()), equalTo(toByteArray(MoveTest.this.getClass().getResourceAsStream("/move/peer_to_peer_transfer.bin")))); } From 5b292a8e2ec51649a81d8e9437860aaeb13965a4 Mon Sep 17 00:00:00 2001 From: Sauli Ketola Date: Fri, 12 Jul 2019 23:45:43 +0300 Subject: [PATCH 2/6] Builder pattern for Transaction --- .../admissioncontrol/AdmissionControl.java | 18 +++++-- .../dev/jlibra/admissioncontrol/Program.java | 8 +-- .../jlibra/admissioncontrol/Transaction.java | 49 ++++++++++++++++++- .../dev/jlibra/example/TransferExample.java | 14 ++++-- 4 files changed, 74 insertions(+), 15 deletions(-) diff --git a/src/main/java/dev/jlibra/admissioncontrol/AdmissionControl.java b/src/main/java/dev/jlibra/admissioncontrol/AdmissionControl.java index 21e94fcd..86b85f84 100644 --- a/src/main/java/dev/jlibra/admissioncontrol/AdmissionControl.java +++ b/src/main/java/dev/jlibra/admissioncontrol/AdmissionControl.java @@ -29,6 +29,15 @@ public class AdmissionControl { + private String host; + + private int port; + + public AdmissionControl(String host, int port) { + this.host = host; + this.port = port; + } + private static Map jlibraArgumentTypeToGrpcArgumentType; static { @@ -39,7 +48,7 @@ public class AdmissionControl { public Result sendTransaction(PublicKey publicKey, PrivateKey privateKey, Transaction transaction) { - ManagedChannel channel = ManagedChannelBuilder.forAddress("ac.testnet.libra.org", 8000) + ManagedChannel channel = ManagedChannelBuilder.forAddress(host, port) .usePlaintext() .build(); @@ -60,9 +69,9 @@ public Result sendTransaction(PublicKey publicKey, PrivateKey privateKey, Transa RawTransaction rawTransaction = RawTransaction.newBuilder() .setProgram(program) - .setExpirationTime(600) - .setGasUnitPrice(1) - .setMaxGasAmount(6000) + .setExpirationTime(transaction.getExpirationTime()) + .setGasUnitPrice(transaction.getGasUnitPrice()) + .setMaxGasAmount(transaction.getMaxGasAmount()) .setSenderAccount(ByteString.copyFrom(KeyUtils.toByteArrayLibraAddress(publicKey.getEncoded()))) .setSequenceNumber(transaction.getSequenceNumber()) .build(); @@ -82,7 +91,6 @@ public Result sendTransaction(PublicKey publicKey, PrivateKey privateKey, Transa channel.shutdown(); return new Result(response.getAcStatus(), response.getMempoolStatus(), response.getVmStatus()); - } private ByteString readCodeFromStream(Transaction transaction) { diff --git a/src/main/java/dev/jlibra/admissioncontrol/Program.java b/src/main/java/dev/jlibra/admissioncontrol/Program.java index 1e93f4c6..d9528003 100644 --- a/src/main/java/dev/jlibra/admissioncontrol/Program.java +++ b/src/main/java/dev/jlibra/admissioncontrol/Program.java @@ -1,15 +1,15 @@ package dev.jlibra.admissioncontrol; import java.io.InputStream; -import java.util.Set; +import java.util.List; public class Program { private InputStream code; - private Set arguments; + private List arguments; - public Program(InputStream code, Set arguments) { + public Program(InputStream code, List arguments) { this.code = code; this.arguments = arguments; } @@ -18,7 +18,7 @@ public InputStream getCode() { return code; } - public Set getArguments() { + public List getArguments() { return arguments; } diff --git a/src/main/java/dev/jlibra/admissioncontrol/Transaction.java b/src/main/java/dev/jlibra/admissioncontrol/Transaction.java index fdb31466..efddda62 100644 --- a/src/main/java/dev/jlibra/admissioncontrol/Transaction.java +++ b/src/main/java/dev/jlibra/admissioncontrol/Transaction.java @@ -6,9 +6,42 @@ public class Transaction { private Program program; - public Transaction(long sequenceNumber, Program program) { - this.sequenceNumber = sequenceNumber; + private long expirationTime; + + private long gasUnitPrice; + + private long maxGasAmount; + + private Transaction() { + } + + public static Transaction create() { + return new Transaction(); + } + + public Transaction withProgram(Program program) { this.program = program; + return this; + } + + public Transaction withSequenceNumber(long sequenceNumber) { + this.sequenceNumber = sequenceNumber; + return this; + } + + public Transaction withExpirationTime(long expirationTime) { + this.expirationTime = expirationTime; + return this; + } + + public Transaction withGasUnitPrice(long gasUnitPrice) { + this.gasUnitPrice = gasUnitPrice; + return this; + } + + public Transaction withMaxGasAmount(long maxGasAmount) { + this.maxGasAmount = maxGasAmount; + return this; } public long getSequenceNumber() { @@ -19,4 +52,16 @@ public Program getProgram() { return program; } + public long getExpirationTime() { + return expirationTime; + } + + public long getGasUnitPrice() { + return gasUnitPrice; + } + + public long getMaxGasAmount() { + return maxGasAmount; + } + } diff --git a/src/main/java/dev/jlibra/example/TransferExample.java b/src/main/java/dev/jlibra/example/TransferExample.java index c6f9b00a..65835557 100644 --- a/src/main/java/dev/jlibra/example/TransferExample.java +++ b/src/main/java/dev/jlibra/example/TransferExample.java @@ -6,7 +6,6 @@ import java.security.PrivateKey; import java.security.PublicKey; import java.security.Security; -import java.util.HashSet; import org.bouncycastle.util.encoders.Hex; @@ -37,13 +36,20 @@ public static void main(String[] args) throws Exception { System.out.println( String.format("Sending from %s to %s", toHexStringLibraAddress(publicKey.getEncoded()), toAddress)); + AdmissionControl admissionControl = new AdmissionControl("ac.testnet.libra.org", 8000); + // Arguments for the peer to peer transaction U64Argument amountArgument = new U64Argument(amount * 1000000); AddressArgument addressArgument = new AddressArgument(Hex.decode(toAddress)); - Transaction transaction = new Transaction(sequenceNumber, - new Program(Move.peerToPeerTransfer(), new HashSet<>(asList(amountArgument, addressArgument)))); - Result result = new AdmissionControl().sendTransaction(publicKey, privateKey, + Transaction transaction = Transaction.create() + .withSequenceNumber(sequenceNumber) + .withMaxGasAmount(6000) + .withGasUnitPrice(1) + .withExpirationTime(0) + .withProgram( + new Program(Move.peerToPeerTransfer(), asList(addressArgument, amountArgument))); + Result result = admissionControl.sendTransaction(publicKey, privateKey, transaction); System.out.println("Admission control status: " + result.getAdmissionControlStatus()); From 9e2db5fcf879ef8b5ea55dc1ae0bae21310884da Mon Sep 17 00:00:00 2001 From: Sauli Ketola Date: Sat, 13 Jul 2019 00:26:05 +0300 Subject: [PATCH 3/6] Update transfer example --- src/main/java/dev/jlibra/example/TransferExample.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/dev/jlibra/example/TransferExample.java b/src/main/java/dev/jlibra/example/TransferExample.java index 65835557..1af426ff 100644 --- a/src/main/java/dev/jlibra/example/TransferExample.java +++ b/src/main/java/dev/jlibra/example/TransferExample.java @@ -30,8 +30,8 @@ public static void main(String[] args) throws Exception { String toAddress = "045d3e63dba85f759d66f9bed4a0e4c262d17f9713f25e846fdae63891837a98"; - long amount = 5; - int sequenceNumber = 2; + long amount = 8; + int sequenceNumber = 5; System.out.println( String.format("Sending from %s to %s", toHexStringLibraAddress(publicKey.getEncoded()), toAddress)); @@ -46,7 +46,7 @@ public static void main(String[] args) throws Exception { .withSequenceNumber(sequenceNumber) .withMaxGasAmount(6000) .withGasUnitPrice(1) - .withExpirationTime(0) + .withExpirationTime(10000) .withProgram( new Program(Move.peerToPeerTransfer(), asList(addressArgument, amountArgument))); Result result = admissionControl.sendTransaction(publicKey, privateKey, From ce3d18eab6bb82765c28a507e637716d96837a36 Mon Sep 17 00:00:00 2001 From: Sauli Ketola Date: Sat, 13 Jul 2019 10:04:44 +0300 Subject: [PATCH 4/6] updateToLatestLedger method to AdmissionControl --- .../admissioncontrol/AdmissionControl.java | 51 +++++++++++++++++-- .../query/GetAccountState.java | 13 +++++ .../query/UpdateToLatestLedgetResult.java | 27 ++++++++++ .../{ => transaction}/AddressArgument.java | 2 +- .../{ => transaction}/Program.java | 2 +- .../SubmitTransactionResult.java} | 6 +-- .../{ => transaction}/Transaction.java | 2 +- .../TransactionArgument.java | 2 +- .../{ => transaction}/U64Argument.java | 2 +- .../example/GetAccountStateExample.java | 48 ++++------------- .../dev/jlibra/example/TransferExample.java | 12 ++--- 11 files changed, 111 insertions(+), 56 deletions(-) create mode 100644 src/main/java/dev/jlibra/admissioncontrol/query/GetAccountState.java create mode 100644 src/main/java/dev/jlibra/admissioncontrol/query/UpdateToLatestLedgetResult.java rename src/main/java/dev/jlibra/admissioncontrol/{ => transaction}/AddressArgument.java (87%) rename src/main/java/dev/jlibra/admissioncontrol/{ => transaction}/Program.java (90%) rename src/main/java/dev/jlibra/admissioncontrol/{Result.java => transaction/SubmitTransactionResult.java} (85%) rename src/main/java/dev/jlibra/admissioncontrol/{ => transaction}/Transaction.java (96%) rename src/main/java/dev/jlibra/admissioncontrol/{ => transaction}/TransactionArgument.java (73%) rename src/main/java/dev/jlibra/admissioncontrol/{ => transaction}/U64Argument.java (90%) diff --git a/src/main/java/dev/jlibra/admissioncontrol/AdmissionControl.java b/src/main/java/dev/jlibra/admissioncontrol/AdmissionControl.java index 86b85f84..9fe1130f 100644 --- a/src/main/java/dev/jlibra/admissioncontrol/AdmissionControl.java +++ b/src/main/java/dev/jlibra/admissioncontrol/AdmissionControl.java @@ -16,11 +16,20 @@ import admission_control.AdmissionControlGrpc.AdmissionControlBlockingStub; import admission_control.AdmissionControlOuterClass.SubmitTransactionRequest; import admission_control.AdmissionControlOuterClass.SubmitTransactionResponse; +import dev.jlibra.AccountState; import dev.jlibra.KeyUtils; import dev.jlibra.LibraHelper; -import dev.jlibra.admissioncontrol.TransactionArgument.Type; +import dev.jlibra.admissioncontrol.query.GetAccountState; +import dev.jlibra.admissioncontrol.query.UpdateToLatestLedgetResult; +import dev.jlibra.admissioncontrol.transaction.SubmitTransactionResult; +import dev.jlibra.admissioncontrol.transaction.Transaction; +import dev.jlibra.admissioncontrol.transaction.TransactionArgument.Type; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; +import types.GetWithProof.GetAccountStateRequest; +import types.GetWithProof.RequestItem; +import types.GetWithProof.UpdateToLatestLedgerRequest; +import types.GetWithProof.UpdateToLatestLedgerResponse; import types.Transaction.Program; import types.Transaction.RawTransaction; import types.Transaction.SignedTransaction; @@ -46,7 +55,8 @@ public AdmissionControl(String host, int port) { jlibraArgumentTypeToGrpcArgumentType.put(Type.U64, ArgType.U64); } - public Result sendTransaction(PublicKey publicKey, PrivateKey privateKey, Transaction transaction) { + public SubmitTransactionResult submitTransaction(PublicKey publicKey, PrivateKey privateKey, + Transaction transaction) { ManagedChannel channel = ManagedChannelBuilder.forAddress(host, port) .usePlaintext() @@ -90,7 +100,7 @@ public Result sendTransaction(PublicKey publicKey, PrivateKey privateKey, Transa channel.shutdown(); - return new Result(response.getAcStatus(), response.getMempoolStatus(), response.getVmStatus()); + return new SubmitTransactionResult(response.getAcStatus(), response.getMempoolStatus(), response.getVmStatus()); } private ByteString readCodeFromStream(Transaction transaction) { @@ -101,4 +111,39 @@ private ByteString readCodeFromStream(Transaction transaction) { } } + public UpdateToLatestLedgetResult updateToLatestLedger(List arguments) { + ManagedChannel channel = ManagedChannelBuilder.forAddress(host, port) + .usePlaintext() + .build(); + + AdmissionControlBlockingStub stub = AdmissionControlGrpc.newBlockingStub(channel); + + List requestItems = arguments.stream().map(argument -> { + GetAccountStateRequest getAccountStateRequest = GetAccountStateRequest.newBuilder() + .setAddress(ByteString.copyFrom(argument.getAddress())) + .build(); + + RequestItem requestItem = RequestItem.newBuilder() + .setGetAccountStateRequest(getAccountStateRequest) + .build(); + return requestItem; + }).collect(toList()); + + UpdateToLatestLedgerResponse response = stub.updateToLatestLedger(UpdateToLatestLedgerRequest.newBuilder() + .addAllRequestedItems(requestItems) + .build()); + + List accountStates = new ArrayList<>(); + + response.getResponseItemsList().forEach(responseItem -> { + accountStates.addAll(LibraHelper.readAccountStates(responseItem.getGetAccountStateResponse() + .getAccountStateWithProof())); + }); + + UpdateToLatestLedgetResult result = UpdateToLatestLedgetResult.create() + .withAccountStates(accountStates); + + return result; + } + } diff --git a/src/main/java/dev/jlibra/admissioncontrol/query/GetAccountState.java b/src/main/java/dev/jlibra/admissioncontrol/query/GetAccountState.java new file mode 100644 index 00000000..f8c1f4dc --- /dev/null +++ b/src/main/java/dev/jlibra/admissioncontrol/query/GetAccountState.java @@ -0,0 +1,13 @@ +package dev.jlibra.admissioncontrol.query; + +public class GetAccountState { + private byte[] address; + + public GetAccountState(byte[] address) { + this.address = address; + } + + public byte[] getAddress() { + return address; + } +} diff --git a/src/main/java/dev/jlibra/admissioncontrol/query/UpdateToLatestLedgetResult.java b/src/main/java/dev/jlibra/admissioncontrol/query/UpdateToLatestLedgetResult.java new file mode 100644 index 00000000..683b9a21 --- /dev/null +++ b/src/main/java/dev/jlibra/admissioncontrol/query/UpdateToLatestLedgetResult.java @@ -0,0 +1,27 @@ +package dev.jlibra.admissioncontrol.query; + +import java.util.List; + +import dev.jlibra.AccountState; + +public class UpdateToLatestLedgetResult { + + private List accountStates; + + private UpdateToLatestLedgetResult() { + } + + public static UpdateToLatestLedgetResult create() { + return new UpdateToLatestLedgetResult(); + } + + public UpdateToLatestLedgetResult withAccountStates(List accountStates) { + this.accountStates = accountStates; + return this; + } + + public List getAccountStates() { + return accountStates; + } + +} diff --git a/src/main/java/dev/jlibra/admissioncontrol/AddressArgument.java b/src/main/java/dev/jlibra/admissioncontrol/transaction/AddressArgument.java similarity index 87% rename from src/main/java/dev/jlibra/admissioncontrol/AddressArgument.java rename to src/main/java/dev/jlibra/admissioncontrol/transaction/AddressArgument.java index 37efa9b2..ec970da0 100644 --- a/src/main/java/dev/jlibra/admissioncontrol/AddressArgument.java +++ b/src/main/java/dev/jlibra/admissioncontrol/transaction/AddressArgument.java @@ -1,4 +1,4 @@ -package dev.jlibra.admissioncontrol; +package dev.jlibra.admissioncontrol.transaction; public class AddressArgument implements TransactionArgument { diff --git a/src/main/java/dev/jlibra/admissioncontrol/Program.java b/src/main/java/dev/jlibra/admissioncontrol/transaction/Program.java similarity index 90% rename from src/main/java/dev/jlibra/admissioncontrol/Program.java rename to src/main/java/dev/jlibra/admissioncontrol/transaction/Program.java index d9528003..45a58d77 100644 --- a/src/main/java/dev/jlibra/admissioncontrol/Program.java +++ b/src/main/java/dev/jlibra/admissioncontrol/transaction/Program.java @@ -1,4 +1,4 @@ -package dev.jlibra.admissioncontrol; +package dev.jlibra.admissioncontrol.transaction; import java.io.InputStream; import java.util.List; diff --git a/src/main/java/dev/jlibra/admissioncontrol/Result.java b/src/main/java/dev/jlibra/admissioncontrol/transaction/SubmitTransactionResult.java similarity index 85% rename from src/main/java/dev/jlibra/admissioncontrol/Result.java rename to src/main/java/dev/jlibra/admissioncontrol/transaction/SubmitTransactionResult.java index 04917de7..90bddc1f 100644 --- a/src/main/java/dev/jlibra/admissioncontrol/Result.java +++ b/src/main/java/dev/jlibra/admissioncontrol/transaction/SubmitTransactionResult.java @@ -1,10 +1,10 @@ -package dev.jlibra.admissioncontrol; +package dev.jlibra.admissioncontrol.transaction; import admission_control.AdmissionControlOuterClass.AdmissionControlStatus; import mempool.MempoolStatus; import types.VmErrors.VMStatus; -public class Result { +public class SubmitTransactionResult { // TODO: Create own enum types instead of putting grpc enums directly here // Could also add the description texts for clearer errors @@ -15,7 +15,7 @@ public class Result { private VMStatus vmStatus; - public Result(AdmissionControlStatus admissionControlStatus, + public SubmitTransactionResult(AdmissionControlStatus admissionControlStatus, MempoolStatus.MempoolAddTransactionStatus mempoolStatus, VMStatus vmStatus) { this.admissionControlStatus = admissionControlStatus; diff --git a/src/main/java/dev/jlibra/admissioncontrol/Transaction.java b/src/main/java/dev/jlibra/admissioncontrol/transaction/Transaction.java similarity index 96% rename from src/main/java/dev/jlibra/admissioncontrol/Transaction.java rename to src/main/java/dev/jlibra/admissioncontrol/transaction/Transaction.java index efddda62..ba9ba2fd 100644 --- a/src/main/java/dev/jlibra/admissioncontrol/Transaction.java +++ b/src/main/java/dev/jlibra/admissioncontrol/transaction/Transaction.java @@ -1,4 +1,4 @@ -package dev.jlibra.admissioncontrol; +package dev.jlibra.admissioncontrol.transaction; public class Transaction { diff --git a/src/main/java/dev/jlibra/admissioncontrol/TransactionArgument.java b/src/main/java/dev/jlibra/admissioncontrol/transaction/TransactionArgument.java similarity index 73% rename from src/main/java/dev/jlibra/admissioncontrol/TransactionArgument.java rename to src/main/java/dev/jlibra/admissioncontrol/transaction/TransactionArgument.java index 9b92c589..3c9e0e25 100644 --- a/src/main/java/dev/jlibra/admissioncontrol/TransactionArgument.java +++ b/src/main/java/dev/jlibra/admissioncontrol/transaction/TransactionArgument.java @@ -1,4 +1,4 @@ -package dev.jlibra.admissioncontrol; +package dev.jlibra.admissioncontrol.transaction; public interface TransactionArgument { diff --git a/src/main/java/dev/jlibra/admissioncontrol/U64Argument.java b/src/main/java/dev/jlibra/admissioncontrol/transaction/U64Argument.java similarity index 90% rename from src/main/java/dev/jlibra/admissioncontrol/U64Argument.java rename to src/main/java/dev/jlibra/admissioncontrol/transaction/U64Argument.java index 373cd625..d348b360 100644 --- a/src/main/java/dev/jlibra/admissioncontrol/U64Argument.java +++ b/src/main/java/dev/jlibra/admissioncontrol/transaction/U64Argument.java @@ -1,4 +1,4 @@ -package dev.jlibra.admissioncontrol; +package dev.jlibra.admissioncontrol.transaction; import static java.nio.ByteOrder.LITTLE_ENDIAN; diff --git a/src/main/java/dev/jlibra/example/GetAccountStateExample.java b/src/main/java/dev/jlibra/example/GetAccountStateExample.java index 9ea4bf78..bc7ae9e8 100644 --- a/src/main/java/dev/jlibra/example/GetAccountStateExample.java +++ b/src/main/java/dev/jlibra/example/GetAccountStateExample.java @@ -1,57 +1,27 @@ package dev.jlibra.example; +import static java.util.Arrays.asList; + import java.io.IOException; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import org.bouncycastle.util.encoders.Hex; -import com.google.protobuf.ByteString; - -import admission_control.AdmissionControlGrpc; -import admission_control.AdmissionControlGrpc.AdmissionControlBlockingStub; -import dev.jlibra.AccountState; -import dev.jlibra.LibraHelper; -import io.grpc.ManagedChannel; -import io.grpc.ManagedChannelBuilder; -import types.GetWithProof.GetAccountStateRequest; -import types.GetWithProof.RequestItem; -import types.GetWithProof.UpdateToLatestLedgerRequest; -import types.GetWithProof.UpdateToLatestLedgerResponse; +import dev.jlibra.admissioncontrol.AdmissionControl; +import dev.jlibra.admissioncontrol.query.GetAccountState; +import dev.jlibra.admissioncontrol.query.UpdateToLatestLedgetResult; public class GetAccountStateExample { public static void main(String[] args) throws IOException { String address = "045d3e63dba85f759d66f9bed4a0e4c262d17f9713f25e846fdae63891837a98"; - ManagedChannel channel = ManagedChannelBuilder.forAddress("ac.testnet.libra.org", 8000) - .usePlaintext() - .build(); - - AdmissionControlBlockingStub stub = AdmissionControlGrpc.newBlockingStub(channel); - - GetAccountStateRequest getAccountStateRequest = GetAccountStateRequest.newBuilder() - .setAddress(ByteString.copyFrom(Hex.decode(address))) - .build(); + AdmissionControl admissionControl = new AdmissionControl("ac.testnet.libra.org", 8000); - RequestItem requestItem = RequestItem.newBuilder() - .setGetAccountStateRequest(getAccountStateRequest) - .build(); - - UpdateToLatestLedgerResponse response = stub.updateToLatestLedger(UpdateToLatestLedgerRequest.newBuilder() - .addAllRequestedItems(Arrays.asList(requestItem)) - .build()); - - List accountStates = new ArrayList<>(); - - response.getResponseItemsList().forEach(responseItem -> { - accountStates.addAll(LibraHelper.readAccountStates(responseItem.getGetAccountStateResponse() - .getAccountStateWithProof())); - }); + UpdateToLatestLedgetResult result = admissionControl + .updateToLatestLedger(asList(new GetAccountState(Hex.decode(address)))); - accountStates.forEach(accountState -> { + result.getAccountStates().forEach(accountState -> { System.out.println("Address:" + new String(Hex.encode(accountState.getAddress()))); System.out.println("Received events: " + accountState.getReceivedEvents()); System.out.println("Sent events: " + accountState.getSentEvents()); diff --git a/src/main/java/dev/jlibra/example/TransferExample.java b/src/main/java/dev/jlibra/example/TransferExample.java index 1af426ff..08733643 100644 --- a/src/main/java/dev/jlibra/example/TransferExample.java +++ b/src/main/java/dev/jlibra/example/TransferExample.java @@ -10,12 +10,12 @@ import org.bouncycastle.util.encoders.Hex; import dev.jlibra.KeyUtils; -import dev.jlibra.admissioncontrol.AddressArgument; import dev.jlibra.admissioncontrol.AdmissionControl; -import dev.jlibra.admissioncontrol.Program; -import dev.jlibra.admissioncontrol.Result; -import dev.jlibra.admissioncontrol.Transaction; -import dev.jlibra.admissioncontrol.U64Argument; +import dev.jlibra.admissioncontrol.transaction.AddressArgument; +import dev.jlibra.admissioncontrol.transaction.Program; +import dev.jlibra.admissioncontrol.transaction.SubmitTransactionResult; +import dev.jlibra.admissioncontrol.transaction.Transaction; +import dev.jlibra.admissioncontrol.transaction.U64Argument; import dev.jlibra.move.Move; public class TransferExample { @@ -49,7 +49,7 @@ public static void main(String[] args) throws Exception { .withExpirationTime(10000) .withProgram( new Program(Move.peerToPeerTransfer(), asList(addressArgument, amountArgument))); - Result result = admissionControl.sendTransaction(publicKey, privateKey, + SubmitTransactionResult result = admissionControl.submitTransaction(publicKey, privateKey, transaction); System.out.println("Admission control status: " + result.getAdmissionControlStatus()); From 2b7fec3a131999bfd883ed62b78910c1884b0726 Mon Sep 17 00:00:00 2001 From: Sauli Ketola Date: Sat, 13 Jul 2019 11:25:04 +0300 Subject: [PATCH 5/6] Fix typo --- .../dev/jlibra/admissioncontrol/AdmissionControl.java | 6 +++--- ...dgetResult.java => UpdateToLatestLedgerResult.java} | 10 +++++----- .../dev/jlibra/example/GetAccountStateExample.java | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) rename src/main/java/dev/jlibra/admissioncontrol/query/{UpdateToLatestLedgetResult.java => UpdateToLatestLedgerResult.java} (58%) diff --git a/src/main/java/dev/jlibra/admissioncontrol/AdmissionControl.java b/src/main/java/dev/jlibra/admissioncontrol/AdmissionControl.java index 9fe1130f..a45ebbca 100644 --- a/src/main/java/dev/jlibra/admissioncontrol/AdmissionControl.java +++ b/src/main/java/dev/jlibra/admissioncontrol/AdmissionControl.java @@ -20,7 +20,7 @@ import dev.jlibra.KeyUtils; import dev.jlibra.LibraHelper; import dev.jlibra.admissioncontrol.query.GetAccountState; -import dev.jlibra.admissioncontrol.query.UpdateToLatestLedgetResult; +import dev.jlibra.admissioncontrol.query.UpdateToLatestLedgerResult; import dev.jlibra.admissioncontrol.transaction.SubmitTransactionResult; import dev.jlibra.admissioncontrol.transaction.Transaction; import dev.jlibra.admissioncontrol.transaction.TransactionArgument.Type; @@ -111,7 +111,7 @@ private ByteString readCodeFromStream(Transaction transaction) { } } - public UpdateToLatestLedgetResult updateToLatestLedger(List arguments) { + public UpdateToLatestLedgerResult updateToLatestLedger(List arguments) { ManagedChannel channel = ManagedChannelBuilder.forAddress(host, port) .usePlaintext() .build(); @@ -140,7 +140,7 @@ public UpdateToLatestLedgetResult updateToLatestLedger(List arg .getAccountStateWithProof())); }); - UpdateToLatestLedgetResult result = UpdateToLatestLedgetResult.create() + UpdateToLatestLedgerResult result = UpdateToLatestLedgerResult.create() .withAccountStates(accountStates); return result; diff --git a/src/main/java/dev/jlibra/admissioncontrol/query/UpdateToLatestLedgetResult.java b/src/main/java/dev/jlibra/admissioncontrol/query/UpdateToLatestLedgerResult.java similarity index 58% rename from src/main/java/dev/jlibra/admissioncontrol/query/UpdateToLatestLedgetResult.java rename to src/main/java/dev/jlibra/admissioncontrol/query/UpdateToLatestLedgerResult.java index 683b9a21..6b6a1d55 100644 --- a/src/main/java/dev/jlibra/admissioncontrol/query/UpdateToLatestLedgetResult.java +++ b/src/main/java/dev/jlibra/admissioncontrol/query/UpdateToLatestLedgerResult.java @@ -4,18 +4,18 @@ import dev.jlibra.AccountState; -public class UpdateToLatestLedgetResult { +public class UpdateToLatestLedgerResult { private List accountStates; - private UpdateToLatestLedgetResult() { + private UpdateToLatestLedgerResult() { } - public static UpdateToLatestLedgetResult create() { - return new UpdateToLatestLedgetResult(); + public static UpdateToLatestLedgerResult create() { + return new UpdateToLatestLedgerResult(); } - public UpdateToLatestLedgetResult withAccountStates(List accountStates) { + public UpdateToLatestLedgerResult withAccountStates(List accountStates) { this.accountStates = accountStates; return this; } diff --git a/src/main/java/dev/jlibra/example/GetAccountStateExample.java b/src/main/java/dev/jlibra/example/GetAccountStateExample.java index bc7ae9e8..77d2cec3 100644 --- a/src/main/java/dev/jlibra/example/GetAccountStateExample.java +++ b/src/main/java/dev/jlibra/example/GetAccountStateExample.java @@ -9,7 +9,7 @@ import dev.jlibra.admissioncontrol.AdmissionControl; import dev.jlibra.admissioncontrol.query.GetAccountState; -import dev.jlibra.admissioncontrol.query.UpdateToLatestLedgetResult; +import dev.jlibra.admissioncontrol.query.UpdateToLatestLedgerResult; public class GetAccountStateExample { @@ -18,7 +18,7 @@ public static void main(String[] args) throws IOException { AdmissionControl admissionControl = new AdmissionControl("ac.testnet.libra.org", 8000); - UpdateToLatestLedgetResult result = admissionControl + UpdateToLatestLedgerResult result = admissionControl .updateToLatestLedger(asList(new GetAccountState(Hex.decode(address)))); result.getAccountStates().forEach(accountState -> { From 10b1dbd5f89bfefaccaff1ef7699d5c97dc4fed5 Mon Sep 17 00:00:00 2001 From: Sauli Ketola Date: Sat, 13 Jul 2019 21:30:00 +0300 Subject: [PATCH 6/6] fix based on review --- src/main/java/dev/jlibra/KeyUtils.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/dev/jlibra/KeyUtils.java b/src/main/java/dev/jlibra/KeyUtils.java index 4d034c70..313c5dd8 100644 --- a/src/main/java/dev/jlibra/KeyUtils.java +++ b/src/main/java/dev/jlibra/KeyUtils.java @@ -14,8 +14,7 @@ public class KeyUtils { public static String toHexStringLibraAddress(byte[] publicKeyBytes) { - SHA3.DigestSHA3 digestSHA3 = new SHA3.Digest256(); - return new String(Hex.encode(digestSHA3.digest(stripPublicKeyPrefix(publicKeyBytes)))); + return new String(Hex.encode(toByteArrayLibraAddress(publicKeyBytes))); } public static byte[] toByteArrayLibraAddress(byte[] publicKeyBytes) {