/* * 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); }