|
|
@@ -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
|
|
|
}
|
|
|
|