/* * 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.core; import org.ethereum.db.ByteArrayWrapper; import org.ethereum.db.ContractDetails; import org.ethereum.vm.DataWord; import java.math.BigInteger; import java.util.HashMap; import java.util.Set; /** * @author Roman Mandeleil * @since 08.09.2014 */ public interface Repository extends org.ethereum.facade.Repository{ /** * Create a new account in the database * * @param addr of the contract * @return newly created account state */ AccountState createAccount(byte[] addr); /** * @param addr - account to check * @return - true if account exist, * false otherwise */ boolean isExist(byte[] addr); /** * Retrieve an account * * @param addr of the account * @return account state as stored in the database */ AccountState getAccountState(byte[] addr); /** * Deletes the account * * @param addr of the account */ void delete(byte[] addr); /** * Increase the account nonce of the given account by one * * @param addr of the account * @return new value of the nonce */ BigInteger increaseNonce(byte[] addr); /** * Sets the account nonce of the given account * * @param addr of the account * @param nonce new nonce * @return new value of the nonce */ BigInteger setNonce(byte[] addr, BigInteger nonce); /** * Get current nonce of a given account * * @param addr of the account * @return value of the nonce */ BigInteger getNonce(byte[] addr); /** * Retrieve contract details for a given account from the database * * @param addr of the account * @return new contract details */ ContractDetails getContractDetails(byte[] addr); boolean hasContractDetails(byte[] addr); /** * Store code associated with an account * * @param addr for the account * @param code that will be associated with this account */ void saveCode(byte[] addr, byte[] code); /** * Retrieve the code associated with an account * * @param addr of the account * @return code in byte-array format */ byte[] getCode(byte[] addr); /** * Retrieve the code hash associated with an account * * @param addr of the account * @return code hash */ byte[] getCodeHash(byte[] addr); /** * Put a value in storage of an account at a given key * * @param addr of the account * @param key of the data to store * @param value is the data to store */ void addStorageRow(byte[] addr, DataWord key, DataWord value); /** * Retrieve storage value from an account for a given key * * @param addr of the account * @param key associated with this value * @return data in the form of a <code>DataWord</code> */ DataWord getStorageValue(byte[] addr, DataWord key); /** * Retrieve balance of an account * * @param addr of the account * @return balance of the account as a <code>BigInteger</code> value */ BigInteger getBalance(byte[] addr); /** * Add value to the balance of an account * * @param addr of the account * @param value to be added * @return new balance of the account */ BigInteger addBalance(byte[] addr, BigInteger value); /** * @return Returns set of all the account addresses */ Set<byte[]> getAccountsKeys(); /** * Dump the full state of the current repository into a file with JSON format * It contains all the contracts/account, their attributes and * * @param block of the current state * @param gasUsed the amount of gas used in the block until that point * @param txNumber is the number of the transaction for which the dump has to be made * @param txHash is the hash of the given transaction. * If null, the block state post coinbase reward is dumped. */ void dumpState(Block block, long gasUsed, int txNumber, byte[] txHash); /** * Save a snapshot and start tracking future changes * * @return the tracker repository */ Repository startTracking(); void flush(); void flushNoReconnect(); /** * Store all the temporary changes made * to the repository in the actual database */ void commit(); /** * Undo all the changes made so far * to a snapshot of the repository */ void rollback(); /** * Return to one of the previous snapshots * by moving the root. * * @param root - new root */ void syncToRoot(byte[] root); /** * Check to see if the current repository has an open connection to the database * * @return <tt>true</tt> if connection to database is open */ boolean isClosed(); /** * Close the database */ void close(); /** * Reset */ void reset(); void updateBatch(HashMap<ByteArrayWrapper, AccountState> accountStates, HashMap<ByteArrayWrapper, ContractDetails> contractDetailes); byte[] getRoot(); void loadAccount(byte[] addr, HashMap<ByteArrayWrapper, AccountState> cacheAccounts, HashMap<ByteArrayWrapper, ContractDetails> cacheDetails); Repository getSnapshotTo(byte[] root); }