-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTransaction.java
More file actions
108 lines (108 loc) · 3.32 KB
/
Transaction.java
File metadata and controls
108 lines (108 loc) · 3.32 KB
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.ArrayList;
public class Transaction implements java.io.Serializable {
private static final long serialVersionUID = 1L;
public static final double TRANSACTION_FEE = 1.0;
private String hashID;
private PublicKey sender;
private PublicKey[] recievers;
private double[] fundToTransfer;
private long timestamp;
private ArrayList<UTXO> inputs = null;
private ArrayList<UTXO> outputs = new ArrayList<UTXO>(4);
private byte[] signature = null;
private boolean signed = false;
private long mySequentialNumber;
public Transaction(PublicKey sender, PublicKey reciever, double fundToTransfer, ArrayList<UTXO> inputs) {
PublicKey[] pks = new PublicKey[1];
pks[0] = reciever;
double[] funds = new double[1];
funds[0] = fundToTransfer;
this.setUp(sender, pks, funds, inputs);
}
public Transaction(PublicKey sender, PublicKey[] recievers, double[] fundToTransfer, ArrayList<UTXO> inputs) {
this.setUp(sender, recievers, fundToTransfer, inputs);
}
private void setUp(PublicKey sender, PublicKey[] recievers, double[] fundToTransfer, ArrayList<UTXO> inputs) {
this.mySequentialNumber = UtilityMethods.getUniqueNumber();
this.sender = sender;
this.recievers = new PublicKey[1];
this.recievers = recievers;
this.fundToTransfer = fundToTransfer;
this.inputs = inputs;
this.timestamp = java.util.Calendar.getInstance().getTimeInMillis();
computeHashID();
}
public void signTheTransaction(PrivateKey privateKey) {
if(this.signature == null && !signed) {
this.signature = UtilityMethods.generateSignature(privateKey, getMessageData());
signed = true;
}
}
public boolean verifySignature() {
String message = getMessageData();
return UtilityMethods.verifySignature(this.sender, this.signature, message);
}
private String getMessageData() {
StringBuilder sb = new StringBuilder();
sb.append(UtilityMethods.getKeyString(sender)
+Long.toHexString(this.timestamp)
+Long.toString(this.mySequentialNumber));
for(int i=0; i<this.recievers.length; i++) {
sb.append(UtilityMethods.getKeyString(this.recievers[i])
+ Double.toHexString(this.fundToTransfer[i]));
}
for(int i=0; i<this.getNumberOfInputUTXOs(); i++) {
UTXO ut = this.getInputUTXO(i);
sb.append(ut.getHashID());
}
return sb.toString();
}
protected void computeHashID() {
String message = getMessageData();
this.hashID = UtilityMethods.messageDigestSHA256_toString(message);
}
public String getHashID(){
return this.hashID;
}
public PublicKey getSender() {
return this.sender;
}
public long getTimeStamp() {
return this.timestamp;
}
public long getSequentialNumber() {
return this.mySequentialNumber;
}
public double getTotalFundToTransfer() {
double f = 0;
for(int i=0; i<this.fundToTransfer.length; i++) {
f += this.fundToTransfer[i];
}
return f;
}
protected void addOutputUTXO(UTXO ut) {
if(!signed) {
outputs.add(ut);
}
}
public int getNumberOfOutputUTXOs() {
return this.outputs.size();
}
public UTXO getOutputUTXO(int i) {
return this.outputs.get(i);
}
public int getNumberOfInputUTXOs() {
if(this.inputs == null) {
return 0;
}
return this.inputs.size();
}
public UTXO getInputUTXO(int i) {
return this.inputs.get(i);
}
public boolean equals(Transaction T) {
return this.getHashID().equals(T.getHashID());
}
}