forked from Qortal/qortal
Removed aggregateSignatureTimestamp. All online account signatures are aggregated - there is no need for backwards support as signatures are trimmed from blocks after 24 hours. testOnlineAccountsModulusV2() had to be removed as this relied on pre-aggregation signatures.
This commit is contained in:
parent
85a27c14b8
commit
b9bf945fd8
@ -389,25 +389,14 @@ public class Block {
|
|||||||
byte[] encodedOnlineAccounts = BlockTransformer.encodeOnlineAccounts(onlineAccountsSet);
|
byte[] encodedOnlineAccounts = BlockTransformer.encodeOnlineAccounts(onlineAccountsSet);
|
||||||
int onlineAccountsCount = onlineAccountsSet.size();
|
int onlineAccountsCount = onlineAccountsSet.size();
|
||||||
|
|
||||||
byte[] onlineAccountsSignatures;
|
// Collate all signatures
|
||||||
if (timestamp >= BlockChain.getInstance().getAggregateSignatureTimestamp()) {
|
Collection<byte[]> signaturesToAggregate = indexedOnlineAccounts.values()
|
||||||
// Collate all signatures
|
.stream()
|
||||||
Collection<byte[]> signaturesToAggregate = indexedOnlineAccounts.values()
|
.map(OnlineAccountData::getSignature)
|
||||||
.stream()
|
.collect(Collectors.toList());
|
||||||
.map(OnlineAccountData::getSignature)
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
|
|
||||||
// Aggregated, single signature
|
// Aggregated, single signature
|
||||||
onlineAccountsSignatures = Qortal25519Extras.aggregateSignatures(signaturesToAggregate);
|
byte[] onlineAccountsSignatures = Qortal25519Extras.aggregateSignatures(signaturesToAggregate);
|
||||||
} else {
|
|
||||||
// Concatenate online account timestamp signatures (in correct order)
|
|
||||||
onlineAccountsSignatures = new byte[onlineAccountsCount * Transformer.SIGNATURE_LENGTH];
|
|
||||||
for (int i = 0; i < onlineAccountsCount; ++i) {
|
|
||||||
Integer accountIndex = accountIndexes.get(i);
|
|
||||||
OnlineAccountData onlineAccountData = indexedOnlineAccounts.get(accountIndex);
|
|
||||||
System.arraycopy(onlineAccountData.getSignature(), 0, onlineAccountsSignatures, i * Transformer.SIGNATURE_LENGTH, Transformer.SIGNATURE_LENGTH);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add nonces to the end of the online accounts signatures if mempow is active
|
// Add nonces to the end of the online accounts signatures if mempow is active
|
||||||
if (timestamp >= BlockChain.getInstance().getOnlineAccountsMemoryPoWTimestamp()) {
|
if (timestamp >= BlockChain.getInstance().getOnlineAccountsMemoryPoWTimestamp()) {
|
||||||
@ -1041,7 +1030,7 @@ public class Block {
|
|||||||
if (this.blockData.getOnlineAccountsSignatures() == null || this.blockData.getOnlineAccountsSignatures().length == 0)
|
if (this.blockData.getOnlineAccountsSignatures() == null || this.blockData.getOnlineAccountsSignatures().length == 0)
|
||||||
return ValidationResult.ONLINE_ACCOUNT_SIGNATURES_MISSING;
|
return ValidationResult.ONLINE_ACCOUNT_SIGNATURES_MISSING;
|
||||||
|
|
||||||
final int signaturesLength = (this.blockData.getTimestamp() >= BlockChain.getInstance().getAggregateSignatureTimestamp()) ? Transformer.SIGNATURE_LENGTH : onlineRewardShares.size() * Transformer.SIGNATURE_LENGTH;
|
final int signaturesLength = Transformer.SIGNATURE_LENGTH;
|
||||||
final int noncesLength = onlineRewardShares.size() * Transformer.INT_LENGTH;
|
final int noncesLength = onlineRewardShares.size() * Transformer.INT_LENGTH;
|
||||||
|
|
||||||
if (this.blockData.getTimestamp() >= BlockChain.getInstance().getOnlineAccountsMemoryPoWTimestamp()) {
|
if (this.blockData.getTimestamp() >= BlockChain.getInstance().getOnlineAccountsMemoryPoWTimestamp()) {
|
||||||
@ -1089,41 +1078,18 @@ public class Block {
|
|||||||
// Extract online accounts' timestamp signatures from block data. Only one signature if aggregated.
|
// Extract online accounts' timestamp signatures from block data. Only one signature if aggregated.
|
||||||
List<byte[]> onlineAccountsSignatures = BlockTransformer.decodeTimestampSignatures(encodedOnlineAccountSignatures);
|
List<byte[]> onlineAccountsSignatures = BlockTransformer.decodeTimestampSignatures(encodedOnlineAccountSignatures);
|
||||||
|
|
||||||
if (this.blockData.getTimestamp() >= BlockChain.getInstance().getAggregateSignatureTimestamp()) {
|
// Aggregate all public keys
|
||||||
// Aggregate all public keys
|
Collection<byte[]> publicKeys = onlineRewardShares.stream()
|
||||||
Collection<byte[]> publicKeys = onlineRewardShares.stream()
|
.map(RewardShareData::getRewardSharePublicKey)
|
||||||
.map(RewardShareData::getRewardSharePublicKey)
|
.collect(Collectors.toList());
|
||||||
.collect(Collectors.toList());
|
|
||||||
|
|
||||||
byte[] aggregatePublicKey = Qortal25519Extras.aggregatePublicKeys(publicKeys);
|
byte[] aggregatePublicKey = Qortal25519Extras.aggregatePublicKeys(publicKeys);
|
||||||
|
|
||||||
byte[] aggregateSignature = onlineAccountsSignatures.get(0);
|
byte[] aggregateSignature = onlineAccountsSignatures.get(0);
|
||||||
|
|
||||||
// One-step verification of aggregate signature using aggregate public key
|
// One-step verification of aggregate signature using aggregate public key
|
||||||
if (!Qortal25519Extras.verifyAggregated(aggregatePublicKey, aggregateSignature, onlineTimestampBytes))
|
if (!Qortal25519Extras.verifyAggregated(aggregatePublicKey, aggregateSignature, onlineTimestampBytes))
|
||||||
return ValidationResult.ONLINE_ACCOUNT_SIGNATURE_INCORRECT;
|
return ValidationResult.ONLINE_ACCOUNT_SIGNATURE_INCORRECT;
|
||||||
} else {
|
|
||||||
// Build block's view of online accounts
|
|
||||||
Set<OnlineAccountData> onlineAccounts = new HashSet<>();
|
|
||||||
for (int i = 0; i < onlineAccountsSignatures.size(); ++i) {
|
|
||||||
byte[] signature = onlineAccountsSignatures.get(i);
|
|
||||||
byte[] publicKey = onlineRewardShares.get(i).getRewardSharePublicKey();
|
|
||||||
|
|
||||||
OnlineAccountData onlineAccountData = new OnlineAccountData(onlineTimestamp, signature, publicKey);
|
|
||||||
onlineAccounts.add(onlineAccountData);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove those already validated & cached by online accounts manager - no need to re-validate them
|
|
||||||
OnlineAccountsManager.getInstance().removeKnown(onlineAccounts, onlineTimestamp);
|
|
||||||
|
|
||||||
// Validate the rest
|
|
||||||
for (OnlineAccountData onlineAccount : onlineAccounts)
|
|
||||||
if (!Crypto.verify(onlineAccount.getPublicKey(), onlineAccount.getSignature(), onlineTimestampBytes))
|
|
||||||
return ValidationResult.ONLINE_ACCOUNT_SIGNATURE_INCORRECT;
|
|
||||||
|
|
||||||
// We've validated these, so allow online accounts manager to cache
|
|
||||||
OnlineAccountsManager.getInstance().addBlocksOnlineAccounts(onlineAccounts, onlineTimestamp);
|
|
||||||
}
|
|
||||||
|
|
||||||
// All online accounts valid, so save our list of online accounts for potential later use
|
// All online accounts valid, so save our list of online accounts for potential later use
|
||||||
this.cachedOnlineRewardShares = onlineRewardShares;
|
this.cachedOnlineRewardShares = onlineRewardShares;
|
||||||
|
@ -72,8 +72,7 @@ public class BlockChain {
|
|||||||
calcChainWeightTimestamp,
|
calcChainWeightTimestamp,
|
||||||
transactionV5Timestamp,
|
transactionV5Timestamp,
|
||||||
transactionV6Timestamp,
|
transactionV6Timestamp,
|
||||||
disableReferenceTimestamp,
|
disableReferenceTimestamp;
|
||||||
aggregateSignatureTimestamp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Custom transaction fees
|
// Custom transaction fees
|
||||||
@ -445,9 +444,6 @@ public class BlockChain {
|
|||||||
return this.featureTriggers.get(FeatureTrigger.disableReferenceTimestamp.name()).longValue();
|
return this.featureTriggers.get(FeatureTrigger.disableReferenceTimestamp.name()).longValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getAggregateSignatureTimestamp() {
|
|
||||||
return this.featureTriggers.get(FeatureTrigger.aggregateSignatureTimestamp.name()).longValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
// More complex getters for aspects that change by height or timestamp
|
// More complex getters for aspects that change by height or timestamp
|
||||||
|
|
||||||
|
@ -151,16 +151,13 @@ public class OnlineAccountsManager {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
byte[] timestampBytes = Longs.toByteArray(onlineAccountsTimestamp);
|
byte[] timestampBytes = Longs.toByteArray(onlineAccountsTimestamp);
|
||||||
final boolean useAggregateCompatibleSignature = onlineAccountsTimestamp >= BlockChain.getInstance().getAggregateSignatureTimestamp();
|
|
||||||
final boolean mempowActive = onlineAccountsTimestamp >= BlockChain.getInstance().getOnlineAccountsMemoryPoWTimestamp();
|
final boolean mempowActive = onlineAccountsTimestamp >= BlockChain.getInstance().getOnlineAccountsMemoryPoWTimestamp();
|
||||||
|
|
||||||
Set<OnlineAccountData> replacementAccounts = new HashSet<>();
|
Set<OnlineAccountData> replacementAccounts = new HashSet<>();
|
||||||
for (PrivateKeyAccount onlineAccount : onlineAccounts) {
|
for (PrivateKeyAccount onlineAccount : onlineAccounts) {
|
||||||
// Check mintingAccount is actually reward-share?
|
// Check mintingAccount is actually reward-share?
|
||||||
|
|
||||||
byte[] signature = useAggregateCompatibleSignature
|
byte[] signature = Qortal25519Extras.signForAggregation(onlineAccount.getPrivateKey(), timestampBytes);
|
||||||
? Qortal25519Extras.signForAggregation(onlineAccount.getPrivateKey(), timestampBytes)
|
|
||||||
: onlineAccount.sign(timestampBytes);
|
|
||||||
byte[] publicKey = onlineAccount.getPublicKey();
|
byte[] publicKey = onlineAccount.getPublicKey();
|
||||||
|
|
||||||
Integer nonce = mempowActive ? new Random().nextInt(500000) : null;
|
Integer nonce = mempowActive ? new Random().nextInt(500000) : null;
|
||||||
@ -280,9 +277,7 @@ public class OnlineAccountsManager {
|
|||||||
|
|
||||||
// Verify signature
|
// Verify signature
|
||||||
byte[] data = Longs.toByteArray(onlineAccountData.getTimestamp());
|
byte[] data = Longs.toByteArray(onlineAccountData.getTimestamp());
|
||||||
boolean isSignatureValid = onlineAccountTimestamp >= BlockChain.getInstance().getAggregateSignatureTimestamp()
|
boolean isSignatureValid = Qortal25519Extras.verifyAggregated(rewardSharePublicKey, onlineAccountData.getSignature(), data);
|
||||||
? Qortal25519Extras.verifyAggregated(rewardSharePublicKey, onlineAccountData.getSignature(), data)
|
|
||||||
: Crypto.verify(rewardSharePublicKey, onlineAccountData.getSignature(), data);
|
|
||||||
if (!isSignatureValid) {
|
if (!isSignatureValid) {
|
||||||
LOGGER.trace(() -> String.format("Rejecting invalid online account %s", Base58.encode(rewardSharePublicKey)));
|
LOGGER.trace(() -> String.format("Rejecting invalid online account %s", Base58.encode(rewardSharePublicKey)));
|
||||||
return false;
|
return false;
|
||||||
@ -506,8 +501,6 @@ public class OnlineAccountsManager {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
final boolean useAggregateCompatibleSignature = onlineAccountsTimestamp >= BlockChain.getInstance().getAggregateSignatureTimestamp();
|
|
||||||
|
|
||||||
byte[] timestampBytes = Longs.toByteArray(onlineAccountsTimestamp);
|
byte[] timestampBytes = Longs.toByteArray(onlineAccountsTimestamp);
|
||||||
List<OnlineAccountData> ourOnlineAccounts = new ArrayList<>();
|
List<OnlineAccountData> ourOnlineAccounts = new ArrayList<>();
|
||||||
|
|
||||||
@ -544,9 +537,7 @@ public class OnlineAccountsManager {
|
|||||||
nonce = -1;
|
nonce = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte[] signature = useAggregateCompatibleSignature
|
byte[] signature = Qortal25519Extras.signForAggregation(privateKey, timestampBytes);
|
||||||
? Qortal25519Extras.signForAggregation(privateKey, timestampBytes)
|
|
||||||
: Crypto.sign(privateKey, timestampBytes);
|
|
||||||
|
|
||||||
// Our account is online
|
// Our account is online
|
||||||
OnlineAccountData ourOnlineAccountData = new OnlineAccountData(onlineAccountsTimestamp, signature, publicKey, nonce);
|
OnlineAccountData ourOnlineAccountData = new OnlineAccountData(onlineAccountsTimestamp, signature, publicKey, nonce);
|
||||||
|
@ -67,8 +67,7 @@
|
|||||||
"calcChainWeightTimestamp": 1620579600000,
|
"calcChainWeightTimestamp": 1620579600000,
|
||||||
"transactionV5Timestamp": 1642176000000,
|
"transactionV5Timestamp": 1642176000000,
|
||||||
"transactionV6Timestamp": 9999999999999,
|
"transactionV6Timestamp": 9999999999999,
|
||||||
"disableReferenceTimestamp": 1655222400000,
|
"disableReferenceTimestamp": 1655222400000
|
||||||
"aggregateSignatureTimestamp": 1656864000000
|
|
||||||
},
|
},
|
||||||
"genesisInfo": {
|
"genesisInfo": {
|
||||||
"version": 4,
|
"version": 4,
|
||||||
|
@ -46,7 +46,7 @@ public class OnlineAccountsTests extends Common {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void beforeTest() throws DataException, IOException {
|
public void beforeTest() throws DataException, IOException {
|
||||||
Common.useSettingsAndDb("test-settings-v2-no-sig-agg.json", false);
|
Common.useSettingsAndDb("test-settings-v2.json", false);
|
||||||
NTP.setFixedOffset(Settings.getInstance().getTestNtpOffset());
|
NTP.setFixedOffset(Settings.getInstance().getTestNtpOffset());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -170,42 +170,6 @@ public class OnlineAccountsTests extends Common {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testOnlineAccountsModulusV2() throws IllegalAccessException, DataException {
|
|
||||||
try (final Repository repository = RepositoryManager.getRepository()) {
|
|
||||||
|
|
||||||
// Set feature trigger timestamp to 0 so that it is active
|
|
||||||
FieldUtils.writeField(BlockChain.getInstance(), "onlineAccountsModulusV2Timestamp", 0L, true);
|
|
||||||
|
|
||||||
List<String> onlineAccountSignatures = new ArrayList<>();
|
|
||||||
long fakeNTPOffset = 0L;
|
|
||||||
|
|
||||||
// Mint a block and store its timestamp
|
|
||||||
Block block = BlockMinter.mintTestingBlock(repository, Common.getTestAccount(repository, "alice-reward-share"));
|
|
||||||
long lastBlockTimestamp = block.getBlockData().getTimestamp();
|
|
||||||
|
|
||||||
// Mint some blocks and keep track of the different online account signatures
|
|
||||||
for (int i = 0; i < 30; i++) {
|
|
||||||
block = BlockMinter.mintTestingBlock(repository, Common.getTestAccount(repository, "alice-reward-share"));
|
|
||||||
|
|
||||||
// Increase NTP fixed offset by the block time, to simulate time passing
|
|
||||||
long blockTimeDelta = block.getBlockData().getTimestamp() - lastBlockTimestamp;
|
|
||||||
lastBlockTimestamp = block.getBlockData().getTimestamp();
|
|
||||||
fakeNTPOffset += blockTimeDelta;
|
|
||||||
NTP.setFixedOffset(fakeNTPOffset);
|
|
||||||
|
|
||||||
String lastOnlineAccountSignatures58 = Base58.encode(block.getBlockData().getOnlineAccountsSignatures());
|
|
||||||
if (!onlineAccountSignatures.contains(lastOnlineAccountSignatures58)) {
|
|
||||||
onlineAccountSignatures.add(lastOnlineAccountSignatures58);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// We expect 1-3 unique signatures over 30 blocks
|
|
||||||
System.out.println(String.format("onlineAccountSignatures count: %d", onlineAccountSignatures.size()));
|
|
||||||
assertTrue(onlineAccountSignatures.size() >= 1 && onlineAccountSignatures.size() <= 3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Ignore(value = "For informational use")
|
@Ignore(value = "For informational use")
|
||||||
public void testOnlineAccountNonceCompression() throws IOException {
|
public void testOnlineAccountNonceCompression() throws IOException {
|
||||||
|
@ -56,8 +56,7 @@
|
|||||||
"calcChainWeightTimestamp": 0,
|
"calcChainWeightTimestamp": 0,
|
||||||
"transactionV5Timestamp": 0,
|
"transactionV5Timestamp": 0,
|
||||||
"transactionV6Timestamp": 9999999999999,
|
"transactionV6Timestamp": 9999999999999,
|
||||||
"disableReferenceTimestamp": 9999999999999,
|
"disableReferenceTimestamp": 9999999999999
|
||||||
"aggregateSignatureTimestamp": 0
|
|
||||||
},
|
},
|
||||||
"genesisInfo": {
|
"genesisInfo": {
|
||||||
"version": 4,
|
"version": 4,
|
||||||
|
@ -59,8 +59,7 @@
|
|||||||
"calcChainWeightTimestamp": 0,
|
"calcChainWeightTimestamp": 0,
|
||||||
"transactionV5Timestamp": 0,
|
"transactionV5Timestamp": 0,
|
||||||
"transactionV6Timestamp": 0,
|
"transactionV6Timestamp": 0,
|
||||||
"disableReferenceTimestamp": 0,
|
"disableReferenceTimestamp": 0
|
||||||
"aggregateSignatureTimestamp": 0
|
|
||||||
},
|
},
|
||||||
"genesisInfo": {
|
"genesisInfo": {
|
||||||
"version": 4,
|
"version": 4,
|
||||||
|
@ -60,8 +60,7 @@
|
|||||||
"calcChainWeightTimestamp": 0,
|
"calcChainWeightTimestamp": 0,
|
||||||
"transactionV5Timestamp": 0,
|
"transactionV5Timestamp": 0,
|
||||||
"transactionV6Timestamp": 0,
|
"transactionV6Timestamp": 0,
|
||||||
"disableReferenceTimestamp": 9999999999999,
|
"disableReferenceTimestamp": 9999999999999
|
||||||
"aggregateSignatureTimestamp": 0
|
|
||||||
},
|
},
|
||||||
"genesisInfo": {
|
"genesisInfo": {
|
||||||
"version": 4,
|
"version": 4,
|
||||||
|
@ -60,8 +60,7 @@
|
|||||||
"calcChainWeightTimestamp": 0,
|
"calcChainWeightTimestamp": 0,
|
||||||
"transactionV5Timestamp": 0,
|
"transactionV5Timestamp": 0,
|
||||||
"transactionV6Timestamp": 0,
|
"transactionV6Timestamp": 0,
|
||||||
"disableReferenceTimestamp": 9999999999999,
|
"disableReferenceTimestamp": 9999999999999
|
||||||
"aggregateSignatureTimestamp": 0
|
|
||||||
},
|
},
|
||||||
"genesisInfo": {
|
"genesisInfo": {
|
||||||
"version": 4,
|
"version": 4,
|
||||||
|
@ -60,8 +60,7 @@
|
|||||||
"calcChainWeightTimestamp": 0,
|
"calcChainWeightTimestamp": 0,
|
||||||
"transactionV5Timestamp": 0,
|
"transactionV5Timestamp": 0,
|
||||||
"transactionV6Timestamp": 0,
|
"transactionV6Timestamp": 0,
|
||||||
"disableReferenceTimestamp": 9999999999999,
|
"disableReferenceTimestamp": 9999999999999
|
||||||
"aggregateSignatureTimestamp": 0
|
|
||||||
},
|
},
|
||||||
"genesisInfo": {
|
"genesisInfo": {
|
||||||
"version": 4,
|
"version": 4,
|
||||||
|
@ -1,87 +0,0 @@
|
|||||||
{
|
|
||||||
"isTestChain": true,
|
|
||||||
"blockTimestampMargin": 500,
|
|
||||||
"transactionExpiryPeriod": 86400000,
|
|
||||||
"maxBlockSize": 2097152,
|
|
||||||
"maxBytesPerUnitFee": 1024,
|
|
||||||
"unitFee": "0.1",
|
|
||||||
"nameRegistrationUnitFees": [
|
|
||||||
{ "timestamp": 1645372800000, "fee": "5" }
|
|
||||||
],
|
|
||||||
"requireGroupForApproval": false,
|
|
||||||
"minAccountLevelToRewardShare": 5,
|
|
||||||
"maxRewardSharesPerMintingAccount": 20,
|
|
||||||
"founderEffectiveMintingLevel": 10,
|
|
||||||
"onlineAccountSignaturesMinLifetime": 3600000,
|
|
||||||
"onlineAccountSignaturesMaxLifetime": 86400000,
|
|
||||||
"onlineAccountsModulusV2Timestamp": 9999999999999,
|
|
||||||
"rewardsByHeight": [
|
|
||||||
{ "height": 1, "reward": 100 },
|
|
||||||
{ "height": 11, "reward": 10 },
|
|
||||||
{ "height": 21, "reward": 1 }
|
|
||||||
],
|
|
||||||
"sharesByLevel": [
|
|
||||||
{ "levels": [ 1, 2 ], "share": 0.05 },
|
|
||||||
{ "levels": [ 3, 4 ], "share": 0.10 },
|
|
||||||
{ "levels": [ 5, 6 ], "share": 0.15 },
|
|
||||||
{ "levels": [ 7, 8 ], "share": 0.20 },
|
|
||||||
{ "levels": [ 9, 10 ], "share": 0.25 }
|
|
||||||
],
|
|
||||||
"qoraHoldersShare": 0.20,
|
|
||||||
"qoraPerQortReward": 250,
|
|
||||||
"blocksNeededByLevel": [ 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 ],
|
|
||||||
"blockTimingsByHeight": [
|
|
||||||
{ "height": 1, "target": 60000, "deviation": 30000, "power": 0.2 }
|
|
||||||
],
|
|
||||||
"ciyamAtSettings": {
|
|
||||||
"feePerStep": "0.0001",
|
|
||||||
"maxStepsPerRound": 500,
|
|
||||||
"stepsPerFunctionCall": 10,
|
|
||||||
"minutesPerBlock": 1
|
|
||||||
},
|
|
||||||
"featureTriggers": {
|
|
||||||
"messageHeight": 0,
|
|
||||||
"atHeight": 0,
|
|
||||||
"assetsTimestamp": 0,
|
|
||||||
"votingTimestamp": 0,
|
|
||||||
"arbitraryTimestamp": 0,
|
|
||||||
"powfixTimestamp": 0,
|
|
||||||
"qortalTimestamp": 0,
|
|
||||||
"newAssetPricingTimestamp": 0,
|
|
||||||
"groupApprovalTimestamp": 0,
|
|
||||||
"atFindNextTransactionFix": 0,
|
|
||||||
"newBlockSigHeight": 999999,
|
|
||||||
"shareBinFix": 999999,
|
|
||||||
"rewardShareLimitTimestamp": 9999999999999,
|
|
||||||
"calcChainWeightTimestamp": 0,
|
|
||||||
"transactionV5Timestamp": 0,
|
|
||||||
"transactionV6Timestamp": 0,
|
|
||||||
"disableReferenceTimestamp": 9999999999999,
|
|
||||||
"aggregateSignatureTimestamp": 9999999999999
|
|
||||||
},
|
|
||||||
"genesisInfo": {
|
|
||||||
"version": 4,
|
|
||||||
"timestamp": 0,
|
|
||||||
"transactions": [
|
|
||||||
{ "type": "ISSUE_ASSET", "assetName": "QORT", "description": "QORT native coin", "data": "", "quantity": 0, "isDivisible": true, "fee": 0 },
|
|
||||||
{ "type": "ISSUE_ASSET", "assetName": "Legacy-QORA", "description": "Representative legacy QORA", "quantity": 0, "isDivisible": true, "data": "{}", "isUnspendable": true },
|
|
||||||
{ "type": "ISSUE_ASSET", "assetName": "QORT-from-QORA", "description": "QORT gained from holding legacy QORA", "quantity": 0, "isDivisible": true, "data": "{}", "isUnspendable": true },
|
|
||||||
|
|
||||||
{ "type": "GENESIS", "recipient": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "amount": "1000000000" },
|
|
||||||
{ "type": "GENESIS", "recipient": "QixPbJUwsaHsVEofJdozU9zgVqkK6aYhrK", "amount": "1000000" },
|
|
||||||
{ "type": "GENESIS", "recipient": "QaUpHNhT3Ygx6avRiKobuLdusppR5biXjL", "amount": "1000000" },
|
|
||||||
{ "type": "GENESIS", "recipient": "Qci5m9k4rcwe4ruKrZZQKka4FzUUMut3er", "amount": "1000000" },
|
|
||||||
|
|
||||||
{ "type": "CREATE_GROUP", "creatorPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "groupName": "dev-group", "description": "developer group", "isOpen": false, "approvalThreshold": "PCT100", "minimumBlockDelay": 0, "maximumBlockDelay": 1440 },
|
|
||||||
|
|
||||||
{ "type": "ISSUE_ASSET", "issuerPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "assetName": "TEST", "description": "test asset", "data": "", "quantity": "1000000", "isDivisible": true, "fee": 0 },
|
|
||||||
{ "type": "ISSUE_ASSET", "issuerPublicKey": "C6wuddsBV3HzRrXUtezE7P5MoRXp5m3mEDokRDGZB6ry", "assetName": "OTHER", "description": "other test asset", "data": "", "quantity": "1000000", "isDivisible": true, "fee": 0 },
|
|
||||||
{ "type": "ISSUE_ASSET", "issuerPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "assetName": "GOLD", "description": "gold test asset", "data": "", "quantity": "1000000", "isDivisible": true, "fee": 0 },
|
|
||||||
|
|
||||||
{ "type": "ACCOUNT_FLAGS", "target": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "andMask": -1, "orMask": 1, "xorMask": 0 },
|
|
||||||
{ "type": "REWARD_SHARE", "minterPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "recipient": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "rewardSharePublicKey": "7PpfnvLSG7y4HPh8hE7KoqAjLCkv7Ui6xw4mKAkbZtox", "sharePercent": "100" },
|
|
||||||
|
|
||||||
{ "type": "ACCOUNT_LEVEL", "target": "Qci5m9k4rcwe4ruKrZZQKka4FzUUMut3er", "level": 5 }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
@ -60,8 +60,7 @@
|
|||||||
"calcChainWeightTimestamp": 0,
|
"calcChainWeightTimestamp": 0,
|
||||||
"transactionV5Timestamp": 0,
|
"transactionV5Timestamp": 0,
|
||||||
"transactionV6Timestamp": 0,
|
"transactionV6Timestamp": 0,
|
||||||
"disableReferenceTimestamp": 9999999999999,
|
"disableReferenceTimestamp": 9999999999999
|
||||||
"aggregateSignatureTimestamp": 0
|
|
||||||
},
|
},
|
||||||
"genesisInfo": {
|
"genesisInfo": {
|
||||||
"version": 4,
|
"version": 4,
|
||||||
|
@ -60,8 +60,7 @@
|
|||||||
"calcChainWeightTimestamp": 0,
|
"calcChainWeightTimestamp": 0,
|
||||||
"transactionV5Timestamp": 0,
|
"transactionV5Timestamp": 0,
|
||||||
"transactionV6Timestamp": 0,
|
"transactionV6Timestamp": 0,
|
||||||
"disableReferenceTimestamp": 9999999999999,
|
"disableReferenceTimestamp": 9999999999999
|
||||||
"aggregateSignatureTimestamp": 0
|
|
||||||
},
|
},
|
||||||
"genesisInfo": {
|
"genesisInfo": {
|
||||||
"version": 4,
|
"version": 4,
|
||||||
|
@ -60,8 +60,7 @@
|
|||||||
"calcChainWeightTimestamp": 0,
|
"calcChainWeightTimestamp": 0,
|
||||||
"transactionV5Timestamp": 0,
|
"transactionV5Timestamp": 0,
|
||||||
"transactionV6Timestamp": 0,
|
"transactionV6Timestamp": 0,
|
||||||
"disableReferenceTimestamp": 9999999999999,
|
"disableReferenceTimestamp": 9999999999999
|
||||||
"aggregateSignatureTimestamp": 0
|
|
||||||
},
|
},
|
||||||
"genesisInfo": {
|
"genesisInfo": {
|
||||||
"version": 4,
|
"version": 4,
|
||||||
|
@ -60,8 +60,7 @@
|
|||||||
"calcChainWeightTimestamp": 0,
|
"calcChainWeightTimestamp": 0,
|
||||||
"transactionV5Timestamp": 0,
|
"transactionV5Timestamp": 0,
|
||||||
"transactionV6Timestamp": 0,
|
"transactionV6Timestamp": 0,
|
||||||
"disableReferenceTimestamp": 9999999999999,
|
"disableReferenceTimestamp": 9999999999999
|
||||||
"aggregateSignatureTimestamp": 0
|
|
||||||
},
|
},
|
||||||
"genesisInfo": {
|
"genesisInfo": {
|
||||||
"version": 4,
|
"version": 4,
|
||||||
|
@ -60,8 +60,7 @@
|
|||||||
"newConsensusTimestamp": 0,
|
"newConsensusTimestamp": 0,
|
||||||
"transactionV5Timestamp": 0,
|
"transactionV5Timestamp": 0,
|
||||||
"transactionV6Timestamp": 0,
|
"transactionV6Timestamp": 0,
|
||||||
"disableReferenceTimestamp": 9999999999999,
|
"disableReferenceTimestamp": 9999999999999
|
||||||
"aggregateSignatureTimestamp": 0
|
|
||||||
},
|
},
|
||||||
"genesisInfo": {
|
"genesisInfo": {
|
||||||
"version": 4,
|
"version": 4,
|
||||||
|
@ -60,8 +60,7 @@
|
|||||||
"calcChainWeightTimestamp": 0,
|
"calcChainWeightTimestamp": 0,
|
||||||
"transactionV5Timestamp": 0,
|
"transactionV5Timestamp": 0,
|
||||||
"transactionV6Timestamp": 0,
|
"transactionV6Timestamp": 0,
|
||||||
"disableReferenceTimestamp": 9999999999999,
|
"disableReferenceTimestamp": 9999999999999
|
||||||
"aggregateSignatureTimestamp": 0
|
|
||||||
},
|
},
|
||||||
"genesisInfo": {
|
"genesisInfo": {
|
||||||
"version": 4,
|
"version": 4,
|
||||||
|
@ -1,19 +0,0 @@
|
|||||||
{
|
|
||||||
"repositoryPath": "testdb",
|
|
||||||
"bitcoinNet": "TEST3",
|
|
||||||
"litecoinNet": "TEST3",
|
|
||||||
"restrictedApi": false,
|
|
||||||
"blockchainConfig": "src/test/resources/test-chain-v2-no-sig-agg.json",
|
|
||||||
"exportPath": "qortal-backup-test",
|
|
||||||
"bootstrap": false,
|
|
||||||
"wipeUnconfirmedOnStart": false,
|
|
||||||
"testNtpOffset": 0,
|
|
||||||
"minPeers": 0,
|
|
||||||
"pruneBlockLimit": 100,
|
|
||||||
"bootstrapFilenamePrefix": "test-",
|
|
||||||
"dataPath": "data-test",
|
|
||||||
"tempDataPath": "data-test/_temp",
|
|
||||||
"listsPath": "lists-test",
|
|
||||||
"storagePolicy": "FOLLOWED_OR_VIEWED",
|
|
||||||
"maxStorageCapacity": 104857600
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user