Example #1
0
  @Test
  public void orphanBlock() {
    // 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 NEXT BLOCK
    BlockGenerator blockGenerator = new BlockGenerator();
    Block block = blockGenerator.generateNextBlock(databaseSet, generator, genesisBlock);

    // FORK
    DBSet fork = databaseSet.fork();

    // GENERATE PAYMENT 1
    Account recipient = new Account("XUi2oga2pnGNcZ9es6pBqxydtRZKWdkL2g");
    long timestamp = block.getTimestamp();
    byte[] signature =
        PaymentTransaction.generateSignature(
            databaseSet,
            generator,
            recipient,
            BigDecimal.valueOf(100).setScale(8),
            BigDecimal.valueOf(1).setScale(8),
            timestamp);
    Transaction payment1 =
        new PaymentTransaction(
            generator,
            recipient,
            BigDecimal.valueOf(100).setScale(8),
            BigDecimal.valueOf(1).setScale(8),
            timestamp,
            generator.getLastReference(databaseSet),
            signature);
    payment1.process(fork);
    block.addTransaction(payment1);

    // GENERATE PAYMENT 2
    Account recipient2 = new Account("XLPYYfxKEiDcybCkFA7jXcxSdePMMoyZLt");
    signature =
        PaymentTransaction.generateSignature(
            fork,
            generator,
            recipient2,
            BigDecimal.valueOf(100).setScale(8),
            BigDecimal.valueOf(1).setScale(8),
            timestamp);
    Transaction payment2 =
        new PaymentTransaction(
            generator,
            recipient2,
            BigDecimal.valueOf(100).setScale(8),
            BigDecimal.valueOf(1).setScale(8),
            timestamp,
            generator.getLastReference(fork),
            signature);
    block.addTransaction(payment2);

    // ADD TRANSACTION SIGNATURE
    byte[] transactionsSignature = blockGenerator.calculateTransactionsSignature(block, generator);
    block.setTransactionsSignature(transactionsSignature);

    // CHECK VALID
    assertEquals(true, block.isSignatureValid());
    assertEquals(true, block.isValid(databaseSet));

    // PROCESS BLOCK
    block.process(databaseSet);

    // ORPHAN BLOCK
    block.orphan(databaseSet);

    // CHECK BALANCE GENERATOR
    assertEquals(
        true, generator.getConfirmedBalance(databaseSet).compareTo(BigDecimal.valueOf(1000)) == 0);

    // CHECK LAST REFERENCE GENERATOR
    assertEquals(
        true, Arrays.equals(generator.getLastReference(databaseSet), transaction.getSignature()));

    // CHECK BALANCE RECIPIENT
    assertEquals(
        true, recipient.getConfirmedBalance(databaseSet).compareTo(BigDecimal.valueOf(1000)) == 0);

    // CHECK LAST REFERENCE RECIPIENT
    assertEquals(
        false, Arrays.equals(recipient.getLastReference(databaseSet), payment1.getSignature()));

    // CHECK BALANCE RECIPIENT2
    assertEquals(
        true, recipient2.getConfirmedBalance(databaseSet).compareTo(BigDecimal.valueOf(0)) == 0);

    // CHECK LAST REFERENCE RECIPIENT
    assertEquals(true, Arrays.equals(recipient2.getLastReference(databaseSet), new byte[0]));

    // CHECK LAST BLOCK
    assertEquals(
        true,
        Arrays.equals(
            genesisBlock.getSignature(), databaseSet.getBlockMap().getLastBlock().getSignature()));
  }
Example #2
0
  @Test
  public void validateSignatureBlock() {
    // 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 NEXT BLOCK
    BlockGenerator blockGenerator = new BlockGenerator();
    Block newBlock = blockGenerator.generateNextBlock(databaseSet, generator, genesisBlock);

    // ADD TRANSACTION SIGNATURE
    byte[] transactionsSignature =
        Crypto.getInstance().sign(generator, newBlock.getGeneratorSignature());
    newBlock.setTransactionsSignature(transactionsSignature);

    // CHECK IF SIGNATURE VALID
    assertEquals(true, newBlock.isSignatureValid());

    // INVALID TRANSACTION SIGNATURE
    transactionsSignature = new byte[64];
    newBlock.setTransactionsSignature(transactionsSignature);

    // CHECK IF SIGNATURE INVALID
    assertEquals(false, newBlock.isSignatureValid());

    // INVALID GENERATOR SIGNATURE
    newBlock =
        BlockFactory.getInstance()
            .create(
                newBlock.getVersion(),
                newBlock.getReference(),
                newBlock.getTimestamp(),
                newBlock.getGeneratingBalance(),
                generator,
                new byte[32]);
    transactionsSignature = Crypto.getInstance().sign(generator, newBlock.getGeneratorSignature());
    newBlock.setTransactionsSignature(transactionsSignature);

    /// CHECK IF SIGNATURE INVALID
    assertEquals(false, newBlock.isSignatureValid());

    // VALID TRANSACTION SIGNATURE
    newBlock = blockGenerator.generateNextBlock(databaseSet, generator, genesisBlock);

    // ADD TRANSACTION
    Account recipient = new Account("XUi2oga2pnGNcZ9es6pBqxydtRZKWdkL2g");
    long timestamp = newBlock.getTimestamp();
    byte[] signature =
        PaymentTransaction.generateSignature(
            databaseSet,
            generator,
            recipient,
            BigDecimal.valueOf(100).setScale(8),
            BigDecimal.valueOf(1).setScale(8),
            timestamp);
    Transaction payment =
        new PaymentTransaction(
            generator,
            recipient,
            BigDecimal.valueOf(100).setScale(8),
            BigDecimal.valueOf(1).setScale(8),
            timestamp,
            generator.getLastReference(databaseSet),
            signature);
    newBlock.addTransaction(payment);

    // ADD TRANSACTION SIGNATURE
    transactionsSignature = blockGenerator.calculateTransactionsSignature(newBlock, generator);
    newBlock.setTransactionsSignature(transactionsSignature);

    // CHECK VALID TRANSACTION SIGNATURE
    assertEquals(true, newBlock.isSignatureValid());

    // INVALID TRANSACTION SIGNATURE
    newBlock = blockGenerator.generateNextBlock(databaseSet, generator, genesisBlock);

    // ADD TRANSACTION
    payment =
        new PaymentTransaction(
            generator,
            recipient,
            BigDecimal.valueOf(200).setScale(8),
            BigDecimal.valueOf(1).setScale(8),
            timestamp,
            generator.getLastReference(databaseSet),
            signature);
    newBlock.addTransaction(payment);

    // ADD TRANSACTION SIGNATURE
    transactionsSignature = blockGenerator.calculateTransactionsSignature(newBlock, generator);
    newBlock.setTransactionsSignature(transactionsSignature);

    // CHECK INVALID TRANSACTION SIGNATURE
    assertEquals(false, newBlock.isSignatureValid());
  }