-
Notifications
You must be signed in to change notification settings - Fork 0
/
Wallet.java
76 lines (64 loc) · 2.78 KB
/
Wallet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import java.security.*;
import java.security.spec.ECGenParameterSpec;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class Wallet {
public PrivateKey privateKey;
public PublicKey publicKey;
public HashMap<String, TransactionOutput> UTXOs = new HashMap<String, TransactionOutput>(); // only UTXOs owned by this wallet
public Wallet() {
generateKeyPair();
}
// Generates an Elliptic Curve KeyPair. Makes and sets our Public and Private keys.
public void generateKeyPair() {
try {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("ECDSA", "BC");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
ECGenParameterSpec ecSpec = new ECGenParameterSpec("prime192v1");
// Initialize the key generator and generate a KeyPair
keyGen.initialize(ecSpec, random); // 256 bytes provides an acceptable security level
KeyPair keyPair = keyGen.generateKeyPair();
// Set the public and private keys from the keyPair
privateKey = keyPair.getPrivate();
publicKey = keyPair.getPublic();
} catch(Exception e) {
throw new RuntimeException(e);
}
}
// Returns balance and stores the UTXO's owned by this wallet in this.UTXOs
public float getBalance() {
float total = 0;
for (Map.Entry<String, TransactionOutput> item : ChaChain.UTXOs.entrySet()) {
TransactionOutput UTXO = item.getValue();
if (UTXO.isMine(publicKey)) {
UTXOs.put(UTXO.id, UTXO);
total += UTXO.value;
}
}
return total;
}
// Generates and returns a new transaction from this wallet.
public Transaction sendFunds(PublicKey _recipient, float value) {
// gather balance and check funds
if (getBalance() < value) {
System.out.println("#Not enough funds to send transaction. Transaction discarded.");
return null;
}
// create ArrayList of inputs
ArrayList<TransactionInput> inputs = new ArrayList<TransactionInput>();
float total = 0;
for (Map.Entry<String, TransactionOutput> item : UTXOs.entrySet()) {
TransactionOutput UTXO = item.getValue();
total += UTXO.value;
inputs.add(new TransactionInput(UTXO.id));
if (total > value) break;
}
Transaction newTransaction = new Transaction(publicKey, _recipient, value, inputs);
newTransaction.generateSignature(privateKey);
for (TransactionInput input : inputs) {
UTXOs.remove(input.transactionOutputId);
}
return newTransaction;
}
}