diff options
author | obscuren <geffobscura@gmail.com> | 2015-02-04 21:52:59 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2015-02-04 21:53:22 +0800 |
commit | b1870631a4829e075eae77064973ef94aa2166b3 (patch) | |
tree | 1baf861b569d8310eb332238e5b771251141fd54 /core/block_processor.go | |
parent | 4dc283c0fb5d886ce8d3638c3322af7e6f2a3b2e (diff) | |
download | go-tangerine-b1870631a4829e075eae77064973ef94aa2166b3.tar go-tangerine-b1870631a4829e075eae77064973ef94aa2166b3.tar.gz go-tangerine-b1870631a4829e075eae77064973ef94aa2166b3.tar.bz2 go-tangerine-b1870631a4829e075eae77064973ef94aa2166b3.tar.lz go-tangerine-b1870631a4829e075eae77064973ef94aa2166b3.tar.xz go-tangerine-b1870631a4829e075eae77064973ef94aa2166b3.tar.zst go-tangerine-b1870631a4829e075eae77064973ef94aa2166b3.zip |
WIP miner
Diffstat (limited to 'core/block_processor.go')
-rw-r--r-- | core/block_processor.go | 74 |
1 files changed, 37 insertions, 37 deletions
diff --git a/core/block_processor.go b/core/block_processor.go index 4d5cd94c9..20a651e84 100644 --- a/core/block_processor.go +++ b/core/block_processor.go @@ -84,6 +84,35 @@ func (sm *BlockProcessor) TransitionState(statedb *state.StateDB, parent, block return receipts, nil } +func (self *BlockProcessor) ApplyTransaction(coinbase *state.StateObject, state *state.StateDB, block *types.Block, tx *types.Transaction, usedGas *big.Int, transientProcess bool) (*types.Receipt, *big.Int, error) { + // If we are mining this block and validating we want to set the logs back to 0 + state.EmptyLogs() + + txGas := new(big.Int).Set(tx.Gas()) + + cb := state.GetStateObject(coinbase.Address()) + st := NewStateTransition(NewEnv(state, self.bc, tx, block), tx, cb) + _, err := st.TransitionState() + + txGas.Sub(txGas, st.gas) + + // Update the state with pending changes + state.Update(txGas) + + cumulative := new(big.Int).Set(usedGas.Add(usedGas, txGas)) + receipt := types.NewReceipt(state.Root(), cumulative) + receipt.SetLogs(state.Logs()) + receipt.Bloom = types.CreateBloom(types.Receipts{receipt}) + chainlogger.Debugln(receipt) + + // Notify all subscribers + if !transientProcess { + go self.eventMux.Post(TxPostEvent{tx}) + } + + return receipt, txGas, err +} + func (self *BlockProcessor) ApplyTransactions(coinbase *state.StateObject, state *state.StateDB, block *types.Block, txs types.Transactions, transientProcess bool) (types.Receipts, types.Transactions, types.Transactions, types.Transactions, error) { var ( receipts types.Receipts @@ -96,15 +125,10 @@ func (self *BlockProcessor) ApplyTransactions(coinbase *state.StateObject, state done: for i, tx := range txs { - // If we are mining this block and validating we want to set the logs back to 0 - state.EmptyLogs() - - txGas := new(big.Int).Set(tx.Gas()) - - cb := state.GetStateObject(coinbase.Address()) - st := NewStateTransition(NewEnv(state, self.bc, tx, block), tx, cb) - _, err = st.TransitionState() + receipt, txGas, err := self.ApplyTransaction(coinbase, state, block, tx, totalUsedGas, transientProcess) if err != nil { + return nil, nil, nil, nil, err + switch { case IsNonceErr(err): err = nil // ignore error @@ -119,30 +143,10 @@ done: err = nil } } - - txGas.Sub(txGas, st.gas) - cumulativeSum.Add(cumulativeSum, new(big.Int).Mul(txGas, tx.GasPrice())) - - // Update the state with pending changes - state.Update(txGas) - - cumulative := new(big.Int).Set(totalUsedGas.Add(totalUsedGas, txGas)) - receipt := types.NewReceipt(state.Root(), cumulative) - receipt.SetLogs(state.Logs()) - receipt.Bloom = types.CreateBloom(types.Receipts{receipt}) - chainlogger.Debugln(receipt) - - // Notify all subscribers - if !transientProcess { - go self.eventMux.Post(TxPostEvent{tx}) - } - receipts = append(receipts, receipt) handled = append(handled, tx) - if ethutil.Config.Diff && ethutil.Config.DiffType == "all" { - state.CreateOutputForDiff() - } + cumulativeSum.Add(cumulativeSum, new(big.Int).Mul(txGas, tx.GasPrice())) } block.Reward = cumulativeSum @@ -285,6 +289,10 @@ func (sm *BlockProcessor) AccumelateRewards(statedb *state.StateDB, block, paren return UncleError(fmt.Sprintf("Uncle's parent unknown (%x)", uncle.ParentHash[0:4])) } + if !sm.Pow.Verify(types.NewBlockWithHeader(uncle)) { + return ValidationError("Uncle's nonce is invalid (= %v)", ethutil.Bytes2Hex(uncle.Nonce)) + } + r := new(big.Int) r.Mul(BlockReward, big.NewInt(15)).Div(r, big.NewInt(16)) @@ -299,14 +307,6 @@ func (sm *BlockProcessor) AccumelateRewards(statedb *state.StateDB, block, paren // Reward amount of ether to the coinbase address account.AddAmount(reward) - statedb.Manifest().AddMessage(&state.Message{ - To: block.Header().Coinbase, - Input: nil, - Origin: nil, - Timestamp: int64(block.Header().Time), Coinbase: block.Header().Coinbase, Number: block.Header().Number, - Value: new(big.Int).Add(reward, block.Reward), - }) - return nil } |