From 3b409d83dab770bdf369f5a8c6165e12d5e3e88d Mon Sep 17 00:00:00 2001 From: Nicola Atzei Date: Sat, 30 Jan 2021 00:57:44 +0100 Subject: [PATCH] Fix usage of uncompressed private keys --- xyz.balzaclang.balzac.cli/.classpath | 11 ----- .../src/main/java/bug.balzac | 2 +- ...{ECKeyStore.java => PrivateKeysStore.java} | 20 +++++---- .../xyz/balzaclang/lib/model/PrivateKey.java | 20 +++++---- .../balzaclang/lib/model/PrivateKeyImpl.java | 19 ++++++-- .../xyz/balzaclang/lib/model/Signature.java | 4 +- .../model/script/AbstractScriptBuilder.java | 14 +++--- .../script/AbstractScriptBuilderWithVar.java | 14 +++--- .../transaction/ITransactionBuilder.java | 22 ++++----- .../transaction/SerialTransactionBuilder.java | 4 +- .../model/transaction/TransactionBuilder.java | 17 ++++--- .../java/xyz/balzaclang/lib/utils/EnvI.java | 2 +- .../lib/utils/ServerSocketDaemon.java | 16 +++---- .../balzaclang/lib/validation/Validator.java | 4 +- ...oreTest.java => PrivateKeysStoreTest.java} | 6 +-- .../xyz/balzaclang/lib/model/HashTest.java | 1 - .../balzaclang/lib/model/PrivateKeyTest.java | 45 +++++++++++++++++++ .../script/AbstractScriptBuilderTest.java | 3 +- .../script/ScriptBuilderWithVarTest.java | 32 ++++++------- .../transaction/ITransactionBuilderTest.java | 8 ++-- .../transaction/TransactionBuilderTest.java | 4 -- .../xyz/balzaclang/lib/utils/EnvTest.java | 7 +-- .../lib/utils/PlaceholderUtilsTest.java | 1 - .../lib/utils/ServerSocketDaemonTest.java | 1 - xyz.balzaclang.balzac.web/pom.xml | 2 +- .../xyz/balzaclang/web/WebUtilsServlet.xtend | 2 +- .../balzaclang/compiler/ScriptCompiler.xtend | 4 +- .../generator/KeyStoreGenerator.xtend | 4 +- .../generator/RawTransactionGenerator.xtend | 2 +- .../src/xyz/balzaclang/utils/ASTUtils.java | 18 ++++---- .../validation/BalzacValidator.xtend | 12 ++--- .../xsemantics/interpreter.xsemantics | 6 +-- 32 files changed, 185 insertions(+), 142 deletions(-) rename xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/{ECKeyStore.java => PrivateKeysStore.java} (89%) rename xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/{ECKeyStoreTest.java => PrivateKeysStoreTest.java} (89%) create mode 100644 xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/PrivateKeyTest.java diff --git a/xyz.balzaclang.balzac.cli/.classpath b/xyz.balzaclang.balzac.cli/.classpath index 002ad570..5e8a55fe 100644 --- a/xyz.balzaclang.balzac.cli/.classpath +++ b/xyz.balzaclang.balzac.cli/.classpath @@ -6,11 +6,6 @@ - - - - - @@ -18,12 +13,6 @@ - - - - - - diff --git a/xyz.balzaclang.balzac.examples/src/main/java/bug.balzac b/xyz.balzaclang.balzac.examples/src/main/java/bug.balzac index 6b6d8729..79ad2677 100644 --- a/xyz.balzaclang.balzac.examples/src/main/java/bug.balzac +++ b/xyz.balzaclang.balzac.examples/src/main/java/bug.balzac @@ -16,7 +16,7 @@ const kC = key:cVhDA3Yxkeacnci8WUokAfQT6Nv4tGpmy1GzSYtJdYqDDwZipPPB const kCpub = kB.toPubkey // tx redeemable with Alice's private key -transaction A_funds { +transaction A_funds { input = _ output = 1 BTC: fun(x). versig(kApub; x) } diff --git a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/ECKeyStore.java b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/PrivateKeysStore.java similarity index 89% rename from xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/ECKeyStore.java rename to xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/PrivateKeysStore.java index 0847a467..b10e5d6f 100644 --- a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/ECKeyStore.java +++ b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/PrivateKeysStore.java @@ -46,7 +46,7 @@ import xyz.balzaclang.lib.model.PrivateKey; import xyz.balzaclang.lib.utils.BitcoinUtils; -public class ECKeyStore { +public class PrivateKeysStore { public static String getUniqueID(PrivateKey key) { return BitcoinUtils.encode(Utils.sha256hash160(key.getBytes())); @@ -55,15 +55,16 @@ public static String getUniqueID(PrivateKey key) { private char[] password; private KeyStore ks; private Map netwotkTypeMap = new HashMap<>(); + private Map compressPubkeyMap = new HashMap<>(); /** * Create a new ECKeyStore with an empty password. Use * {@link #changePassword(char[])} to set a new password. - * + * * @return an instance of ECKeyStore * @throws KeyStoreException if an error occur creating the {@link KeyStore} */ - public ECKeyStore() throws KeyStoreException { + public PrivateKeysStore() throws KeyStoreException { this(new char[0]); } @@ -71,24 +72,24 @@ public ECKeyStore() throws KeyStoreException { * Create a new ECKeyStore with the specified password. The same password is * used to store the keystore via {@link #store(File)} and for entries. Use * {@link #changePassword(char[])} to set a new password. - * + * * @param password a password for the store and its entries. * @return an instance of ECKeyStore. * @throws KeyStoreException if an error occur creating the {@link KeyStore} */ - public ECKeyStore(char[] password) throws KeyStoreException { + public PrivateKeysStore(char[] password) throws KeyStoreException { this(null, password); } /** * Load the keystore from the given input stream, or create a new one if null. * The password is used to decrypt the keystore and each entry. - * + * * @param input the input stream from which load the keystore. * @param password a password for the store and its entries. * @throws KeyStoreException */ - public ECKeyStore(InputStream input, char[] password) throws KeyStoreException { + public PrivateKeysStore(InputStream input, char[] password) throws KeyStoreException { this.password = Arrays.copyOf(password, password.length); this.ks = KeyStore.getInstance("pkcs12"); try { @@ -104,6 +105,7 @@ public String addKey(PrivateKey key) throws KeyStoreException { SecretKeyEntry kEntry = new SecretKeyEntry(secretKey); ks.setEntry(keyID, kEntry, new PasswordProtection(password)); netwotkTypeMap.put(keyID, key.getNetworkType()); + compressPubkeyMap.put(keyID, key.compressPublicKey()); return keyID; } @@ -112,7 +114,9 @@ public PrivateKey getKey(String keyID) throws KeyStoreException { Key entryKey; try { entryKey = ks.getKey(keyID, password); - return PrivateKey.from(entryKey.getEncoded(), netwotkTypeMap.get(keyID)); + boolean compressPublicKey = compressPubkeyMap.get(keyID); + NetworkType networkType = netwotkTypeMap.get(keyID); + return PrivateKey.from(entryKey.getEncoded(), compressPublicKey, networkType); } catch (UnrecoverableKeyException | NoSuchAlgorithmException e) { throw new KeyStoreException("Cannot fetch key " + keyID + ": " + e.getMessage(), e); } diff --git a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/PrivateKey.java b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/PrivateKey.java index 8783bb09..4210fb86 100644 --- a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/PrivateKey.java +++ b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/PrivateKey.java @@ -23,6 +23,8 @@ public interface PrivateKey { public byte[] getBytes(); + public boolean compressPublicKey(); + public String getWif(); public String getBytesAsString(); @@ -33,21 +35,21 @@ public interface PrivateKey { public NetworkType getNetworkType(); + public PrivateKey withNetwork(NetworkType networkType); + public static PrivateKey fromBase58(String wif) { DumpedPrivateKey key = DumpedPrivateKey.fromBase58(null, wif); - return from(key.getKey().getPrivKeyBytes(), NetworkType.from(key.getParameters())); + byte[] keyBytes = key.getKey().getPrivKeyBytes(); + boolean compressPubkey = key.isPubKeyCompressed(); + return from(keyBytes, compressPubkey, NetworkType.from(key.getParameters())); } - public static PrivateKey from(byte[] keyBytes, NetworkType params) { - return new PrivateKeyImpl(keyBytes, params); + public static PrivateKey from(byte[] keyBytes, boolean compressPubkey, NetworkType params) { + return new PrivateKeyImpl(keyBytes, compressPubkey, params); } public static PrivateKey fresh(NetworkType params) { - return from(new ECKey().getPrivKeyBytes(), params); + ECKey key = new ECKey(); + return from(key.getPrivKeyBytes(), key.isCompressed(), params); } - - public static PrivateKey copy(PrivateKey key, NetworkType params) { - return from(key.getBytes(), params); - } - } diff --git a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/PrivateKeyImpl.java b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/PrivateKeyImpl.java index a5967378..5f456b1b 100644 --- a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/PrivateKeyImpl.java +++ b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/PrivateKeyImpl.java @@ -26,13 +26,15 @@ class PrivateKeyImpl implements PrivateKey { private final NetworkType params; private final byte[] privkey; + private final boolean compressPubkey; private final PublicKey pubkey; private final Address address; - PrivateKeyImpl(byte[] privkey, NetworkType params) { + PrivateKeyImpl(byte[] privkey, boolean compressPubkey, NetworkType params) { this.params = params; this.privkey = Arrays.copyOf(privkey, privkey.length); - this.pubkey = PublicKey.fromBytes(ECKey.fromPrivate(privkey).getPubKey()); + this.compressPubkey = compressPubkey; + this.pubkey = PublicKey.fromBytes(ECKey.fromPrivate(privkey, compressPubkey).getPubKey()); this.address = Address.fromPubkey(pubkey.getBytes(), params); } @@ -41,9 +43,15 @@ public byte[] getBytes() { return Arrays.copyOf(privkey, privkey.length); } + + @Override + public boolean compressPublicKey() { + return compressPubkey; + } + @Override public String getWif() { - return ECKey.fromPrivate(privkey).getPrivateKeyAsWiF(params.toNetworkParameters()); + return ECKey.fromPrivate(privkey, compressPubkey).getPrivateKeyAsWiF(params.toNetworkParameters()); } @Override @@ -66,6 +74,11 @@ public NetworkType getNetworkType() { return params; } + @Override + public PrivateKey withNetwork(NetworkType networkType) { + return new PrivateKeyImpl(privkey, compressPubkey, networkType); + } + @Override public int hashCode() { final int prime = 31; diff --git a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/Signature.java b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/Signature.java index dbf35e00..bbfbd9dc 100644 --- a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/Signature.java +++ b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/Signature.java @@ -27,7 +27,7 @@ import org.bitcoinj.core.VerificationException; import org.bitcoinj.crypto.TransactionSignature; -import xyz.balzaclang.lib.ECKeyStore; +import xyz.balzaclang.lib.PrivateKeysStore; import xyz.balzaclang.lib.model.transaction.ITransactionBuilder; import xyz.balzaclang.lib.model.transaction.Input; import xyz.balzaclang.lib.model.transaction.Output; @@ -96,7 +96,7 @@ public boolean equals(Object obj) { public static Signature computeSignature( PrivateKey key, ITransactionBuilder txBuilder, - ECKeyStore keyStore, + PrivateKeysStore keyStore, int inputIndex, SignatureModifier modifier) { diff --git a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/script/AbstractScriptBuilder.java b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/script/AbstractScriptBuilder.java index 695284bd..36f11d58 100644 --- a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/script/AbstractScriptBuilder.java +++ b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/script/AbstractScriptBuilder.java @@ -34,7 +34,7 @@ *

