From 72f0194487072e0a07d9fa3102489e27e495ce87 Mon Sep 17 00:00:00 2001 From: kennycud Date: Fri, 17 Jan 2025 19:31:13 -0800 Subject: [PATCH] get admin query fix and hardfork --- .../java/org/qortal/block/BlockChain.java | 7 ++++++- src/main/java/org/qortal/group/Group.java | 8 ++++++- .../qortal/repository/GroupRepository.java | 2 ++ .../hsqldb/HSQLDBGroupRepository.java | 17 ++++++++++++++- src/main/resources/blockchain.json | 3 ++- .../qortal/test/group/DevGroupAdminTests.java | 21 +++++++++++++++++++ src/test/resources/test-chain-v2.json | 5 +++-- 7 files changed, 57 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/qortal/block/BlockChain.java b/src/main/java/org/qortal/block/BlockChain.java index ef20abe8..1468fbc3 100644 --- a/src/main/java/org/qortal/block/BlockChain.java +++ b/src/main/java/org/qortal/block/BlockChain.java @@ -91,7 +91,8 @@ public class BlockChain { fixBatchRewardHeight, adminsReplaceFoundersHeight, nullGroupMembershipHeight, - ignoreLevelForRewardShareHeight + ignoreLevelForRewardShareHeight, + adminQueryFixHeight } // Custom transaction fees @@ -677,6 +678,10 @@ public class BlockChain { return this.featureTriggers.get(FeatureTrigger.ignoreLevelForRewardShareHeight.name()).intValue(); } + public int getAdminQueryFixHeight() { + return this.featureTriggers.get(FeatureTrigger.adminQueryFixHeight.name()).intValue(); + } + // More complex getters for aspects that change by height or timestamp public long getRewardAtHeight(int ourHeight) { diff --git a/src/main/java/org/qortal/group/Group.java b/src/main/java/org/qortal/group/Group.java index 59e32545..765b86de 100644 --- a/src/main/java/org/qortal/group/Group.java +++ b/src/main/java/org/qortal/group/Group.java @@ -2,6 +2,7 @@ package org.qortal.group; import org.qortal.account.Account; import org.qortal.account.PublicKeyAccount; +import org.qortal.block.BlockChain; import org.qortal.controller.Controller; import org.qortal.crypto.Crypto; import org.qortal.data.group.*; @@ -150,7 +151,12 @@ public class Group { // Adminship private GroupAdminData getAdmin(String admin) throws DataException { - return groupRepository.getAdmin(this.groupData.getGroupId(), admin); + if( repository.getBlockRepository().getBlockchainHeight() < BlockChain.getInstance().getAdminQueryFixHeight()) { + return groupRepository.getAdminFaulty(this.groupData.getGroupId(), admin); + } + else { + return groupRepository.getAdmin(this.groupData.getGroupId(), admin); + } } private boolean adminExists(String admin) throws DataException { diff --git a/src/main/java/org/qortal/repository/GroupRepository.java b/src/main/java/org/qortal/repository/GroupRepository.java index 49427b02..4e39333c 100644 --- a/src/main/java/org/qortal/repository/GroupRepository.java +++ b/src/main/java/org/qortal/repository/GroupRepository.java @@ -48,6 +48,8 @@ public interface GroupRepository { // Group Admins + public GroupAdminData getAdminFaulty(int groupId, String address) throws DataException; + public GroupAdminData getAdmin(int groupId, String address) throws DataException; public boolean adminExists(int groupId, String address) throws DataException; diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBGroupRepository.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBGroupRepository.java index 9c7521fc..a15582e2 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBGroupRepository.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBGroupRepository.java @@ -351,7 +351,7 @@ public class HSQLDBGroupRepository implements GroupRepository { // Group Admins @Override - public GroupAdminData getAdmin(int groupId, String address) throws DataException { + public GroupAdminData getAdminFaulty(int groupId, String address) throws DataException { try (ResultSet resultSet = this.repository.checkedExecute("SELECT admin, reference FROM GroupAdmins WHERE group_id = ?", groupId)) { if (resultSet == null) return null; @@ -365,6 +365,21 @@ public class HSQLDBGroupRepository implements GroupRepository { } } + @Override + public GroupAdminData getAdmin(int groupId, String address) throws DataException { + try (ResultSet resultSet = this.repository.checkedExecute("SELECT admin, reference FROM GroupAdmins WHERE group_id = ? AND admin = ?", groupId, address)) { + if (resultSet == null) + return null; + + String admin = resultSet.getString(1); + byte[] reference = resultSet.getBytes(2); + + return new GroupAdminData(groupId, admin, reference); + } catch (SQLException e) { + throw new DataException("Unable to fetch group admin from repository", e); + } + } + @Override public boolean adminExists(int groupId, String address) throws DataException { try { diff --git a/src/main/resources/blockchain.json b/src/main/resources/blockchain.json index f1a7e76a..5e7383b8 100644 --- a/src/main/resources/blockchain.json +++ b/src/main/resources/blockchain.json @@ -116,7 +116,8 @@ "fixBatchRewardHeight": 1945900, "adminsReplaceFoundersHeight": 9999999, "nullGroupMembershipHeight": 9999999, - "ignoreLevelForRewardShareHeight": 9999999 + "ignoreLevelForRewardShareHeight": 9999999, + "adminQueryFixHeight": 9999999 }, "checkpoints": [ { "height": 1136300, "signature": "3BbwawEF2uN8Ni5ofpJXkukoU8ctAPxYoFB7whq9pKfBnjfZcpfEJT4R95NvBDoTP8WDyWvsUvbfHbcr9qSZuYpSKZjUQTvdFf6eqznHGEwhZApWfvXu6zjGCxYCp65F4jsVYYJjkzbjmkCg5WAwN5voudngA23kMK6PpTNygapCzXt" } diff --git a/src/test/java/org/qortal/test/group/DevGroupAdminTests.java b/src/test/java/org/qortal/test/group/DevGroupAdminTests.java index 14f2b87c..38ad0c53 100644 --- a/src/test/java/org/qortal/test/group/DevGroupAdminTests.java +++ b/src/test/java/org/qortal/test/group/DevGroupAdminTests.java @@ -6,6 +6,7 @@ import org.junit.Test; import org.qortal.account.PrivateKeyAccount; import org.qortal.block.Block; import org.qortal.block.BlockChain; +import org.qortal.data.group.GroupAdminData; import org.qortal.data.transaction.*; import org.qortal.group.Group; import org.qortal.repository.DataException; @@ -567,6 +568,26 @@ public class DevGroupAdminTests extends Common { } } + @Test + public void testGetAdmin() throws DataException{ + try (final Repository repository = RepositoryManager.getRepository()) { + + // establish accounts + PrivateKeyAccount alice = Common.getTestAccount(repository, ALICE); + PrivateKeyAccount bob = Common.getTestAccount(repository, BOB); + + GroupAdminData aliceAdminData = repository.getGroupRepository().getAdmin(DEV_GROUP_ID, alice.getAddress()); + + assertNotNull(aliceAdminData); + assertEquals( alice.getAddress(), aliceAdminData.getAdmin() ); + assertEquals( DEV_GROUP_ID, aliceAdminData.getGroupId()); + + GroupAdminData bobAdminData = repository.getGroupRepository().getAdmin(DEV_GROUP_ID, bob.getAddress()); + + assertNull(bobAdminData); + } + } + private Transaction.ApprovalStatus signForGroupApproval(Repository repository, TransactionData data, List signers) throws DataException { for (PrivateKeyAccount signer : signers) { diff --git a/src/test/resources/test-chain-v2.json b/src/test/resources/test-chain-v2.json index b5666234..4d1d6240 100644 --- a/src/test/resources/test-chain-v2.json +++ b/src/test/resources/test-chain-v2.json @@ -106,8 +106,9 @@ "removeOnlyMintWithNameHeight": 9999999999999, "fixBatchRewardHeight": 9999999999999, "adminsReplaceFoundersHeight": 9999999999999, - "onlineValidationFailSafeHeight": 9999999999999, - "nullGroupMembershipHeight": 20 + "ignoreLevelForRewardShareHeight": 9999999999999, + "nullGroupMembershipHeight": 20, + "adminQueryFixHeight": 9999999999999 }, "genesisInfo": { "version": 4,