/*
* Copyright (c) [2016] [ <ether.camp> ]
* This file is part of the ethereumJ library.
*
* The ethereumJ library is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The ethereumJ library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the ethereumJ library. If not, see <http://www.gnu.org/licenses/>.
*/
package org.ethereum.listener;
import org.ethereum.core.*;
import org.ethereum.net.eth.message.StatusMessage;
import org.ethereum.net.message.Message;
import org.ethereum.net.p2p.HelloMessage;
import org.ethereum.net.rlpx.Node;
import org.ethereum.net.server.Channel;
import java.util.List;
/**
* @author Roman Mandeleil
* @since 27.07.2014
*/
public interface EthereumListener {
enum PendingTransactionState {
/**
* Transaction may be dropped due to:
* - Invalid transaction (invalid nonce, low gas price, insufficient account funds,
* invalid signature)
* - Timeout (when pending transaction is not included to any block for
* last [transaction.outdated.threshold] blocks
* This is the final state
*/
DROPPED,
/**
* The same as PENDING when transaction is just arrived
* Next state can be either PENDING or INCLUDED
*/
NEW_PENDING,
/**
* State when transaction is not included to any blocks (on the main chain), and
* was executed on the last best block. The repository state is reflected in the PendingState
* Next state can be either INCLUDED, DROPPED (due to timeout)
* or again PENDING when a new block (without this transaction) arrives
*/
PENDING,
/**
* State when the transaction is included to a block.
* This could be the final state, however next state could also be
* PENDING: when a fork became the main chain but doesn't include this tx
* INCLUDED: when a fork became the main chain and tx is included into another
* block from the new main chain
* DROPPED: If switched to a new (long enough) main chain without this Tx
*/
INCLUDED;
public boolean isPending() {
return this == NEW_PENDING || this == PENDING;
}
}
enum SyncState {
/**
* When doing fast sync UNSECURE sync means that the full state is downloaded,
* chain is on the latest block, and blockchain operations may be executed
* (such as state querying, transaction submission)
* but the state isn't yet confirmed with the whole block chain and can't be
* trusted.
* At this stage historical blocks and receipts are unavailable yet
*/
UNSECURE,
/**
* When doing fast sync SECURE sync means that the full state is downloaded,
* chain is on the latest block, and blockchain operations may be executed
* (such as state querying, transaction submission)
* The state is now confirmed by the full chain (all block headers are
* downloaded and verified) and can be trusted
* At this stage historical blocks and receipts are unavailable yet
*/
SECURE,
/**
* Sync is fully complete. All blocks and receipts are downloaded.
*/
COMPLETE
}
void trace(String output);
void onNodeDiscovered(Node node);
void onHandShakePeer(Channel channel, HelloMessage helloMessage);
void onEthStatusUpdated(Channel channel, StatusMessage status);
void onRecvMessage(Channel channel, Message message);
void onSendMessage(Channel channel, Message message);
void onBlock(BlockSummary blockSummary);
void onPeerDisconnect(String host, long port);
/**
* @deprecated use onPendingTransactionUpdate filtering state NEW_PENDING
* Will be removed in the next release
*/
void onPendingTransactionsReceived(List<Transaction> transactions);
/**
* PendingState changes on either new pending transaction or new best block receive
* When a new transaction arrives it is executed on top of the current pending state
* When a new best block arrives the PendingState is adjusted to the new Repository state
* and all transactions which remain pending are executed on top of the new PendingState
*/
void onPendingStateChanged(PendingState pendingState);
/**
* Is called when PendingTransaction arrives, executed or dropped and included to a block
*
* @param txReceipt Receipt of the tx execution on the current PendingState
* @param state Current state of pending tx
* @param block The block which the current pending state is based on (for PENDING tx state)
* or the block which tx was included to (for INCLUDED state)
*/
void onPendingTransactionUpdate(TransactionReceipt txReceipt, PendingTransactionState state, Block block);
void onSyncDone(SyncState state);
void onNoConnections();
void onVMTraceCreated(String transactionHash, String trace);
void onTransactionExecuted(TransactionExecutionSummary summary);
void onPeerAddedToSyncPool(Channel peer);
}