@ -73,8 +73,8 @@ OverlayDB State::openDB(std::string const& _basePath, h256 const& _genesisHash,
o . max_open_files = 256 ;
o . create_if_missing = true ;
ldb : : DB * db = nullptr ;
ldb : : DB : : Open ( o , path + " /state " , & db ) ;
if ( ! db )
ldb : : Status status = ldb : : DB : : Open ( o , path + " /state " , & db ) ;
if ( ! status . ok ( ) | | ! db )
{
if ( boost : : filesystem : : space ( path + " /state " ) . available < 1024 )
{
@ -83,6 +83,7 @@ OverlayDB State::openDB(std::string const& _basePath, h256 const& _genesisHash,
}
else
{
cwarn < < status . ToString ( ) ;
cwarn < < " Database already open. You appear to have another instance of ethereum running. Bailing. " ;
BOOST_THROW_EXCEPTION ( DatabaseAlreadyOpen ( ) ) ;
}
@ -119,7 +120,7 @@ PopulationStatistics State::populateFromChain(BlockChain const& _bc, h256 const&
{
// Might be worth throwing here.
cwarn < < " Invalid block given for state population: " < < _h ;
return ret ;
BOOST_THROW_EXCEPTION ( BlockNotFound ( ) < < errinfo_target ( _h ) ) ;
}
auto b = _bc . block ( _h ) ;
@ -203,10 +204,6 @@ State& State::operator=(State const& _s)
return * this ;
}
State : : ~ State ( )
{
}
StateDiff State : : diff ( State const & _c , bool _quick ) const
{
StateDiff ret ;
@ -237,9 +234,6 @@ StateDiff State::diff(State const& _c, bool _quick) const
for ( auto const & i : _c . m_cache )
ads . insert ( i . first ) ;
// cnote << *this;
// cnote << _c;
for ( auto const & i : ads )
{
auto it = m_cache . find ( i ) ;
@ -254,12 +248,12 @@ StateDiff State::diff(State const& _c, bool _quick) const
return ret ;
}
void State : : ensureCached ( Address _a , bool _requireCode , bool _forceCreate ) const
void State : : ensureCached ( Address const & _a , bool _requireCode , bool _forceCreate ) const
{
ensureCached ( m_cache , _a , _requireCode , _forceCreate ) ;
}
void State : : ensureCached ( std : : unordered_map < Address , Account > & _cache , Address _a , bool _requireCode , bool _forceCreate ) const
void State : : ensureCached ( std : : unordered_map < Address , Account > & _cache , const Address & _a , bool _requireCode , bool _forceCreate ) const
{
auto it = _cache . find ( _a ) ;
if ( it = = _cache . end ( ) )
@ -297,14 +291,14 @@ bool State::sync(BlockChain const& _bc, h256 const& _block, BlockInfo const& _bi
bool ret = false ;
// BLOCK
BlockInfo bi = _bi ? _bi : _bc . info ( _block ) ;
/* if (!bi)
# if ETH_PARANOIA
if ( ! bi )
while ( 1 )
{
try
{
auto b = _bc . block ( _block ) ;
bi . populate ( b ) ;
// bi.verifyInternals(_bc.block(_block)); // Unneeded - we already verify on import into the blockchain.
break ;
}
catch ( Exception const & _e )
@ -319,7 +313,8 @@ bool State::sync(BlockChain const& _bc, h256 const& _block, BlockInfo const& _bi
cerr < < " ERROR: Corrupt block-chain! Delete your block-chain DB and restart. " < < endl ;
cerr < < _e . what ( ) < < endl ;
}
} */
}
# endif
if ( bi = = m_currentBlock )
{
// We mined the last block.
@ -344,7 +339,7 @@ bool State::sync(BlockChain const& _bc, h256 const& _block, BlockInfo const& _bi
cwarn < < " Unable to sync to " < < bi . hash ( ) < < " ; state root " < < bi . stateRoot ( ) < < " not found in database. " ;
cwarn < < " Database corrupt: contains block without stateRoot: " < < bi ;
cwarn < < " Try rescuing the database by running: eth --rescue " ;
exit ( - 1 ) ;
BOOST_THROW_EXCEPTION ( InvalidStateRoot ( ) < < errinfo_target ( bi . stateRoot ( ) ) ) ;
}
m_previousBlock = bi ;
resetCurrent ( ) ;
@ -467,7 +462,6 @@ void State::resetCurrent()
m_currentBlock . setTimestamp ( max ( m_previousBlock . timestamp ( ) + 1 , ( u256 ) time ( 0 ) ) ) ;
m_currentBlock . populateFromParent ( m_previousBlock ) ;
// Update timestamp according to clock.
// TODO: check.
m_lastTx = m_db ;
@ -547,7 +541,6 @@ pair<TransactionReceipts, bool> State::sync(BlockChain const& _bc, TransactionQu
// Temporarily no gas left in current block.
// OPTIMISE: could note this and then we don't evaluate until a block that does have the gas left.
// for now, just leave alone.
// _tq.setFuture(t.sha3());
}
}
catch ( Exception const & _e )
@ -773,7 +766,8 @@ void State::cleanup(bool _fullCommit)
if ( isChannelVisible < StateTrace > ( ) ) // Avoid calling toHex if not needed
clog ( StateTrace ) < < " Committing to disk: stateRoot " < < m_currentBlock . stateRoot ( ) < < " = " < < rootHash ( ) < < " = " < < toHex ( asBytes ( m_db . lookup ( rootHash ( ) ) ) ) ;
try {
try
{
EnforceRefs er ( m_db , true ) ;
rootHash ( ) ;
}
@ -814,45 +808,6 @@ void State::uncommitToMine()
}
}
bool State : : amIJustParanoid ( BlockChain const & _bc )
{
( void ) _bc ;
/*
commitToMine ( _bc ) ;
// Update difficulty according to timestamp.
m_currentBlock . difficulty = m_currentBlock . calculateDifficulty ( m_previousBlock ) ;
// Compile block:
RLPStream block ;
block . appendList ( 3 ) ;
m_currentBlock . streamRLP ( block , WithProof ) ;
block . appendRaw ( m_currentTxs ) ;
block . appendRaw ( m_currentUncles ) ;
State s ( * this ) ;
s . resetCurrent ( ) ;
try
{
cnote < < " PARANOIA root: " < < s . rootHash ( ) ;
// s.m_currentBlock.populate(&block.out(), false);
// s.m_currentBlock.verifyInternals(&block.out());
s . enact ( BlockChain : : verifyBlock ( block . out ( ) , std : : function < void ( Exception & ) > ( ) , ImportRequirements : : CheckUncles | ImportRequirements : : CheckTransactions ) , _bc ) ; // don't check nonce for this since we haven't mined it yet.
s . cleanup ( false ) ;
return true ;
}
catch ( Exception const & _e )
{
cwarn < < " Bad block: " < < diagnostic_information ( _e ) ;
}
catch ( std : : exception const & _e )
{
cwarn < < " Bad block: " < < _e . what ( ) ;
}
*/
return false ;
}
LogBloom State : : logBloom ( ) const
{
LogBloom ret ;
@ -865,12 +820,6 @@ void State::commitToMine(BlockChain const& _bc, bytes const& _extraData)
{
uncommitToMine ( ) ;
// cnote << "Committing to mine on block" << m_previousBlock.hash;
# if ETH_PARANOIA && 0
commit ( ) ;
cnote < < " Pre-reward stateRoot: " < < m_state . root ( ) ;
# endif
m_lastTx = m_db ;
vector < BlockInfo > uncleBlockHeaders ;
@ -880,7 +829,7 @@ void State::commitToMine(BlockChain const& _bc, bytes const& _extraData)
if ( m_previousBlock . number ( ) ! = 0 )
{
// Find great-uncles (or second-cousins or whatever they are) - children of great-grandparents, great-great-grandparents... that were not already uncles in previous generations.
// cout << "Checking " << m_previousBlock.hash << ", parent=" << m_previousBlock.parentHash() << endl;
clog ( StateDetail ) < < " Checking " < < m_previousBlock . hash ( ) < < " , parent= " < < m_previousBlock . parentHash ( ) ;
h256Hash excluded = _bc . allKinFrom ( m_currentBlock . parentHash ( ) , 6 ) ;
auto p = m_previousBlock . parentHash ( ) ;
for ( unsigned gen = 0 ; gen < 6 & & p ! = _bc . genesisHash ( ) & & unclesCount < 2 ; + + gen , p = _bc . details ( p ) . parent )
@ -931,9 +880,9 @@ void State::commitToMine(BlockChain const& _bc, bytes const& _extraData)
// Commit any and all changes to the trie that are in the cache, then update the state root accordingly.
commit ( ) ;
// cnote << "Post-reward stateRoot:" << m_state.root();
// cnote << m_state;
// cnote << *this;
clog ( StateDetail ) < < " Post-reward stateRoot: " < < m_state . root ( ) ;
clog ( StateDetail ) < < m_state ;
clog ( StateDetail ) < < * this ;
m_currentBlock . setLogBloom ( logBloom ( ) ) ;
m_currentBlock . setGasUsed ( gasUsed ( ) ) ;
@ -956,7 +905,7 @@ bool State::sealBlock(bytesConstRef _header)
if ( ! m_committedToMine )
return false ;
cdebug < < " Sealing block! " ;
clog ( StateDetail ) < < " Sealing block! " ;
// Got it!
// Compile block:
@ -986,7 +935,7 @@ bool State::sealBlock(bytesConstRef _header)
return true ;
}
bool State : : addressInUse ( Address _id ) const
bool State : : addressInUse ( Address const & _id ) const
{
ensureCached ( _id , false , false ) ;
auto it = m_cache . find ( _id ) ;
@ -995,7 +944,7 @@ bool State::addressInUse(Address _id) const
return true ;
}
bool State : : addressHasCode ( Address _id ) const
bool State : : addressHasCode ( Address const & _id ) const
{
ensureCached ( _id , false , false ) ;
auto it = m_cache . find ( _id ) ;
@ -1004,7 +953,7 @@ bool State::addressHasCode(Address _id) const
return it - > second . isFreshCode ( ) | | it - > second . codeHash ( ) ! = EmptySHA3 ;
}
u256 State : : balance ( Address _id ) const
u256 State : : balance ( Address const & _id ) const
{
ensureCached ( _id , false , false ) ;
auto it = m_cache . find ( _id ) ;
@ -1013,7 +962,7 @@ u256 State::balance(Address _id) const
return it - > second . balance ( ) ;
}
void State : : noteSending ( Address _id )
void State : : noteSending ( Address const & _id )
{
ensureCached ( _id , false , false ) ;
auto it = m_cache . find ( _id ) ;
@ -1027,7 +976,7 @@ void State::noteSending(Address _id)
it - > second . incNonce ( ) ;
}
void State : : addBalance ( Address _id , u256 _amount )
void State : : addBalance ( Address const & _id , u256 const & _amount )
{
ensureCached ( _id , false , false ) ;
auto it = m_cache . find ( _id ) ;
@ -1037,7 +986,7 @@ void State::addBalance(Address _id, u256 _amount)
it - > second . addBalance ( _amount ) ;
}
void State : : subBalance ( Address _id , bigint _amount )
void State : : subBalance ( Address const & _id , bigint const & _amount )
{
ensureCached ( _id , false , false ) ;
auto it = m_cache . find ( _id ) ;
@ -1047,7 +996,7 @@ void State::subBalance(Address _id, bigint _amount)
it - > second . addBalance ( - _amount ) ;
}
Address State : : newContract ( u256 _balance , bytes const & _code )
Address State : : newContract ( u256 const & _balance , bytes const & _code )
{
auto h = sha3 ( _code ) ;
m_db . insert ( h , & _code ) ;
@ -1064,7 +1013,7 @@ Address State::newContract(u256 _balance, bytes const& _code)
}
}
u256 State : : transactionsFrom ( Address _id ) const
u256 State : : transactionsFrom ( Address const & _id ) const
{
ensureCached ( _id , false , false ) ;
auto it = m_cache . find ( _id ) ;
@ -1074,7 +1023,7 @@ u256 State::transactionsFrom(Address _id) const
return it - > second . nonce ( ) ;
}
u256 State : : storage ( Address _id , u256 _memory ) const
u256 State : : storage ( Address const & _id , u256 const & _memory ) const
{
ensureCached ( _id , false , false ) ;
auto it = m_cache . find ( _id ) ;
@ -1096,7 +1045,7 @@ u256 State::storage(Address _id, u256 _memory) const
return ret ;
}
unordered_map < u256 , u256 > State : : storage ( Address _id ) const
unordered_map < u256 , u256 > State : : storage ( Address const & _id ) const
{
unordered_map < u256 , u256 > ret ;
@ -1122,7 +1071,7 @@ unordered_map<u256, u256> State::storage(Address _id) const
return ret ;
}
h256 State : : storageRoot ( Address _id ) const
h256 State : : storageRoot ( Address const & _id ) const
{
string s = m_state . at ( _id ) ;
if ( s . size ( ) )
@ -1133,7 +1082,7 @@ h256 State::storageRoot(Address _id) const
return EmptyTrie ;
}
bytes const & State : : code ( Address _contract ) const
bytes const & State : : code ( Address const & _contract ) const
{
if ( ! addressHasCode ( _contract ) )
return NullBytes ;
@ -1141,7 +1090,7 @@ bytes const& State::code(Address _contract) const
return m_cache [ _contract ] . code ( ) ;
}
h256 State : : codeHash ( Address _contract ) const
h256 State : : codeHash ( Address const & _contract ) const
{
if ( ! addressHasCode ( _contract ) )
return EmptySHA3 ;
@ -1162,7 +1111,7 @@ bool State::isTrieGood(bool _enforceRefs, bool _requireNoLeftOvers) const
cwarn < < " LEFTOVERS " < < ( e ? " [enforced " : " [unenforced " ) < < " refs] " ;
cnote < < " Left: " < < lo ;
cnote < < " Keys: " < < m_db . keys ( ) ;
// m_state.debugStructure(cerr);
m_state . debugStructure ( cerr ) ;
return false ;
}
// TODO: Enable once fixed.
@ -1179,14 +1128,12 @@ bool State::isTrieGood(bool _enforceRefs, bool _requireNoLeftOvers) const
{
cwarn < < " BAD TRIE " < < ( e ? " [enforced " : " [unenforced " ) < < " refs] " ;
cnote < < m_db . keys ( ) ;
// m_state.debugStructure(cerr);
m_state . debugStructure ( cerr ) ;
return false ;
}
return true ;
}
# define ETH_VMTIMER 1
ExecutionResult State : : execute ( LastHashes const & _lh , Transaction const & _t , Permanence _p , OnOpFunc const & _onOp )
{
# if ETH_PARANOIA