Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
18861ec
add java major versions
alfonsobries Jul 31, 2024
7ba8c2d
remove deprecated signer/verifier
alfonsobries Jul 31, 2024
a2556d8
add secp256k1 library for schnorr
alfonsobries Aug 1, 2024
ba35322
upgrade gradle
alfonsobries Aug 1, 2024
4421cec
add schnorr signature library
alfonsobries Aug 1, 2024
916b499
upgrade dependencies
alfonsobries Aug 2, 2024
a8a4764
update to java 22
alfonsobries Aug 2, 2024
759fe53
remove java 8 compatibility
alfonsobries Aug 2, 2024
531f002
Merge branch 'feat/upgrade-dependencies' of github.com:ArkEcosystem/j…
alfonsobries Aug 2, 2024
f698dbe
include secp api
alfonsobries Aug 2, 2024
093dad1
compatibility issues
alfonsobries Aug 2, 2024
6d25cbd
Merge branch 'feat/upgrade-dependencies' into feat/add-schnorr-signature
alfonsobries Aug 2, 2024
e680c03
influde foreign library
alfonsobries Aug 2, 2024
acc2f4d
add schnorr signature
alfonsobries Aug 2, 2024
d910160
generate keccak address
alfonsobries Aug 2, 2024
5c05d58
Update VoteBuilder.java
alfonsobries Aug 2, 2024
f504c03
remplace old address
alfonsobries Aug 2, 2024
8ed2e89
Merge branch 'feat/keccak-address-support' into feat/add-schnorr-sign…
alfonsobries Aug 2, 2024
cc97465
wip
alfonsobries Aug 2, 2024
4c1302c
transfer serialize test
alfonsobries Aug 2, 2024
997aca8
style: resolve style guide violations
alfonsobries Aug 2, 2024
281aae5
feat: keccak address support (#179)
alfonsobries Aug 5, 2024
f128191
Merge branch 'feat/mainsail' of github.com:ArkEcosystem/java-crypto i…
alfonsobries Aug 5, 2024
3185b77
Merge branch 'feat/add-schnorr-signature' of github.com:ArkEcosystem/…
alfonsobries Aug 5, 2024
b190ef7
Merge branch 'feat/mainsail' into feat/upgrade-dependencies
alfonsobries Aug 5, 2024
14d3324
Merge branch 'feat/upgrade-dependencies' of github.com:ArkEcosystem/j…
alfonsobries Aug 5, 2024
1c8fc0b
wip
alfonsobries Aug 5, 2024
29657fb
fix tests
alfonsobries Aug 5, 2024
07a6a5d
replace deprecated fixtures with new ones
alfonsobries Aug 5, 2024
a415380
use keccak addresses
alfonsobries Aug 5, 2024
2ec53a6
votes tests
alfonsobries Aug 5, 2024
649babf
vote builder tests & adjustments
alfonsobries Aug 5, 2024
91c5e14
remove deprecated
alfonsobries Aug 5, 2024
4418f28
style: resolve style guide violations
alfonsobries Aug 5, 2024
cb24eb9
wip
alfonsobries Aug 5, 2024
5fb2de6
deserialize multipayment
alfonsobries Aug 5, 2024
802171c
rename delegate to validator
alfonsobries Aug 5, 2024
6def586
validator registration tests
alfonsobries Aug 5, 2024
38050a1
adjust validator resignation tests
alfonsobries Aug 5, 2024
7bc19ee
Merge branch 'feat/add-schnorr-signature' of github.com:ArkEcosystem/…
alfonsobries Aug 5, 2024
59ed9f6
Update MultiSignatureRegistrationBuilderTest.java
alfonsobries Aug 5, 2024
6d1b968
Merge branch 'feat/mainsail' of github.com:ArkEcosystem/java-crypto i…
alfonsobries Aug 5, 2024
a7a3ece
style: resolve style guide violations
alfonsobries Aug 5, 2024
3c2ea6d
fixture sign verification adjustments
alfonsobries Aug 5, 2024
08e83a7
schnorr tests
alfonsobries Aug 5, 2024
7b6ec80
style: resolve style guide violations
alfonsobries Aug 5, 2024
78459f6
wip
alfonsobries Aug 5, 2024
772dc85
Update SchnorrVerifierTest.java
alfonsobries Aug 5, 2024
a7354b4
Merge branch 'feat/add-schnorr-signature' of github.com:ArkEcosystem/…
alfonsobries Aug 5, 2024
2bfd410
install libsecp256k1
alfonsobries Aug 5, 2024
333be43
add nix
alfonsobries Aug 5, 2024
c083f07
Update test.yml
alfonsobries Aug 5, 2024
39b825e
Update test.yml
alfonsobries Aug 5, 2024
249f8c7
Update test.yml
alfonsobries Aug 5, 2024
3c65e8c
test with java 22 only
alfonsobries Aug 5, 2024
d81bc09
add java 21
alfonsobries Aug 5, 2024
f0d60f6
Update test.yml
alfonsobries Aug 5, 2024
3f705ab
Update test.yml
alfonsobries Aug 5, 2024
58ca8d7
Update test.yml
alfonsobries Aug 5, 2024
6278a7a
Update test.yml
alfonsobries Aug 5, 2024
14a806b
Update test.yml
alfonsobries Aug 5, 2024
a5b3b78
java 21
alfonsobries Aug 5, 2024
9066761
Update test.yml
alfonsobries Aug 5, 2024
a9eb999
Update test.yml
alfonsobries Aug 5, 2024
49a33cb
cache dowload
alfonsobries Aug 5, 2024
b1ea6a4
add 21
alfonsobries Aug 5, 2024
1c405f5
test
alfonsobries Aug 5, 2024
fc9906a
Update test.yml
alfonsobries Aug 5, 2024
a281c33
Update test.yml
alfonsobries Aug 5, 2024
4398b7f
wip
alfonsobries Aug 5, 2024
58ed071
Update test.yml
alfonsobries Aug 5, 2024
829d1d2
add java 21
alfonsobries Aug 5, 2024
be561c3
add default 22 libs again
alfonsobries Aug 5, 2024
4c716e9
gradle java version issue
alfonsobries Aug 5, 2024
0a42b1e
worth a try
alfonsobries Aug 6, 2024
e9629c5
last try
alfonsobries Aug 6, 2024
e39b8bf
drop compatibility with old versions of java
alfonsobries Aug 6, 2024
32b047a
add username transactions wip
alfonsobries Aug 6, 2024
ad9191e
wip
alfonsobries Aug 6, 2024
b64d5d5
style: resolve style guide violations
alfonsobries Aug 6, 2024
7fc228c
add fixtures for usernames
alfonsobries Aug 6, 2024
e101fe6
Merge branch 'feat/mainsail' of github.com:ArkEcosystem/java-crypto i…
alfonsobries Aug 12, 2024
42400b0
merge conflicts
alfonsobries Aug 12, 2024
912dad4
style: resolve style guide violations
alfonsobries Aug 12, 2024
3782075
feat: multisignature tests (#182)
alfonsobries Aug 14, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,10 @@ public enum CoreTransactionTypes {
VALIDATOR_REGISTRATION(2),
VOTE(3),
MULTI_SIGNATURE_REGISTRATION(4),
IPFS(5),
MULTI_PAYMENT(6),
VALIDATOR_RESIGNATION(7),
HTLC_LOCK(8),
HTLC_CLAIM(9),
HTLC_REFUND(10);
USERNAME_REGISTRATION(8),
USERNAME_RESIGNATION(9);

private final int value;

Expand Down
6 changes: 2 additions & 4 deletions src/main/java/org/arkecosystem/crypto/enums/Fees.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,10 @@ public enum Fees {
VALIDATOR_REGISTRATION(2_500_000_000L),
VOTE(100_000_000L),
MULTI_SIGNATURE_REGISTRATION(500_000_000L),
IPFS(500_000_000L),
MULTI_PAYMENT(10_000_000L),
VALIDATOR_RESIGNATION(2_500_000_000L),
HTLC_LOCK(10_000_000L),
HTLC_CLAIM(0L),
HTLC_REFUND(0L);
USERNAME_REGISTRATION(2_500_000_000L),
USERNAME_RESIGNATION(2_500_000_000L);

private final Long value;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
import org.arkecosystem.crypto.transactions.types.SecondSignatureRegistration;
import org.arkecosystem.crypto.transactions.types.Transaction;
import org.arkecosystem.crypto.transactions.types.Transfer;
import org.arkecosystem.crypto.transactions.types.UsernameRegistration;
import org.arkecosystem.crypto.transactions.types.UsernameResignation;
import org.arkecosystem.crypto.transactions.types.ValidatorRegistration;
import org.arkecosystem.crypto.transactions.types.ValidatorResignation;
import org.arkecosystem.crypto.transactions.types.Vote;
Expand Down Expand Up @@ -42,6 +44,10 @@ public Deserializer(String serialized) {
coreTransactionTypes.put(CoreTransactionTypes.MULTI_PAYMENT.getValue(), new MultiPayment());
coreTransactionTypes.put(
CoreTransactionTypes.VALIDATOR_RESIGNATION.getValue(), new ValidatorResignation());
coreTransactionTypes.put(
CoreTransactionTypes.USERNAME_RESIGNATION.getValue(), new UsernameResignation());
coreTransactionTypes.put(
CoreTransactionTypes.USERNAME_REGISTRATION.getValue(), new UsernameRegistration());

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ public class TransactionAsset {
public HashMap<String, Object> customAsset = new HashMap<>();
public long amount = 0L;
public String validatorPublicKey;
public String username;

public static class Signature {
public String publicKey;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package org.arkecosystem.crypto.transactions.builder;

import org.arkecosystem.crypto.enums.Fees;
import org.arkecosystem.crypto.transactions.types.Transaction;
import org.arkecosystem.crypto.transactions.types.UsernameRegistration;

public class UsernameRegistrationBuilder
extends AbstractTransactionBuilder<UsernameRegistrationBuilder> {
public UsernameRegistrationBuilder() {
super();
this.transaction.fee = Fees.VALIDATOR_REGISTRATION.getValue();
}

public UsernameRegistrationBuilder usernameAsset(String username) {
this.transaction.asset.username = username;

return this;
}

@Override
public Transaction getTransactionInstance() {
return new UsernameRegistration();
}

@Override
public UsernameRegistrationBuilder instance() {
return this;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.arkecosystem.crypto.transactions.builder;

import org.arkecosystem.crypto.enums.Fees;
import org.arkecosystem.crypto.transactions.types.Transaction;
import org.arkecosystem.crypto.transactions.types.UsernameResignation;

public class UsernameResignationBuilder
extends AbstractTransactionBuilder<UsernameResignationBuilder> {

public UsernameResignationBuilder() {
super();
this.transaction.fee = Fees.USERNAME_RESIGNATION.getValue();
}

@Override
public Transaction getTransactionInstance() {
return new UsernameResignation();
}

@Override
public UsernameResignationBuilder instance() {
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.arkecosystem.crypto.encoding.Hex;
import org.arkecosystem.crypto.identities.PrivateKey;
import org.arkecosystem.crypto.signature.SchnorrSigner;
Expand Down Expand Up @@ -93,7 +91,7 @@ public boolean verify() {
byte[] signature = Hex.decode(this.signature);
byte[] hash = Sha256Hash.hash(Serializer.serialize(this, true, true, false));

return verifier(this.signature).verify(hash, keys, signature);
return verifier().verify(hash, keys, signature);
}

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

return verifier(this.secondSignature).verify(hash, keys, signature);
}

public boolean multiVerify(int min, List<String> publicKeys) {
if (publicKeys.isEmpty()) {
throw new RuntimeException("The multi signature asset is invalid.");
}

byte[] hash = Sha256Hash.hash(Serializer.serialize(this, true, true, true));

Set<Integer> publicKeyIndexes = new HashSet<>();
int verifiedSignatures = 0;
boolean verified = false;
for (int i = 0; i < this.signatures.size(); i++) {
String signature = this.signatures.get(i);
int publicKeyIndex = Integer.parseInt(signature.substring(0, 2), 16);

if (!publicKeyIndexes.contains(publicKeyIndex)) {
publicKeyIndexes.add(publicKeyIndex);
} else {
throw new RuntimeException("Duplicate participant in multi signature");
}

String partialSignature = signature.substring(2);
String publicKey = publicKeys.get(publicKeyIndex);

if (verifier(partialSignature)
.verify(
hash,
ECKey.fromPublicOnly(Hex.decode(publicKey)),
Hex.decode(partialSignature))) {
verifiedSignatures++;
}

if (verifiedSignatures == min) {
verified = true;
break;
} else if (signatures.size() - (i + 1 - verifiedSignatures) < min) {
break;
}
}
return verified;
return verifier().verify(hash, keys, signature);
}

public String toJson() {
Expand Down Expand Up @@ -206,7 +163,7 @@ private Signer signer() {
return new SchnorrSigner();
}

private Verifier verifier(String signature) {
private Verifier verifier() {
return new SchnorrVerifier();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package org.arkecosystem.crypto.transactions.types;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.HashMap;
import org.arkecosystem.crypto.enums.CoreTransactionTypes;
import org.arkecosystem.crypto.enums.TransactionTypeGroup;

public class UsernameRegistration extends Transaction {
@Override
public int getTransactionType() {
return CoreTransactionTypes.USERNAME_REGISTRATION.getValue();
}

@Override
public int getTransactionTypeGroup() {
return TransactionTypeGroup.CORE.getValue();
}

@Override
public HashMap<String, Object> assetToHashMap() {
HashMap<String, Object> asset = new HashMap<>();

asset.put("username", this.asset.username);

return asset;
}

@Override
public byte[] serialize() {
byte[] username = this.asset.username.getBytes();

ByteBuffer buffer = ByteBuffer.allocate(username.length + 1);

buffer.order(ByteOrder.LITTLE_ENDIAN);

buffer.put((byte) username.length);
buffer.put(username);

return buffer.array();
}

@Override
public void deserialize(ByteBuffer buffer) {
int usernameLength = buffer.get() & 0xff;

byte[] username = new byte[usernameLength];
buffer.get(username);

String utf8Username = new String(username);
this.asset.username = utf8Username;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package org.arkecosystem.crypto.transactions.types;

import java.nio.ByteBuffer;
import java.util.HashMap;
import org.arkecosystem.crypto.enums.CoreTransactionTypes;
import org.arkecosystem.crypto.enums.TransactionTypeGroup;

public class UsernameResignation extends Transaction {
@Override
public int getTransactionType() {
return CoreTransactionTypes.USERNAME_RESIGNATION.getValue();
}

@Override
public int getTransactionTypeGroup() {
return TransactionTypeGroup.CORE.getValue();
}

@Override
public HashMap<String, Object> assetToHashMap() {
return null;
}

@Override
public byte[] serialize() {
return new byte[0];
}

@Override
public void deserialize(ByteBuffer buffer) {}
}
Loading