Skip to content

Commit 07ad144

Browse files
authored
feat: add username transactions (#181)
1 parent cf8fa10 commit 07ad144

23 files changed

+519
-224
lines changed

src/main/java/org/arkecosystem/crypto/enums/CoreTransactionTypes.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,10 @@ public enum CoreTransactionTypes {
66
VALIDATOR_REGISTRATION(2),
77
VOTE(3),
88
MULTI_SIGNATURE_REGISTRATION(4),
9-
IPFS(5),
109
MULTI_PAYMENT(6),
1110
VALIDATOR_RESIGNATION(7),
12-
HTLC_LOCK(8),
13-
HTLC_CLAIM(9),
14-
HTLC_REFUND(10);
11+
USERNAME_REGISTRATION(8),
12+
USERNAME_RESIGNATION(9);
1513

1614
private final int value;
1715

src/main/java/org/arkecosystem/crypto/enums/Fees.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,10 @@ public enum Fees {
66
VALIDATOR_REGISTRATION(2_500_000_000L),
77
VOTE(100_000_000L),
88
MULTI_SIGNATURE_REGISTRATION(500_000_000L),
9-
IPFS(500_000_000L),
109
MULTI_PAYMENT(10_000_000L),
1110
VALIDATOR_RESIGNATION(2_500_000_000L),
12-
HTLC_LOCK(10_000_000L),
13-
HTLC_CLAIM(0L),
14-
HTLC_REFUND(0L);
11+
USERNAME_REGISTRATION(2_500_000_000L),
12+
USERNAME_RESIGNATION(2_500_000_000L);
1513

1614
private final Long value;
1715

src/main/java/org/arkecosystem/crypto/transactions/Deserializer.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import org.arkecosystem.crypto.transactions.types.SecondSignatureRegistration;
1616
import org.arkecosystem.crypto.transactions.types.Transaction;
1717
import org.arkecosystem.crypto.transactions.types.Transfer;
18+
import org.arkecosystem.crypto.transactions.types.UsernameRegistration;
19+
import org.arkecosystem.crypto.transactions.types.UsernameResignation;
1820
import org.arkecosystem.crypto.transactions.types.ValidatorRegistration;
1921
import org.arkecosystem.crypto.transactions.types.ValidatorResignation;
2022
import org.arkecosystem.crypto.transactions.types.Vote;
@@ -42,6 +44,10 @@ public Deserializer(String serialized) {
4244
coreTransactionTypes.put(CoreTransactionTypes.MULTI_PAYMENT.getValue(), new MultiPayment());
4345
coreTransactionTypes.put(
4446
CoreTransactionTypes.VALIDATOR_RESIGNATION.getValue(), new ValidatorResignation());
47+
coreTransactionTypes.put(
48+
CoreTransactionTypes.USERNAME_RESIGNATION.getValue(), new UsernameResignation());
49+
coreTransactionTypes.put(
50+
CoreTransactionTypes.USERNAME_REGISTRATION.getValue(), new UsernameRegistration());
4551

4652
transactionGroups.put(TransactionTypeGroup.CORE.getValue(), coreTransactionTypes);
4753

src/main/java/org/arkecosystem/crypto/transactions/TransactionAsset.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class TransactionAsset {
1313
public HashMap<String, Object> customAsset = new HashMap<>();
1414
public long amount = 0L;
1515
public String validatorPublicKey;
16+
public String username;
1617

1718
public static class Signature {
1819
public String publicKey;
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.arkecosystem.crypto.transactions.builder;
2+
3+
import org.arkecosystem.crypto.enums.Fees;
4+
import org.arkecosystem.crypto.transactions.types.Transaction;
5+
import org.arkecosystem.crypto.transactions.types.UsernameRegistration;
6+
7+
public class UsernameRegistrationBuilder
8+
extends AbstractTransactionBuilder<UsernameRegistrationBuilder> {
9+
public UsernameRegistrationBuilder() {
10+
super();
11+
this.transaction.fee = Fees.VALIDATOR_REGISTRATION.getValue();
12+
}
13+
14+
public UsernameRegistrationBuilder usernameAsset(String username) {
15+
this.transaction.asset.username = username;
16+
17+
return this;
18+
}
19+
20+
@Override
21+
public Transaction getTransactionInstance() {
22+
return new UsernameRegistration();
23+
}
24+
25+
@Override
26+
public UsernameRegistrationBuilder instance() {
27+
return this;
28+
}
29+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.arkecosystem.crypto.transactions.builder;
2+
3+
import org.arkecosystem.crypto.enums.Fees;
4+
import org.arkecosystem.crypto.transactions.types.Transaction;
5+
import org.arkecosystem.crypto.transactions.types.UsernameResignation;
6+
7+
public class UsernameResignationBuilder
8+
extends AbstractTransactionBuilder<UsernameResignationBuilder> {
9+
10+
public UsernameResignationBuilder() {
11+
super();
12+
this.transaction.fee = Fees.USERNAME_RESIGNATION.getValue();
13+
}
14+
15+
@Override
16+
public Transaction getTransactionInstance() {
17+
return new UsernameResignation();
18+
}
19+
20+
@Override
21+
public UsernameResignationBuilder instance() {
22+
return this;
23+
}
24+
}

src/main/java/org/arkecosystem/crypto/transactions/types/Transaction.java

Lines changed: 3 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44
import java.nio.ByteBuffer;
55
import java.util.ArrayList;
66
import java.util.HashMap;
7-
import java.util.HashSet;
87
import java.util.List;
9-
import java.util.Set;
108
import org.arkecosystem.crypto.encoding.Hex;
119
import org.arkecosystem.crypto.identities.PrivateKey;
1210
import org.arkecosystem.crypto.signature.SchnorrSigner;
@@ -93,7 +91,7 @@ public boolean verify() {
9391
byte[] signature = Hex.decode(this.signature);
9492
byte[] hash = Sha256Hash.hash(Serializer.serialize(this, true, true, false));
9593

96-
return verifier(this.signature).verify(hash, keys, signature);
94+
return verifier().verify(hash, keys, signature);
9795
}
9896

9997
public boolean secondVerify(String secondPublicKey) {
@@ -102,48 +100,7 @@ public boolean secondVerify(String secondPublicKey) {
102100
byte[] signature = Hex.decode(this.secondSignature);
103101
byte[] hash = Sha256Hash.hash(Serializer.serialize(this, false, true, false));
104102

105-
return verifier(this.secondSignature).verify(hash, keys, signature);
106-
}
107-
108-
public boolean multiVerify(int min, List<String> publicKeys) {
109-
if (publicKeys.isEmpty()) {
110-
throw new RuntimeException("The multi signature asset is invalid.");
111-
}
112-
113-
byte[] hash = Sha256Hash.hash(Serializer.serialize(this, true, true, true));
114-
115-
Set<Integer> publicKeyIndexes = new HashSet<>();
116-
int verifiedSignatures = 0;
117-
boolean verified = false;
118-
for (int i = 0; i < this.signatures.size(); i++) {
119-
String signature = this.signatures.get(i);
120-
int publicKeyIndex = Integer.parseInt(signature.substring(0, 2), 16);
121-
122-
if (!publicKeyIndexes.contains(publicKeyIndex)) {
123-
publicKeyIndexes.add(publicKeyIndex);
124-
} else {
125-
throw new RuntimeException("Duplicate participant in multi signature");
126-
}
127-
128-
String partialSignature = signature.substring(2);
129-
String publicKey = publicKeys.get(publicKeyIndex);
130-
131-
if (verifier(partialSignature)
132-
.verify(
133-
hash,
134-
ECKey.fromPublicOnly(Hex.decode(publicKey)),
135-
Hex.decode(partialSignature))) {
136-
verifiedSignatures++;
137-
}
138-
139-
if (verifiedSignatures == min) {
140-
verified = true;
141-
break;
142-
} else if (signatures.size() - (i + 1 - verifiedSignatures) < min) {
143-
break;
144-
}
145-
}
146-
return verified;
103+
return verifier().verify(hash, keys, signature);
147104
}
148105

149106
public String toJson() {
@@ -206,7 +163,7 @@ private Signer signer() {
206163
return new SchnorrSigner();
207164
}
208165

209-
private Verifier verifier(String signature) {
166+
private Verifier verifier() {
210167
return new SchnorrVerifier();
211168
}
212169
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package org.arkecosystem.crypto.transactions.types;
2+
3+
import java.nio.ByteBuffer;
4+
import java.nio.ByteOrder;
5+
import java.util.HashMap;
6+
import org.arkecosystem.crypto.enums.CoreTransactionTypes;
7+
import org.arkecosystem.crypto.enums.TransactionTypeGroup;
8+
9+
public class UsernameRegistration extends Transaction {
10+
@Override
11+
public int getTransactionType() {
12+
return CoreTransactionTypes.USERNAME_REGISTRATION.getValue();
13+
}
14+
15+
@Override
16+
public int getTransactionTypeGroup() {
17+
return TransactionTypeGroup.CORE.getValue();
18+
}
19+
20+
@Override
21+
public HashMap<String, Object> assetToHashMap() {
22+
HashMap<String, Object> asset = new HashMap<>();
23+
24+
asset.put("username", this.asset.username);
25+
26+
return asset;
27+
}
28+
29+
@Override
30+
public byte[] serialize() {
31+
byte[] username = this.asset.username.getBytes();
32+
33+
ByteBuffer buffer = ByteBuffer.allocate(username.length + 1);
34+
35+
buffer.order(ByteOrder.LITTLE_ENDIAN);
36+
37+
buffer.put((byte) username.length);
38+
buffer.put(username);
39+
40+
return buffer.array();
41+
}
42+
43+
@Override
44+
public void deserialize(ByteBuffer buffer) {
45+
int usernameLength = buffer.get() & 0xff;
46+
47+
byte[] username = new byte[usernameLength];
48+
buffer.get(username);
49+
50+
String utf8Username = new String(username);
51+
this.asset.username = utf8Username;
52+
}
53+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.arkecosystem.crypto.transactions.types;
2+
3+
import java.nio.ByteBuffer;
4+
import java.util.HashMap;
5+
import org.arkecosystem.crypto.enums.CoreTransactionTypes;
6+
import org.arkecosystem.crypto.enums.TransactionTypeGroup;
7+
8+
public class UsernameResignation extends Transaction {
9+
@Override
10+
public int getTransactionType() {
11+
return CoreTransactionTypes.USERNAME_RESIGNATION.getValue();
12+
}
13+
14+
@Override
15+
public int getTransactionTypeGroup() {
16+
return TransactionTypeGroup.CORE.getValue();
17+
}
18+
19+
@Override
20+
public HashMap<String, Object> assetToHashMap() {
21+
return null;
22+
}
23+
24+
@Override
25+
public byte[] serialize() {
26+
return new byte[0];
27+
}
28+
29+
@Override
30+
public void deserialize(ByteBuffer buffer) {}
31+
}

0 commit comments

Comments
 (0)