core, miner, tests: renamed state methods
* Update => SyncIntermediate * Added SyncObjects SyncIntermediate only updates whatever has changed, but, as a side effect, requires much more disk space. SyncObjects will only sync whatever is required for a block and will not save intermediate state to disk. As drawback this requires more time when more txs come in.
This commit is contained in:
parent
08caeedd84
commit
ab16ce70fc
|
@ -77,7 +77,7 @@ func (self *BlockProcessor) ApplyTransaction(coinbase *state.StateObject, stated
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the state with pending changes
|
// Update the state with pending changes
|
||||||
statedb.Update()
|
statedb.SyncIntermediate()
|
||||||
|
|
||||||
usedGas.Add(usedGas, gas)
|
usedGas.Add(usedGas, gas)
|
||||||
receipt := types.NewReceipt(statedb.Root().Bytes(), usedGas)
|
receipt := types.NewReceipt(statedb.Root().Bytes(), usedGas)
|
||||||
|
@ -243,7 +243,7 @@ func (sm *BlockProcessor) processWithParent(block, parent *types.Block) (logs st
|
||||||
|
|
||||||
// Commit state objects/accounts to a temporary trie (does not save)
|
// Commit state objects/accounts to a temporary trie (does not save)
|
||||||
// used to calculate the state root.
|
// used to calculate the state root.
|
||||||
state.CleanUpdate()
|
state.SyncObjects()
|
||||||
if header.Root != state.Root() {
|
if header.Root != state.Root() {
|
||||||
err = fmt.Errorf("invalid merkle root. received=%x got=%x", header.Root, state.Root())
|
err = fmt.Errorf("invalid merkle root. received=%x got=%x", header.Root, state.Root())
|
||||||
return
|
return
|
||||||
|
|
|
@ -77,7 +77,7 @@ func (b *BlockGen) AddTx(tx *types.Transaction) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
b.statedb.Update()
|
b.statedb.SyncIntermediate()
|
||||||
b.header.GasUsed.Add(b.header.GasUsed, gas)
|
b.header.GasUsed.Add(b.header.GasUsed, gas)
|
||||||
receipt := types.NewReceipt(b.statedb.Root().Bytes(), b.header.GasUsed)
|
receipt := types.NewReceipt(b.statedb.Root().Bytes(), b.header.GasUsed)
|
||||||
logs := b.statedb.GetLogs(tx.Hash())
|
logs := b.statedb.GetLogs(tx.Hash())
|
||||||
|
@ -135,7 +135,7 @@ func GenerateChain(parent *types.Block, db common.Database, n int, gen func(int,
|
||||||
gen(i, b)
|
gen(i, b)
|
||||||
}
|
}
|
||||||
AccumulateRewards(statedb, h, b.uncles)
|
AccumulateRewards(statedb, h, b.uncles)
|
||||||
statedb.Update()
|
statedb.SyncIntermediate()
|
||||||
h.Root = statedb.Root()
|
h.Root = statedb.Root()
|
||||||
return types.NewBlock(h, b.txs, b.uncles, b.receipts)
|
return types.NewBlock(h, b.txs, b.uncles, b.receipts)
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,7 +64,7 @@ func GenesisBlockForTesting(db common.Database, addr common.Address, balance *bi
|
||||||
statedb := state.New(common.Hash{}, db)
|
statedb := state.New(common.Hash{}, db)
|
||||||
obj := statedb.GetOrNewStateObject(addr)
|
obj := statedb.GetOrNewStateObject(addr)
|
||||||
obj.SetBalance(balance)
|
obj.SetBalance(balance)
|
||||||
statedb.Update()
|
statedb.SyncObjects()
|
||||||
statedb.Sync()
|
statedb.Sync()
|
||||||
block := types.NewBlock(&types.Header{
|
block := types.NewBlock(&types.Header{
|
||||||
Difficulty: params.GenesisDifficulty,
|
Difficulty: params.GenesisDifficulty,
|
||||||
|
|
|
@ -72,7 +72,7 @@ func TestNull(t *testing.T) {
|
||||||
//value := common.FromHex("0x823140710bf13990e4500136726d8b55")
|
//value := common.FromHex("0x823140710bf13990e4500136726d8b55")
|
||||||
var value common.Hash
|
var value common.Hash
|
||||||
state.SetState(address, common.Hash{}, value)
|
state.SetState(address, common.Hash{}, value)
|
||||||
state.Update()
|
state.SyncIntermediate()
|
||||||
state.Sync()
|
state.Sync()
|
||||||
value = state.GetState(address, common.Hash{})
|
value = state.GetState(address, common.Hash{})
|
||||||
if !common.EmptyHash(value) {
|
if !common.EmptyHash(value) {
|
||||||
|
|
|
@ -324,7 +324,8 @@ func (self *StateDB) Refunds() *big.Int {
|
||||||
return self.refund
|
return self.refund
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *StateDB) Update() {
|
// SyncIntermediate updates the intermediate state and all mid steps
|
||||||
|
func (self *StateDB) SyncIntermediate() {
|
||||||
self.refund = new(big.Int)
|
self.refund = new(big.Int)
|
||||||
|
|
||||||
for _, stateObject := range self.stateObjects {
|
for _, stateObject := range self.stateObjects {
|
||||||
|
@ -341,7 +342,8 @@ func (self *StateDB) Update() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *StateDB) CleanUpdate() {
|
// SyncObjects syncs the changed objects to the trie
|
||||||
|
func (self *StateDB) SyncObjects() {
|
||||||
self.trie = trie.NewSecure(self.root[:], self.db)
|
self.trie = trie.NewSecure(self.root[:], self.db)
|
||||||
|
|
||||||
self.refund = new(big.Int)
|
self.refund = new(big.Int)
|
||||||
|
|
|
@ -453,7 +453,7 @@ func (self *worker) commitNewWork() {
|
||||||
if atomic.LoadInt32(&self.mining) == 1 {
|
if atomic.LoadInt32(&self.mining) == 1 {
|
||||||
// commit state root after all state transitions.
|
// commit state root after all state transitions.
|
||||||
core.AccumulateRewards(self.current.state, header, uncles)
|
core.AccumulateRewards(self.current.state, header, uncles)
|
||||||
current.state.Update()
|
current.state.SyncObjects()
|
||||||
self.current.state.Sync()
|
self.current.state.Sync()
|
||||||
header.Root = current.state.Root()
|
header.Root = current.state.Root()
|
||||||
}
|
}
|
||||||
|
|
|
@ -215,7 +215,7 @@ func (t *BlockTest) InsertPreState(ethereum *eth.Ethereum) (*state.StateDB, erro
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// sync objects to trie
|
// sync objects to trie
|
||||||
statedb.Update()
|
statedb.SyncObjects()
|
||||||
// sync trie to disk
|
// sync trie to disk
|
||||||
statedb.Sync()
|
statedb.Sync()
|
||||||
|
|
||||||
|
|
|
@ -175,7 +175,7 @@ func RunState(statedb *state.StateDB, env, tx map[string]string) ([]byte, state.
|
||||||
if core.IsNonceErr(err) || core.IsInvalidTxErr(err) || state.IsGasLimitErr(err) {
|
if core.IsNonceErr(err) || core.IsInvalidTxErr(err) || state.IsGasLimitErr(err) {
|
||||||
statedb.Set(snapshot)
|
statedb.Set(snapshot)
|
||||||
}
|
}
|
||||||
statedb.Update()
|
statedb.SyncObjects()
|
||||||
|
|
||||||
return ret, vmenv.state.Logs(), vmenv.Gas, err
|
return ret, vmenv.state.Logs(), vmenv.Gas, err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue