コード例 #1
0
ファイル: Block.java プロジェクト: foxesden/Qora
  public void orphan(DBSet db) {
    // ORPHAN AT TRANSACTIONS
    LinkedHashMap<Tuple2<Integer, Integer>, AT_Transaction> atTxs =
        DBSet.getInstance().getATTransactionMap().getATTransactions(this.getHeight(db));

    Iterator<AT_Transaction> iter = atTxs.values().iterator();

    while (iter.hasNext()) {
      AT_Transaction key = iter.next();
      Long amount = key.getAmount();
      if (key.getRecipientId() != null
          && !Arrays.equals(key.getRecipientId(), new byte[AT_Constants.AT_ID_SIZE])
          && !key.getRecipient().equalsIgnoreCase("1")) {
        Account recipient = new Account(key.getRecipient());
        recipient.setConfirmedBalance(
            recipient.getConfirmedBalance(db).subtract(BigDecimal.valueOf(amount, 8)), db);
        if (Arrays.equals(recipient.getLastReference(db), new byte[64])) {
          recipient.removeReference(db);
        }
      }
      Account sender = new Account(key.getSender());
      sender.setConfirmedBalance(
          sender.getConfirmedBalance(db).add(BigDecimal.valueOf(amount, 8)), db);
    }

    // ORPHAN TRANSACTIONS
    this.orphanTransactions(this.getTransactions(), db);

    // REMOVE FEE
    BigDecimal blockFee = this.getTotalFee();
    if (blockFee.compareTo(BigDecimal.ZERO) == 1) {
      // UPDATE GENERATOR BALANCE WITH FEE
      this.generator.setConfirmedBalance(
          this.generator.getConfirmedBalance(db).subtract(blockFee), db);
    }

    // DELETE AT TRANSACTIONS FROM DB
    db.getATTransactionMap().delete(this.getHeight(db));

    // DELETE TRANSACTIONS FROM FINAL MAP
    db.getTransactionFinalMap().delete(this.getHeight(db));

    // DELETE BLOCK FROM DB
    db.getBlockMap().delete(this);

    // SET PARENT AS LAST BLOCK
    db.getBlockMap().setLastBlock(this.getParent(db));

    for (Transaction transaction : this.getTransactions()) {
      // ADD ORPHANED TRANASCTIONS BACK TO DATABASE
      db.getTransactionMap().add(transaction);

      // DELETE ORPHANED TRANASCTIONS FROM PARENT DATABASE
      db.getTransactionParentMap().delete(transaction.getSignature());
    }
  }