* Examples: *

- * + * *
  * // OK
  * new AbstractScriptBuilder(){}.number(42).number(5).data(new byte[]{})
@@ -128,22 +128,22 @@ public Script build() {
      * 
      * 
      * 
-     * 
+     *
      * 
      * ... 42 (TOALTSTACK FROMALTSTACK)* 21 ...
      * 
- * + * * * - * + * *
      * ... 42 21 ...
      * 
- * + * * * * - * + * * @return this builder */ @SuppressWarnings("unchecked") @@ -157,7 +157,7 @@ public T optimize() { /** * Optimize the given script, returning a copy. A copy is returned even if no * optimization can be performed. - * + * * @param script the script to optimize. * @return an optimized script. */ diff --git a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/script/AbstractScriptBuilderWithVar.java b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/script/AbstractScriptBuilderWithVar.java index 5e2711b6..c9d24c1e 100644 --- a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/script/AbstractScriptBuilderWithVar.java +++ b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/script/AbstractScriptBuilderWithVar.java @@ -49,7 +49,7 @@ import org.bitcoinj.script.ScriptChunk; import org.bitcoinj.script.ScriptOpCodes; -import xyz.balzaclang.lib.ECKeyStore; +import xyz.balzaclang.lib.PrivateKeysStore; import xyz.balzaclang.lib.model.Hash; import xyz.balzaclang.lib.model.PrivateKey; import xyz.balzaclang.lib.model.Signature; @@ -221,7 +221,7 @@ private Script substituteAllBinding() { /** * Replace all the signatures placeholder with the actual signatures. Each * placeholder is already associated with the key and the modifiers. - * + * * @param tx the transaction to be signed * @param inputIndex the index of the input that will contain this script * @param outScript the redeemed output script @@ -229,7 +229,7 @@ private Script substituteAllBinding() { * @throws KeyStoreException if an error occurs retrieving private keys */ @SuppressWarnings("unchecked") - public T setAllSignatures(ECKeyStore keystore, Transaction tx, int inputIndex, byte[] outScript, boolean isP2PKH) + public T setAllSignatures(PrivateKeysStore keystore, Transaction tx, int inputIndex, byte[] outScript, boolean isP2PKH) throws KeyStoreException { List newChunks = new ArrayList<>(); @@ -284,7 +284,7 @@ public T setAllSignatures(ECKeyStore keystore, Transaction tx, int inputIndex, b /** * Append the given script to this builder. - * + * * @param append the script to append * @return this builder */ @@ -296,7 +296,7 @@ public T append(Script append) { /** * Append the given script builder to this one. If it contains some free * variables or signatures placeholder, they are merged ensuring consistency. - * + * * @param the concrete type of the given builder * @param append the script builder to append * @return this builder @@ -352,7 +352,7 @@ else if (isSignature(ch)) { /** * Extract a string representation of this builder. - * + * * @return a string representing this builder */ public String serialize() { @@ -365,7 +365,7 @@ public String serialize() { /** * Parse the given string to initialize this builder. - * + * * @param str a string representation of this builder * @return this builder */ diff --git a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/transaction/ITransactionBuilder.java b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/transaction/ITransactionBuilder.java index d0ab0e45..95cda404 100644 --- a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/transaction/ITransactionBuilder.java +++ b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/transaction/ITransactionBuilder.java @@ -24,7 +24,7 @@ import org.bitcoinj.core.Transaction; import org.bitcoinj.core.Utils; -import xyz.balzaclang.lib.ECKeyStore; +import xyz.balzaclang.lib.PrivateKeysStore; import xyz.balzaclang.lib.model.NetworkType; import xyz.balzaclang.lib.utils.EnvI; @@ -33,7 +33,7 @@ public interface ITransactionBuilder extends EnvI, /** * Check that this transaction builder is ready to be converted using * {@link #toTransaction()}. - * + * * @return true if this transaction builder is ready to be converted, false * otherwise. */ @@ -42,23 +42,23 @@ public interface ITransactionBuilder extends EnvI, /** * Create a bitcoinj transaction. This method assumes that this builder * {@link #isReady()} (i.e. has not unbound free variables. - * + * * @param kstore a keystore containing the private keys needed for transaction * building. * @return a bitcoinj transaction. */ - public abstract Transaction toTransaction(ECKeyStore kstore); + public abstract Transaction toTransaction(PrivateKeysStore kstore); /** * Return the inputs. - * + * * @return the inputs */ public abstract List getInputs(); /** * Return the number of outputs. - * + * * @return the number of outputs */ public abstract List getOutputs(); @@ -66,7 +66,7 @@ public interface ITransactionBuilder extends EnvI, /** * Return true if this builder will generate a coinbase transaction, false * otherwise. - * + * * @return true if this builder will generate a coinbase transaction, false * otherwise. */ @@ -74,7 +74,7 @@ public interface ITransactionBuilder extends EnvI, /** * Return a transaction builder from a bitcoin serialized transaction - * + * * @param params the network parameters * @param bytes the payload of the transaction * @return the builder @@ -86,7 +86,7 @@ public static ITransactionBuilder fromSerializedTransaction(NetworkType params, /** * Return a transaction builder from a {@link Transaction}. Same of * fromSerializedTransaction(tx.getParams(), tx.bitcoinSerialize()} - * + * * @param tx a bitcoin transaction * @return the builder */ @@ -96,7 +96,7 @@ public static ITransactionBuilder fromSerializedTransaction(Transaction tx) { /** * Return a transaction builder from a bitcoin serialized transaction - * + * * @param params the network parameters * @param bytes the payload of the transaction * @return the builder @@ -105,7 +105,7 @@ public static ITransactionBuilder fromSerializedTransaction(NetworkType params, return new SerialTransactionBuilder(params, bytes); } - public static boolean equals(ITransactionBuilder a, ITransactionBuilder b, ECKeyStore kstore) { + public static boolean equals(ITransactionBuilder a, ITransactionBuilder b, PrivateKeysStore kstore) { checkNotNull(a); checkNotNull(b); if (a instanceof TransactionBuilder && b instanceof TransactionBuilder) { diff --git a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/transaction/SerialTransactionBuilder.java b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/transaction/SerialTransactionBuilder.java index c33f0655..5b2de9ef 100644 --- a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/transaction/SerialTransactionBuilder.java +++ b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/transaction/SerialTransactionBuilder.java @@ -25,7 +25,7 @@ import org.bitcoinj.script.Script; import org.bitcoinj.script.ScriptPattern; -import xyz.balzaclang.lib.ECKeyStore; +import xyz.balzaclang.lib.PrivateKeysStore; import xyz.balzaclang.lib.model.NetworkType; import xyz.balzaclang.lib.model.script.InputScript; import xyz.balzaclang.lib.model.script.OutputScript; @@ -57,7 +57,7 @@ public boolean isReady() { } @Override - public Transaction toTransaction(ECKeyStore kstore) { + public Transaction toTransaction(PrivateKeysStore kstore) { return getTx(); } diff --git a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/transaction/TransactionBuilder.java b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/transaction/TransactionBuilder.java index ca6d91db..49426ea4 100644 --- a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/transaction/TransactionBuilder.java +++ b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/model/transaction/TransactionBuilder.java @@ -43,7 +43,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; -import xyz.balzaclang.lib.ECKeyStore; +import xyz.balzaclang.lib.PrivateKeysStore; import xyz.balzaclang.lib.model.NetworkType; import xyz.balzaclang.lib.model.script.InputScript; import xyz.balzaclang.lib.model.script.OutputScript; @@ -235,7 +235,7 @@ public TransactionBuilder removeUnusedVariables() { * valid input. In this way, we avoid to expose other implementation details, * even to subclasses *

- * + * * @param inputScript the input script that redeem {@code tx} at * {@code outIndex}. * @return this builder. @@ -252,7 +252,7 @@ protected TransactionBuilder addInput(InputScript inputScript) { /** * Add a new transaction input. - * + * * @param tx the parent transaction to redeem. * @param outIndex the index of the output script to redeem. * @param inputScript the input script that redeem {@code tx} at @@ -269,7 +269,7 @@ public TransactionBuilder addInput(ITransactionBuilder tx, int outIndex, InputSc /** * Add a new transaction input. - * + * * @param tx the parent transaction to redeem. * @param outIndex the index of the output script to redeem. * @param inputScript the input script that redeem {@code tx} at @@ -307,7 +307,7 @@ public TransactionBuilder addInput(Input input) { /** * Add a new transaction output. - * + * * @param outputScript the output script. * @param satoshis the amount of satoshis of the output. * @return this builder. @@ -336,7 +336,7 @@ public TransactionBuilder addOutput(OutputScript outputScript, long satoshis) { /** * Set the transaction locktime (absolute locktime which could represent a block * number or a timestamp). - * + * * @param locktime the value to set. * @return this builder. */ @@ -348,7 +348,7 @@ public TransactionBuilder setLocktime(long locktime) { /** * Recursively check that this transaction and all the ancestors don't have free * variables. - * + * * @return true if this transaction and all the ancestors don't have free * variables, false otherwise. */ @@ -359,7 +359,7 @@ public boolean isReady() { } @Override - public Transaction toTransaction(ECKeyStore keystore) { + public Transaction toTransaction(PrivateKeysStore keystore) { checkState(this.isReady(), "the transaction and all its ancestors are not ready"); Transaction tx = new Transaction(params.toNetworkParameters()); @@ -394,7 +394,6 @@ public Transaction toTransaction(ECKeyStore keystore) { else { txInput.setSequenceNumber(input.getLocktime()); } -// txInput.setScriptSig(input.script.build()); tx.addInput(txInput); } } diff --git a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/utils/EnvI.java b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/utils/EnvI.java index 5a2fe8e3..9efa1203 100644 --- a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/utils/EnvI.java +++ b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/utils/EnvI.java @@ -66,7 +66,7 @@ public interface EnvI> extends Serializable { /** * Return the value of the variable {@code name}, casted to the given class. - * + * * @param a type that extends T * @param name the variable name * @param clazz the expected class of the object diff --git a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/utils/ServerSocketDaemon.java b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/utils/ServerSocketDaemon.java index 5dd88380..e4c24182 100644 --- a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/utils/ServerSocketDaemon.java +++ b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/utils/ServerSocketDaemon.java @@ -52,7 +52,7 @@ public ServerSocketDaemon() { /** * Create a new daemon a the specified port number. - * + * * @param port the port that the daemon will use. */ public ServerSocketDaemon(int port) { @@ -63,7 +63,7 @@ public ServerSocketDaemon(int port) { /** * Return the server port. If might be different from the {@code port} parameter * given in the constructor. - * + * * @return the server port */ public int getPort() { @@ -72,7 +72,7 @@ public int getPort() { /** * Check if the server is running. - * + * * @return true if the server started correctly, false otherwise. */ public boolean isOnline() { @@ -81,7 +81,7 @@ public boolean isOnline() { /** * Block until the server is online and waiting for connections. - * + * * @throws InterruptedException if the thread is interrupted */ public void waitUntilOnline() throws InterruptedException { @@ -93,7 +93,7 @@ public void waitUntilOnline() throws InterruptedException { /** * Read a value. If there is no value to read, it blocks until another thread * will send a value through a socket connection. - * + * * @return the read value * @throws InterruptedException if the thread is interrupted */ @@ -105,7 +105,7 @@ public String read() throws InterruptedException { /** * Read a value. If there is no value to read, it blocks until another thread * will send a value through a socket connection or the given timeout expires. - * + * * @param timeout timeout value * @param unit time-unit for the given timeout * @return the read value @@ -212,7 +212,7 @@ public void run() { /** * Return a Socket for this daemon. The socket is creating using * {@code InetAddress.getLocalHost()} as host. - * + * * @return a socket. * @throws IOException if an I/O error occurs when creating the socket. */ @@ -224,7 +224,7 @@ public Socket getSocket() throws IOException { /** * Return a client that allows to write to this server. - * + * * @return the client. * @throws IOException if an I/O error occurs creating the socket. */ diff --git a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/validation/Validator.java b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/validation/Validator.java index bd5f923e..e3d28521 100644 --- a/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/validation/Validator.java +++ b/xyz.balzaclang.balzac.lib/src/main/java/xyz/balzaclang/lib/validation/Validator.java @@ -28,7 +28,7 @@ import org.bitcoinj.script.Script; import org.bitcoinj.script.ScriptException; -import xyz.balzaclang.lib.ECKeyStore; +import xyz.balzaclang.lib.PrivateKeysStore; import xyz.balzaclang.lib.model.NetworkType; import xyz.balzaclang.lib.model.script.OutputScript; import xyz.balzaclang.lib.model.transaction.ITransactionBuilder; @@ -52,7 +52,7 @@ public static ValidationResult checkOutputScriptSize(OutputScript script) { public static ValidationResult checkWitnessesCorrecltySpendsOutputs( ITransactionBuilder txBuilder, - ECKeyStore keyStore) { + PrivateKeysStore keyStore) { // preconditions if (txBuilder.isCoinbase()) { return ValidationResult.ok("Transaction is a coinbase"); diff --git a/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/ECKeyStoreTest.java b/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/PrivateKeysStoreTest.java similarity index 89% rename from xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/ECKeyStoreTest.java rename to xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/PrivateKeysStoreTest.java index fe4aaebe..61cdcbf1 100644 --- a/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/ECKeyStoreTest.java +++ b/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/PrivateKeysStoreTest.java @@ -26,11 +26,11 @@ import xyz.balzaclang.lib.model.NetworkType; import xyz.balzaclang.lib.model.PrivateKey; -public class ECKeyStoreTest { +public class PrivateKeysStoreTest { @Test public void changePassword() throws KeyStoreException { - ECKeyStore ks = new ECKeyStore(); + PrivateKeysStore ks = new PrivateKeysStore(); PrivateKey k1 = PrivateKey.fresh(NetworkType.TESTNET); // add a key @@ -40,7 +40,7 @@ public void changePassword() throws KeyStoreException { ks.changePassword("test".toCharArray()); // retrieve the key - PrivateKey k2 = ks.getKey(ECKeyStore.getUniqueID(k1)); + PrivateKey k2 = ks.getKey(PrivateKeysStore.getUniqueID(k1)); assertTrue(ks.containsKey(alias1)); assertArrayEquals(k1.getBytes(), k2.getBytes()); diff --git a/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/HashTest.java b/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/HashTest.java index 948c1e2e..7c43fefd 100644 --- a/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/HashTest.java +++ b/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/HashTest.java @@ -26,7 +26,6 @@ import org.bitcoinj.script.ScriptOpCodes; import org.junit.Test; -import xyz.balzaclang.lib.model.Hash; import xyz.balzaclang.lib.model.Hash.HashAlgorithm; import xyz.balzaclang.lib.utils.BitcoinUtils; diff --git a/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/PrivateKeyTest.java b/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/PrivateKeyTest.java new file mode 100644 index 00000000..94a99c21 --- /dev/null +++ b/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/PrivateKeyTest.java @@ -0,0 +1,45 @@ +/* + * Copyright 2021 Nicola Atzei + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package xyz.balzaclang.lib.model; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class PrivateKeyTest { + + private NetworkType networkType = NetworkType.TESTNET; + + @Test + public void testCompressedKeysEquality() { + + byte[] bytes = new byte[] { 1, 2, 3, 4 }; + + PrivateKey k1 = PrivateKey.from(bytes, true, networkType); + PrivateKey k2 = PrivateKey.from(bytes, false, networkType); + + assertTrue(k1.equals(k2)); + assertFalse(k1.toPublicKey().equals(k2.toPublicKey())); + assertFalse(k1.toAddress().equals(k2.toAddress())); + + assertEquals("cMahea7zqjxrtgAbB7LSGbcQUr1uX1ojuat9jZodN7H9U97a6MPk", k1.getWif()); + assertEquals("91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFanNnRJd2keY", k2.getWif()); + + assertEquals("mnmhLRXDxpNzA6Wr99wZNRQcQWzQk2uRs5", k1.toAddress().getWif()); + assertEquals("mkRANnsZDHb6cp1uUGvdNQQaDCToDKRW9Q", k2.toAddress().getWif()); + } +} diff --git a/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/script/AbstractScriptBuilderTest.java b/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/script/AbstractScriptBuilderTest.java index 2044957e..5000a88e 100644 --- a/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/script/AbstractScriptBuilderTest.java +++ b/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/script/AbstractScriptBuilderTest.java @@ -27,8 +27,7 @@ import org.bitcoinj.script.ScriptBuilder; import org.junit.Test; -import xyz.balzaclang.lib.model.script.AbstractScriptBuilder; -import static xyz.balzaclang.lib.model.script.AbstractScriptBuilderWithVar.ScriptBuilderWithVar; +import xyz.balzaclang.lib.model.script.AbstractScriptBuilderWithVar.ScriptBuilderWithVar; public class AbstractScriptBuilderTest { diff --git a/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/script/ScriptBuilderWithVarTest.java b/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/script/ScriptBuilderWithVarTest.java index 8a297462..0102586e 100644 --- a/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/script/ScriptBuilderWithVarTest.java +++ b/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/script/ScriptBuilderWithVarTest.java @@ -34,18 +34,18 @@ import org.junit.Before; import org.junit.Test; -import xyz.balzaclang.lib.ECKeyStore; +import xyz.balzaclang.lib.PrivateKeysStore; import xyz.balzaclang.lib.model.NetworkType; import xyz.balzaclang.lib.model.PrivateKey; import xyz.balzaclang.lib.model.script.AbstractScriptBuilderWithVar.ScriptBuilderWithVar; public class ScriptBuilderWithVarTest { - ECKeyStore ecks; + PrivateKeysStore ecks; @Before public void before() throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException { - ecks = new ECKeyStore(); + ecks = new PrivateKeysStore(); ecks.changePassword(new char[] { 't', 'e', 's', 't' }); } @@ -163,9 +163,9 @@ public void test_serialize_signature1() { SigHash hashType = SigHash.ALL; ScriptBuilderWithVar sb = new ScriptBuilderWithVar(); sb.number(15); - sb.signaturePlaceholder(ECKeyStore.getUniqueID(key), hashType, false); + sb.signaturePlaceholder(PrivateKeysStore.getUniqueID(key), hashType, false); - String expected = "15 [sig," + ECKeyStore.getUniqueID(key) + ",AIAO]"; + String expected = "15 [sig," + PrivateKeysStore.getUniqueID(key) + ",AIAO]"; String actual = sb.serialize(); assertEquals(expected, actual); } @@ -176,9 +176,9 @@ public void test_serialize_signature2() { SigHash hashType = SigHash.ALL; ScriptBuilderWithVar sb = new ScriptBuilderWithVar(); sb.number(15); - sb.signaturePlaceholder(ECKeyStore.getUniqueID(key), hashType, true); + sb.signaturePlaceholder(PrivateKeysStore.getUniqueID(key), hashType, true); - String expected = "15 [sig," + ECKeyStore.getUniqueID(key) + ",SIAO]"; + String expected = "15 [sig," + PrivateKeysStore.getUniqueID(key) + ",SIAO]"; String actual = sb.serialize(); assertEquals(expected, actual); } @@ -189,9 +189,9 @@ public void test_serialize_signature3() { SigHash hashType = SigHash.SINGLE; ScriptBuilderWithVar sb = new ScriptBuilderWithVar(); sb.number(15); - sb.signaturePlaceholder(ECKeyStore.getUniqueID(key), hashType, false); + sb.signaturePlaceholder(PrivateKeysStore.getUniqueID(key), hashType, false); - String expected = "15 [sig," + ECKeyStore.getUniqueID(key) + ",AISO]"; + String expected = "15 [sig," + PrivateKeysStore.getUniqueID(key) + ",AISO]"; String actual = sb.serialize(); assertEquals(expected, actual); } @@ -202,9 +202,9 @@ public void test_serialize_signature4() { SigHash hashType = SigHash.SINGLE; ScriptBuilderWithVar sb = new ScriptBuilderWithVar(); sb.number(15); - sb.signaturePlaceholder(ECKeyStore.getUniqueID(key), hashType, true); + sb.signaturePlaceholder(PrivateKeysStore.getUniqueID(key), hashType, true); - String expected = "15 [sig," + ECKeyStore.getUniqueID(key) + ",SISO]"; + String expected = "15 [sig," + PrivateKeysStore.getUniqueID(key) + ",SISO]"; String actual = sb.serialize(); assertEquals(expected, actual); } @@ -215,9 +215,9 @@ public void test_serialize_signature5() { SigHash hashType = SigHash.NONE; ScriptBuilderWithVar sb = new ScriptBuilderWithVar(); sb.number(15); - sb.signaturePlaceholder(ECKeyStore.getUniqueID(key), hashType, false); + sb.signaturePlaceholder(PrivateKeysStore.getUniqueID(key), hashType, false); - String expected = "15 [sig," + ECKeyStore.getUniqueID(key) + ",AINO]"; + String expected = "15 [sig," + PrivateKeysStore.getUniqueID(key) + ",AINO]"; String actual = sb.serialize(); assertEquals(expected, actual); } @@ -228,9 +228,9 @@ public void test_serialize_signature6() { SigHash hashType = SigHash.NONE; ScriptBuilderWithVar sb = new ScriptBuilderWithVar(); sb.number(15); - sb.signaturePlaceholder(ECKeyStore.getUniqueID(key), hashType, true); + sb.signaturePlaceholder(PrivateKeysStore.getUniqueID(key), hashType, true); - String expected = "15 [sig," + ECKeyStore.getUniqueID(key) + ",SINO]"; + String expected = "15 [sig," + PrivateKeysStore.getUniqueID(key) + ",SINO]"; String actual = sb.serialize(); assertEquals(expected, actual); } @@ -238,7 +238,7 @@ public void test_serialize_signature6() { @Test public void test_derialize_signature() throws KeyStoreException { PrivateKey key = PrivateKey.fresh(NetworkType.TESTNET); - String keyID = ECKeyStore.getUniqueID(key); + String keyID = PrivateKeysStore.getUniqueID(key); String serialScript = "15 [sig," + keyID + ",AIAO]"; ScriptBuilderWithVar res = new ScriptBuilderWithVar(serialScript); diff --git a/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/transaction/ITransactionBuilderTest.java b/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/transaction/ITransactionBuilderTest.java index 992a8195..54ee965d 100644 --- a/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/transaction/ITransactionBuilderTest.java +++ b/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/transaction/ITransactionBuilderTest.java @@ -22,10 +22,8 @@ import org.junit.Test; -import xyz.balzaclang.lib.ECKeyStore; +import xyz.balzaclang.lib.PrivateKeysStore; import xyz.balzaclang.lib.model.NetworkType; -import xyz.balzaclang.lib.model.transaction.ITransactionBuilder; -import xyz.balzaclang.lib.model.transaction.SerialTransactionBuilder; import xyz.balzaclang.lib.utils.BitcoinUtils; public class ITransactionBuilderTest { @@ -37,7 +35,7 @@ public void test_twoSerialedTransactionsAreEquals() throws KeyStoreException { SerialTransactionBuilder serial2 = new SerialTransactionBuilder(NetworkType.MAINNET, BitcoinUtils.decode( "020000000167cb3934c8e2d6e5a976eb927cbb792b060ae9ed5bb53c7347e8ac05314455f0000000006b483045022100b8baf18e4711c90b5484634670aca585535a8777bac3d4e8c4b7ea3f460ff0130220242fec7028332c65c347f64f2b508275e7453fcabc3f770c4fcdb8facb11805f0121033806fe039c8d149c8e68f4665b4a479acab773b20bddf7df0df59ba4f0567341ffffffff0100e1f505000000001976a914c0cc4b28d2402bb28429f8d9b8e22a815678b03388ac00000000")); assertTrue(serial1.equals(serial2)); - assertTrue(ITransactionBuilder.equals(serial1, serial2, new ECKeyStore())); + assertTrue(ITransactionBuilder.equals(serial1, serial2, new PrivateKeysStore())); } @Test @@ -47,7 +45,7 @@ public void test_twoSerialedTransactionsWithDifferentNetworkAreNotEqual() throws SerialTransactionBuilder serial2 = new SerialTransactionBuilder(NetworkType.TESTNET, BitcoinUtils.decode( "020000000167cb3934c8e2d6e5a976eb927cbb792b060ae9ed5bb53c7347e8ac05314455f0000000006b483045022100b8baf18e4711c90b5484634670aca585535a8777bac3d4e8c4b7ea3f460ff0130220242fec7028332c65c347f64f2b508275e7453fcabc3f770c4fcdb8facb11805f0121033806fe039c8d149c8e68f4665b4a479acab773b20bddf7df0df59ba4f0567341ffffffff0100e1f505000000001976a914c0cc4b28d2402bb28429f8d9b8e22a815678b03388ac00000000")); assertFalse(serial1.equals(serial2)); - assertFalse(ITransactionBuilder.equals(serial1, serial2, new ECKeyStore())); + assertFalse(ITransactionBuilder.equals(serial1, serial2, new PrivateKeysStore())); } } diff --git a/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/transaction/TransactionBuilderTest.java b/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/transaction/TransactionBuilderTest.java index 6e1ce408..57be327d 100644 --- a/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/transaction/TransactionBuilderTest.java +++ b/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/model/transaction/TransactionBuilderTest.java @@ -26,10 +26,6 @@ import xyz.balzaclang.lib.model.NetworkType; import xyz.balzaclang.lib.model.script.InputScript; import xyz.balzaclang.lib.model.script.OutputScript; -import xyz.balzaclang.lib.model.transaction.CoinbaseTransactionBuilder; -import xyz.balzaclang.lib.model.transaction.ITransactionBuilder; -import xyz.balzaclang.lib.model.transaction.Input; -import xyz.balzaclang.lib.model.transaction.TransactionBuilder; import xyz.balzaclang.lib.utils.ObjectUtils; public class TransactionBuilderTest { diff --git a/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/utils/EnvTest.java b/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/utils/EnvTest.java index 5ea93eb8..228dcd55 100644 --- a/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/utils/EnvTest.java +++ b/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/utils/EnvTest.java @@ -15,12 +15,13 @@ */ package xyz.balzaclang.lib.utils; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import org.junit.Test; -import xyz.balzaclang.lib.utils.Env; - public class EnvTest { @Test diff --git a/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/utils/PlaceholderUtilsTest.java b/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/utils/PlaceholderUtilsTest.java index b136bedc..b5f6c942 100644 --- a/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/utils/PlaceholderUtilsTest.java +++ b/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/utils/PlaceholderUtilsTest.java @@ -25,7 +25,6 @@ import xyz.balzaclang.lib.model.NetworkType; import xyz.balzaclang.lib.model.transaction.ITransactionBuilder; import xyz.balzaclang.lib.model.transaction.Output; -import xyz.balzaclang.lib.utils.PlaceholderUtils; public class PlaceholderUtilsTest { diff --git a/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/utils/ServerSocketDaemonTest.java b/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/utils/ServerSocketDaemonTest.java index cc493fd8..34818c84 100644 --- a/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/utils/ServerSocketDaemonTest.java +++ b/xyz.balzaclang.balzac.lib/src/test/java/xyz/balzaclang/lib/utils/ServerSocketDaemonTest.java @@ -24,7 +24,6 @@ import org.junit.Ignore; import org.junit.Test; -import xyz.balzaclang.lib.utils.ServerSocketDaemon; import xyz.balzaclang.lib.utils.ServerSocketDaemon.ServerSocketClient; @Ignore diff --git a/xyz.balzaclang.balzac.web/pom.xml b/xyz.balzaclang.balzac.web/pom.xml index 8d66e4b1..56ba8a3e 100644 --- a/xyz.balzaclang.balzac.web/pom.xml +++ b/xyz.balzaclang.balzac.web/pom.xml @@ -185,6 +185,6 @@ commons-io commons-io 2.6 - + diff --git a/xyz.balzaclang.balzac.web/src/xyz/balzaclang/web/WebUtilsServlet.xtend b/xyz.balzaclang.balzac.web/src/xyz/balzaclang/web/WebUtilsServlet.xtend index d36ded6b..60a9cac9 100644 --- a/xyz.balzaclang.balzac.web/src/xyz/balzaclang/web/WebUtilsServlet.xtend +++ b/xyz.balzaclang.balzac.web/src/xyz/balzaclang/web/WebUtilsServlet.xtend @@ -66,7 +66,7 @@ class WebUtilsServlet extends HttpServlet { if (req.requestURI.contains("/api/keys")) { val key = PrivateKey.fresh(NetworkType.TESTNET) val privkeyTestnet = key.wif - val privkeyMainnet = PrivateKey.copy(key, NetworkType.MAINNET).wif + val privkeyMainnet = key.withNetwork(NetworkType.MAINNET).wif val publickey = key.toPublicKey.bytesAsString val addressTestnet = Address.from(key.toPublicKey, NetworkType.TESTNET).wif val addressMainnet = Address.from(key.toPublicKey, NetworkType.MAINNET).wif diff --git a/xyz.balzaclang.balzac/src/xyz/balzaclang/compiler/ScriptCompiler.xtend b/xyz.balzaclang.balzac/src/xyz/balzaclang/compiler/ScriptCompiler.xtend index ee40ff0a..e68adf50 100644 --- a/xyz.balzaclang.balzac/src/xyz/balzaclang/compiler/ScriptCompiler.xtend +++ b/xyz.balzaclang.balzac/src/xyz/balzaclang/compiler/ScriptCompiler.xtend @@ -64,7 +64,6 @@ import xyz.balzaclang.balzac.Size import xyz.balzaclang.balzac.StringLiteral import xyz.balzaclang.balzac.TransactionParameter import xyz.balzaclang.balzac.Versig -import xyz.balzaclang.lib.ECKeyStore import xyz.balzaclang.lib.model.Address import xyz.balzaclang.lib.model.PrivateKey import xyz.balzaclang.lib.model.PublicKey @@ -82,6 +81,7 @@ import xyz.balzaclang.xsemantics.Rho import static xyz.balzaclang.lib.model.script.ScriptOpCodes.* import static extension xyz.balzaclang.utils.ASTExtensions.* +import xyz.balzaclang.lib.PrivateKeysStore /* * EXPRESSIONS @@ -348,7 +348,7 @@ class ScriptCompiler { val key = resKey.first if (key instanceof PrivateKey) { - var sb = new ScriptBuilderWithVar().signaturePlaceholder(ECKeyStore.getUniqueID(key), hashType, anyoneCanPay) + var sb = new ScriptBuilderWithVar().signaturePlaceholder(PrivateKeysStore.getUniqueID(key), hashType, anyoneCanPay) sb } else { diff --git a/xyz.balzaclang.balzac/src/xyz/balzaclang/generator/KeyStoreGenerator.xtend b/xyz.balzaclang.balzac/src/xyz/balzaclang/generator/KeyStoreGenerator.xtend index 7d338e95..2850e921 100644 --- a/xyz.balzaclang.balzac/src/xyz/balzaclang/generator/KeyStoreGenerator.xtend +++ b/xyz.balzaclang.balzac/src/xyz/balzaclang/generator/KeyStoreGenerator.xtend @@ -32,10 +32,10 @@ import org.eclipse.xtext.naming.IQualifiedNameProvider import xyz.balzaclang.balzac.KeyLiteral import xyz.balzaclang.balzac.Model import xyz.balzaclang.balzac.PackageDeclaration -import xyz.balzaclang.lib.ECKeyStore import xyz.balzaclang.lib.model.PrivateKey import xyz.balzaclang.utils.ASTUtils import xyz.balzaclang.utils.SecureStorageUtils +import xyz.balzaclang.lib.PrivateKeysStore class KeyStoreGenerator extends AbstractGenerator { @@ -76,7 +76,7 @@ class KeyStoreGenerator extends AbstractGenerator { val keys = EcoreUtil2.getAllContentsOfType(model, KeyLiteral) try { - val ecks = new ECKeyStore(getKsPassword()) + val ecks = new PrivateKeysStore(getKsPassword()) for (k : keys) { val key = PrivateKey.fromBase58(k.value) diff --git a/xyz.balzaclang.balzac/src/xyz/balzaclang/generator/RawTransactionGenerator.xtend b/xyz.balzaclang.balzac/src/xyz/balzaclang/generator/RawTransactionGenerator.xtend index 18b9323d..1aca108e 100644 --- a/xyz.balzaclang.balzac/src/xyz/balzaclang/generator/RawTransactionGenerator.xtend +++ b/xyz.balzaclang.balzac/src/xyz/balzaclang/generator/RawTransactionGenerator.xtend @@ -86,7 +86,7 @@ class RawTransactionGenerator extends AbstractGenerator { sb.append(nodeString).append("\n") if (obj instanceof ITransactionBuilder) { - val tx = obj.toTransaction(astUtils.getECKeyStore(model)) + val tx = obj.toTransaction(astUtils.getPrivateKeysStore(model)) sb.append(tx).append("\n") sb.append(BitcoinUtils.encode(tx.bitcoinSerialize)).append("\n\n\n") // sb.append(obj).append("\n\n\n") diff --git a/xyz.balzaclang.balzac/src/xyz/balzaclang/utils/ASTUtils.java b/xyz.balzaclang.balzac/src/xyz/balzaclang/utils/ASTUtils.java index 4fc2690d..5c5b253f 100644 --- a/xyz.balzaclang.balzac/src/xyz/balzaclang/utils/ASTUtils.java +++ b/xyz.balzaclang.balzac/src/xyz/balzaclang/utils/ASTUtils.java @@ -64,7 +64,7 @@ import xyz.balzaclang.balzac.TransactionType; import xyz.balzaclang.balzac.Type; import xyz.balzaclang.balzac.Versig; -import xyz.balzaclang.lib.ECKeyStore; +import xyz.balzaclang.lib.PrivateKeysStore; import xyz.balzaclang.lib.model.Address; import xyz.balzaclang.lib.model.Hash; import xyz.balzaclang.lib.model.NetworkType; @@ -90,19 +90,19 @@ public class ASTUtils { private static final String cacheECKeyStoreID = "eckeystore"; - public ECKeyStore getECKeyStore(EObject obj) throws KeyStoreException { + public PrivateKeysStore getPrivateKeysStore(EObject obj) throws KeyStoreException { Resource resource = obj.eResource(); logger.debug("Get the ECKeyStore for resource " + resource); try { - ECKeyStore value = cache.get(cacheECKeyStoreID, resource, new Provider() { + PrivateKeysStore value = cache.get(cacheECKeyStoreID, resource, new Provider() { @Override - public ECKeyStore get() { + public PrivateKeysStore get() { logger.debug("Generating new ECKeyStore for resource " + resource); - ECKeyStore kstore; + PrivateKeysStore kstore; try { - kstore = new ECKeyStore(); + kstore = new PrivateKeysStore(); EObject root = EcoreUtil2.getRootContainer(obj); List keys = EcoreUtil2.getAllContentsOfType(root, KeyLiteral.class); keys.add(getPlaceholderPrivateKey(obj)); @@ -112,7 +112,7 @@ public ECKeyStore get() { } return kstore; } catch (KeyStoreException e) { - logger.error("Error when creating the ECKeyStore for resource " + resource); + logger.error("Error when creating the PrivateKeysStore for resource " + resource); return null; } } @@ -283,7 +283,7 @@ public boolean isDelayTruncated(long seconds) { /** * Cast the given number to unsigned-short (16 bit) - * + * * @param i the number to cast * @return the number itself * @throws NumberFormatException if the number does not fit in 16-bit @@ -300,7 +300,7 @@ public long castUnsignedShort(long i) throws NumberFormatException { /** * Return true if the given number fits in 16 bits unsigned. - * + * * @param i the number to check * @return true if it fits, false otherwise */ diff --git a/xyz.balzaclang.balzac/src/xyz/balzaclang/validation/BalzacValidator.xtend b/xyz.balzaclang.balzac/src/xyz/balzaclang/validation/BalzacValidator.xtend index 66e7055a..fd753e3e 100644 --- a/xyz.balzaclang.balzac/src/xyz/balzaclang/validation/BalzacValidator.xtend +++ b/xyz.balzaclang.balzac/src/xyz/balzaclang/validation/BalzacValidator.xtend @@ -69,7 +69,6 @@ import xyz.balzaclang.balzac.TransactionHexLiteral import xyz.balzaclang.balzac.TransactionInputOperation import xyz.balzaclang.balzac.TransactionOutputOperation import xyz.balzaclang.balzac.Versig -import xyz.balzaclang.lib.ECKeyStore import xyz.balzaclang.lib.model.transaction.ITransactionBuilder import xyz.balzaclang.lib.model.transaction.SerialTransactionBuilder import xyz.balzaclang.lib.model.transaction.TransactionBuilder @@ -80,6 +79,7 @@ import xyz.balzaclang.xsemantics.BalzacInterpreter import xyz.balzaclang.xsemantics.Rho import static extension xyz.balzaclang.utils.ASTExtensions.* +import xyz.balzaclang.lib.PrivateKeysStore /** * This class contains custom validation rules. @@ -647,7 +647,7 @@ class BalzacValidator extends AbstractBalzacValidator { /* * Verify that the input correctly spends the output */ - hasError = !correctlySpendsOutput(txBuilder, tx.ECKeyStore, source, sourceIsTx) + hasError = !correctlySpendsOutput(txBuilder, tx.privateKeysStore, source, sourceIsTx) if(hasError) return false; // interrupt the check @@ -751,7 +751,7 @@ class BalzacValidator extends AbstractBalzacValidator { if (!txA.ready || !txB.ready) return true - if (txA.toTransaction(inputA.ECKeyStore) == txB.toTransaction(inputB.ECKeyStore) && inputA.outpoint==inputB.outpoint + if (txA.toTransaction(inputA.privateKeysStore) == txB.toTransaction(inputB.privateKeysStore) && inputA.outpoint==inputB.outpoint ) { error( "Double spending. You cannot redeem the output twice.", @@ -800,7 +800,7 @@ class BalzacValidator extends AbstractBalzacValidator { return true; } - def boolean correctlySpendsOutput(TransactionBuilder txBuilder, ECKeyStore keystore, EObject source, boolean sourceIsTx) { + def boolean correctlySpendsOutput(TransactionBuilder txBuilder, PrivateKeysStore keystore, EObject source, boolean sourceIsTx) { val validationResult = Validator.checkWitnessesCorrecltySpendsOutputs(txBuilder, keystore) @@ -945,7 +945,7 @@ class BalzacValidator extends AbstractBalzacValidator { return; } - if ( ITransactionBuilder.equals(tx1.first as ITransactionBuilder, tx2.first as ITransactionBuilder, tlock.ECKeyStore) ) + if ( ITransactionBuilder.equals(tx1.first as ITransactionBuilder, tx2.first as ITransactionBuilder, tlock.privateKeysStore) ) error( "Duplicated relative timelock", tlock, @@ -977,7 +977,7 @@ class BalzacValidator extends AbstractBalzacValidator { return; } - if ( ITransactionBuilder.equals(tx.first as ITransactionBuilder, inTx.first as ITransactionBuilder, tlock.ECKeyStore) ) { + if ( ITransactionBuilder.equals(tx.first as ITransactionBuilder, inTx.first as ITransactionBuilder, tlock.privateKeysStore) ) { return } } diff --git a/xyz.balzaclang.balzac/src/xyz/balzaclang/xsemantics/interpreter.xsemantics b/xyz.balzaclang.balzac/src/xyz/balzaclang/xsemantics/interpreter.xsemantics index 136a08da..ed236a97 100644 --- a/xyz.balzaclang.balzac/src/xyz/balzaclang/xsemantics/interpreter.xsemantics +++ b/xyz.balzaclang.balzac/src/xyz/balzaclang/xsemantics/interpreter.xsemantics @@ -252,7 +252,7 @@ from { res = xyz.balzaclang.lib.model.Signature.computeSignature( key, txBuilder, - s.ECKeyStore, + s.privateKeysStore, s.inputIdx, s.modifier.toSignatureModifier ) @@ -436,7 +436,7 @@ from { G |- comparison.left |> rho ~> var ITransactionBuilder leftResult G |- comparison.right |> rho ~> var ITransactionBuilder rightResult - var areEqual = ITransactionBuilder.equals(leftResult,rightResult,comparison.ECKeyStore) + var areEqual = ITransactionBuilder.equals(leftResult,rightResult,comparison.privateKeysStore) result = switch(comparison.op) { case "==": areEqual @@ -736,7 +736,7 @@ from { G |- op.tx |> rho ~> var ITransactionBuilder txB try { - val tx = txB.toTransaction(op.ECKeyStore) + val tx = txB.toTransaction(op.privateKeysStore) result = new Hash(tx.txId.bytes) } catch (KeyStoreException e) {