package test;
import static org.junit.Assert.*;
import java.math.BigDecimal;
import ntp.NTP;
import org.junit.Test;
import qora.BlockGenerator;
import qora.account.Account;
import qora.account.PrivateKeyAccount;
import qora.block.Block;
import qora.block.GenesisBlock;
import qora.crypto.Crypto;
import qora.transaction.GenesisTransaction;
import qora.transaction.PaymentTransaction;
import qora.transaction.Transaction;
import database.DBSet;
public class GeneratorTests {
@Test
public void generateNewBlock()
{
//CREATE EMPTY MEMORY DATABASE
DBSet databaseSet = DBSet.createEmptyDatabaseSet();
//PROCESS GENESISBLOCK
GenesisBlock genesisBlock = new GenesisBlock();
genesisBlock.process(databaseSet);
//CREATE KNOWN ACCOUNT
byte[] seed = Crypto.getInstance().digest("test".getBytes());
byte[] privateKey = Crypto.getInstance().createKeyPair(seed).getA();
PrivateKeyAccount generator = new PrivateKeyAccount(privateKey);
//PROCESS GENESIS TRANSACTION TO MAKE SURE GENERATOR HAS FUNDS
Transaction transaction = new GenesisTransaction(generator, BigDecimal.valueOf(1000).setScale(8), NTP.getTime());
transaction.process(databaseSet);
//GENERATE 2000 NEXT BLOCKS
Block lastBlock = genesisBlock;
BlockGenerator blockGenerator = new BlockGenerator();
for(int i=0; i<2000; i++)
{
//GENERATE NEXT BLOCK
Block newBlock = blockGenerator.generateNextBlock(databaseSet, generator, lastBlock);
//ADD TRANSACTION SIGNATURE
byte[] transactionsSignature = Crypto.getInstance().sign(generator, newBlock.getGeneratorSignature());
newBlock.setTransactionsSignature(transactionsSignature);
//CHECK IF BLOCK SIGNATURE IS VALID
assertEquals(true, newBlock.isSignatureValid());
//CHECK IF BLOCK IS VALID
assertEquals(true, newBlock.isValid(databaseSet));
//PROCESS NEW BLOCK
newBlock.process(databaseSet);
//LAST BLOCK IS NEW BLOCK
lastBlock = newBlock;
}
}
@Test
public void addTransactions()
{
//CREATE EMPTY MEMORY DATABASE
DBSet databaseSet = DBSet.createEmptyDatabaseSet();
//PROCESS GENESISBLOCK
GenesisBlock genesisBlock = new GenesisBlock();
genesisBlock.process(databaseSet);
//CREATE KNOWN ACCOUNT
byte[] seed = Crypto.getInstance().digest("test".getBytes());
byte[] privateKey = Crypto.getInstance().createKeyPair(seed).getA();
PrivateKeyAccount generator = new PrivateKeyAccount(privateKey);
//PROCESS GENESIS TRANSACTION TO MAKE SURE GENERATOR HAS FUNDS
Transaction transaction = new GenesisTransaction(generator, BigDecimal.valueOf(100000).setScale(8), NTP.getTime());
transaction.process(databaseSet);
//GENERATE NEXT BLOCK
BlockGenerator blockGenerator = new BlockGenerator();
Block newBlock = blockGenerator.generateNextBlock(databaseSet, generator, genesisBlock);
//ADD 10 UNCONFIRMED VALID TRANSACTIONS
Account recipient = new Account("XUi2oga2pnGNcZ9es6pBqxydtRZKWdkL2g");
DBSet snapshot = databaseSet.fork();
for(int i=0; i<10; i++)
{
long timestamp = NTP.getTime();
byte[] signature = PaymentTransaction.generateSignature(snapshot, generator, recipient, BigDecimal.valueOf(1).setScale(8), BigDecimal.valueOf(1).setScale(8), timestamp);
//CREATE VALID PAYMENT
Transaction payment = new PaymentTransaction(generator, recipient, BigDecimal.valueOf(1).setScale(8), BigDecimal.valueOf(1).setScale(8), timestamp, generator.getLastReference(snapshot), signature);
//PROCESS IN DB
payment.process(snapshot);
//ADD TO UNCONFIRMED TRANSACTIONS
blockGenerator.addUnconfirmedTransaction(databaseSet, payment, false);
}
//ADD UNCONFIRMED TRANSACTIONS TO BLOCK
blockGenerator.addUnconfirmedTransactions(databaseSet, newBlock);
//CHECK IF BLOCK IS VALID
assertEquals(true, newBlock.isValid(databaseSet));
}
@Test
public void addManyTransactions()
{
//CREATE EMPTY MEMORY DATABASE
DBSet databaseSet = DBSet.createEmptyDatabaseSet();
//PROCESS GENESISBLOCK
GenesisBlock genesisBlock = new GenesisBlock();
genesisBlock.process(databaseSet);
//CREATE KNOWN ACCOUNT
byte[] seed = Crypto.getInstance().digest("test".getBytes());
byte[] privateKey = Crypto.getInstance().createKeyPair(seed).getA();
PrivateKeyAccount generator = new PrivateKeyAccount(privateKey);
//PROCESS GENESIS TRANSACTION TO MAKE SURE GENERATOR HAS FUNDS
Transaction transaction = new GenesisTransaction(generator, BigDecimal.valueOf(100000).setScale(8), NTP.getTime());
transaction.process(databaseSet);
//GENERATE NEXT BLOCK
BlockGenerator blockGenerator = new BlockGenerator();
Block newBlock = blockGenerator.generateNextBlock(databaseSet, generator, genesisBlock);
//ADD 10 UNCONFIRMED VALID TRANSACTIONS
Account recipient = new Account("XUi2oga2pnGNcZ9es6pBqxydtRZKWdkL2g");
DBSet snapshot = databaseSet.fork();
for(int i=0; i<10000; i++)
{
long timestamp = NTP.getTime();
byte[] signature = PaymentTransaction.generateSignature(snapshot, generator, recipient, BigDecimal.valueOf(1).setScale(8), BigDecimal.valueOf(1).setScale(8), timestamp);
//CREATE VALID PAYMENT
Transaction payment = new PaymentTransaction(generator, recipient, BigDecimal.valueOf(1).setScale(8), BigDecimal.valueOf(1).setScale(8), timestamp, generator.getLastReference(snapshot), signature);
//PROCESS IN DB
payment.process(snapshot);
//ADD TO UNCONFIRMED TRANSACTIONS
blockGenerator.addUnconfirmedTransaction(databaseSet, payment, false);
}
//ADD UNCONFIRMED TRANSACTIONS TO BLOCK
blockGenerator.addUnconfirmedTransactions(databaseSet, newBlock);
//CHECK THAT NOT ALL TRANSACTIONS WERE ADDED TO BLOCK
assertNotEquals(10000, newBlock.getTransactionCount());
//CHECK IF BLOCK IS VALID
assertEquals(true, newBlock.isValid(databaseSet));
}
//TODO CALCULATETRANSACTIONSIGNATURE
}