mirror of
https://github.com/sparrowwallet/drongo.git
synced 2024-11-02 18:26:43 +00:00
support database persistence
This commit is contained in:
parent
42ffeb9565
commit
8e3d0d23c1
11 changed files with 77 additions and 14 deletions
|
@ -55,7 +55,9 @@ dependencies {
|
|||
}
|
||||
implementation ('ch.qos.logback:logback-classic:1.2.3') {
|
||||
exclude group: 'org.hamcrest', module: 'hamcrest-core'
|
||||
exclude group: 'org.slf4j'
|
||||
}
|
||||
implementation ('org.slf4j:slf4j-api:1.7.30')
|
||||
testImplementation ('junit:junit:4.12') {
|
||||
exclude group: 'org.hamcrest', module: 'hamcrest-core'
|
||||
}
|
||||
|
|
|
@ -2,13 +2,14 @@ package com.sparrowwallet.drongo.policy;
|
|||
|
||||
import com.sparrowwallet.drongo.protocol.ScriptType;
|
||||
import com.sparrowwallet.drongo.wallet.Keystore;
|
||||
import com.sparrowwallet.drongo.wallet.Persistable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static com.sparrowwallet.drongo.protocol.ScriptType.*;
|
||||
import static com.sparrowwallet.drongo.policy.PolicyType.*;
|
||||
|
||||
public class Policy {
|
||||
public class Policy extends Persistable {
|
||||
private static final String DEFAULT_NAME = "Default";
|
||||
|
||||
private String name;
|
||||
|
@ -23,6 +24,10 @@ public class Policy {
|
|||
this.miniscript = miniscript;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public Miniscript getMiniscript() {
|
||||
return miniscript;
|
||||
}
|
||||
|
@ -57,6 +62,8 @@ public class Policy {
|
|||
}
|
||||
|
||||
public Policy copy() {
|
||||
return new Policy(name, miniscript.copy());
|
||||
Policy policy = new Policy(name, miniscript.copy());
|
||||
policy.setId(getId());
|
||||
return policy;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ import com.sparrowwallet.drongo.protocol.Sha256Hash;
|
|||
import java.util.Date;
|
||||
import java.util.Objects;
|
||||
|
||||
public abstract class BlockTransactionHash {
|
||||
public abstract class BlockTransactionHash extends Persistable {
|
||||
public static final int BLOCKS_TO_CONFIRM = 6;
|
||||
public static final int BLOCKS_TO_FULLY_CONFIRM = 100;
|
||||
|
||||
|
|
|
@ -96,6 +96,8 @@ public class BlockTransactionHashIndex extends BlockTransactionHash implements C
|
|||
}
|
||||
|
||||
public BlockTransactionHashIndex copy() {
|
||||
return new BlockTransactionHashIndex(super.getHash(), super.getHeight(), super.getDate(), super.getFee(), index, value, spentBy == null ? null : spentBy.copy(), super.getLabel());
|
||||
BlockTransactionHashIndex copy = new BlockTransactionHashIndex(super.getHash(), super.getHeight(), super.getDate(), super.getFee(), index, value, spentBy == null ? null : spentBy.copy(), super.getLabel());
|
||||
copy.setId(getId());
|
||||
return copy;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@ import com.sparrowwallet.drongo.crypto.*;
|
|||
import java.security.SecureRandom;
|
||||
import java.util.*;
|
||||
|
||||
public class DeterministicSeed implements EncryptableItem {
|
||||
public class DeterministicSeed extends Persistable implements EncryptableItem {
|
||||
public static final int DEFAULT_SEED_ENTROPY_BITS = 128;
|
||||
public static final int MAX_SEED_ENTROPY_BITS = 512;
|
||||
|
||||
|
@ -341,6 +341,7 @@ public class DeterministicSeed implements EncryptableItem {
|
|||
seed = new DeterministicSeed(new ArrayList<>(mnemonicCode), needsPassphrase, creationTimeSeconds, type);
|
||||
}
|
||||
|
||||
seed.setId(getId());
|
||||
seed.setPassphrase(passphrase);
|
||||
return seed;
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ import com.sparrowwallet.drongo.crypto.*;
|
|||
|
||||
import java.util.List;
|
||||
|
||||
public class Keystore {
|
||||
public class Keystore extends Persistable {
|
||||
public static final String DEFAULT_LABEL = "Keystore 1";
|
||||
public static final int MAX_LABEL_LENGTH = 16;
|
||||
|
||||
|
@ -229,6 +229,7 @@ public class Keystore {
|
|||
|
||||
public Keystore copy() {
|
||||
Keystore copy = new Keystore(label);
|
||||
copy.setId(getId());
|
||||
copy.setSource(source);
|
||||
copy.setWalletModel(walletModel);
|
||||
if(keyDerivation != null) {
|
||||
|
|
|
@ -6,7 +6,7 @@ import com.sparrowwallet.drongo.crypto.*;
|
|||
import java.nio.ByteBuffer;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class MasterPrivateExtendedKey implements EncryptableItem {
|
||||
public class MasterPrivateExtendedKey extends Persistable implements EncryptableItem {
|
||||
private final byte[] privateKey;
|
||||
private final byte[] chainCode;
|
||||
|
||||
|
@ -112,11 +112,15 @@ public class MasterPrivateExtendedKey implements EncryptableItem {
|
|||
}
|
||||
|
||||
public MasterPrivateExtendedKey copy() {
|
||||
MasterPrivateExtendedKey copy;
|
||||
if(isEncrypted()) {
|
||||
return new MasterPrivateExtendedKey(encryptedKey.copy());
|
||||
copy = new MasterPrivateExtendedKey(encryptedKey.copy());
|
||||
} else {
|
||||
copy = new MasterPrivateExtendedKey(Arrays.copyOf(privateKey, 32), Arrays.copyOf(chainCode, 32));
|
||||
}
|
||||
|
||||
return new MasterPrivateExtendedKey(Arrays.copyOf(privateKey, 32), Arrays.copyOf(chainCode, 32));
|
||||
copy.setId(getId());
|
||||
return copy;
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
package com.sparrowwallet.drongo.wallet;
|
||||
|
||||
public class Persistable {
|
||||
private Long id;
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
}
|
|
@ -19,12 +19,13 @@ import java.util.stream.Collectors;
|
|||
import static com.sparrowwallet.drongo.protocol.ScriptType.*;
|
||||
import static com.sparrowwallet.drongo.protocol.Transaction.WITNESS_SCALE_FACTOR;
|
||||
|
||||
public class Wallet {
|
||||
public class Wallet extends Persistable {
|
||||
public static final int DEFAULT_LOOKAHEAD = 20;
|
||||
public static final String ALLOW_DERIVATIONS_MATCHING_OTHER_SCRIPT_TYPES_PROPERTY = "com.sparrowwallet.allowDerivationsMatchingOtherScriptTypes";
|
||||
|
||||
private String name;
|
||||
private Wallet masterWallet;
|
||||
private List<Wallet> childWallets = new ArrayList<>();
|
||||
private Network network = Network.get();
|
||||
private PolicyType policyType;
|
||||
private ScriptType scriptType;
|
||||
|
@ -125,10 +126,18 @@ public class Wallet {
|
|||
this.storedBlockHeight = storedBlockHeight;
|
||||
}
|
||||
|
||||
public Integer gapLimit() {
|
||||
return gapLimit;
|
||||
}
|
||||
|
||||
public int getGapLimit() {
|
||||
return gapLimit == null ? DEFAULT_LOOKAHEAD : gapLimit;
|
||||
}
|
||||
|
||||
public void gapLimit(Integer gapLimit) {
|
||||
this.gapLimit = gapLimit;
|
||||
}
|
||||
|
||||
public void setGapLimit(int gapLimit) {
|
||||
this.gapLimit = gapLimit;
|
||||
}
|
||||
|
@ -141,6 +150,10 @@ public class Wallet {
|
|||
this.birthDate = birthDate;
|
||||
}
|
||||
|
||||
public boolean isMasterWallet() {
|
||||
return masterWallet == null;
|
||||
}
|
||||
|
||||
public Wallet getMasterWallet() {
|
||||
return masterWallet;
|
||||
}
|
||||
|
@ -149,6 +162,22 @@ public class Wallet {
|
|||
this.masterWallet = masterWallet;
|
||||
}
|
||||
|
||||
public Wallet getChildWallet(String name) {
|
||||
return childWallets.stream().filter(wallet -> wallet.getName().equals(name)).findFirst().orElse(null);
|
||||
}
|
||||
|
||||
public List<Wallet> getChildWallets() {
|
||||
return childWallets;
|
||||
}
|
||||
|
||||
public void setChildWallets(List<Wallet> childWallets) {
|
||||
this.childWallets = childWallets;
|
||||
}
|
||||
|
||||
public TreeSet<WalletNode> getPurposeNodes() {
|
||||
return purposeNodes;
|
||||
}
|
||||
|
||||
public synchronized WalletNode getNode(KeyPurpose keyPurpose) {
|
||||
WalletNode purposeNode;
|
||||
Optional<WalletNode> optionalPurposeNode = purposeNodes.stream().filter(node -> node.getKeyPurpose().equals(keyPurpose)).findFirst();
|
||||
|
@ -1108,6 +1137,9 @@ public class Wallet {
|
|||
|
||||
public Wallet copy() {
|
||||
Wallet copy = new Wallet(name);
|
||||
copy.setId(getId());
|
||||
copy.setMasterWallet(masterWallet);
|
||||
copy.setChildWallets(childWallets);
|
||||
copy.setPolicyType(policyType);
|
||||
copy.setScriptType(scriptType);
|
||||
copy.setDefaultPolicy(defaultPolicy.copy());
|
||||
|
|
|
@ -7,7 +7,7 @@ import com.sparrowwallet.drongo.crypto.ChildNumber;
|
|||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class WalletNode implements Comparable<WalletNode> {
|
||||
public class WalletNode extends Persistable implements Comparable<WalletNode> {
|
||||
private final String derivationPath;
|
||||
private String label;
|
||||
private TreeSet<WalletNode> children = new TreeSet<>();
|
||||
|
@ -87,7 +87,7 @@ public class WalletNode implements Comparable<WalletNode> {
|
|||
}
|
||||
|
||||
public Set<WalletNode> getChildren() {
|
||||
return children == null ? null : Collections.unmodifiableSet(children);
|
||||
return children;
|
||||
}
|
||||
|
||||
public void setChildren(TreeSet<WalletNode> children) {
|
||||
|
@ -95,7 +95,7 @@ public class WalletNode implements Comparable<WalletNode> {
|
|||
}
|
||||
|
||||
public Set<BlockTransactionHashIndex> getTransactionOutputs() {
|
||||
return transactionOutputs == null ? null : Collections.unmodifiableSet(transactionOutputs);
|
||||
return transactionOutputs;
|
||||
}
|
||||
|
||||
public void setTransactionOutputs(TreeSet<BlockTransactionHashIndex> transactionOutputs) {
|
||||
|
@ -195,6 +195,7 @@ public class WalletNode implements Comparable<WalletNode> {
|
|||
|
||||
public WalletNode copy() {
|
||||
WalletNode copy = new WalletNode(derivationPath);
|
||||
copy.setId(getId());
|
||||
copy.setLabel(label);
|
||||
|
||||
for(WalletNode child : getChildren()) {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
open module com.sparrowwallet.drongo {
|
||||
requires org.bouncycastle.provider;
|
||||
requires de.mkammerer.argon2;
|
||||
requires slf4j.api;
|
||||
requires org.slf4j;
|
||||
requires logback.core;
|
||||
requires logback.classic;
|
||||
requires json.simple;
|
||||
|
|
Loading…
Reference in a new issue