diff options
author | bojie <bojie@dexon.org> | 2019-01-31 18:23:46 +0800 |
---|---|---|
committer | Wei-Ning Huang <w@dexon.org> | 2019-04-09 21:32:57 +0800 |
commit | 2e939de0678b7ef8da6a0306270e0ef126a8df01 (patch) | |
tree | 8d55a14cb2b988610b0dab2323c3ec3b995df4ff /core/state_transition.go | |
parent | e5327ae2da93eb3c4784971157db4300d17fb35b (diff) | |
download | dexon-2e939de0678b7ef8da6a0306270e0ef126a8df01.tar dexon-2e939de0678b7ef8da6a0306270e0ef126a8df01.tar.gz dexon-2e939de0678b7ef8da6a0306270e0ef126a8df01.tar.bz2 dexon-2e939de0678b7ef8da6a0306270e0ef126a8df01.tar.lz dexon-2e939de0678b7ef8da6a0306270e0ef126a8df01.tar.xz dexon-2e939de0678b7ef8da6a0306270e0ef126a8df01.tar.zst dexon-2e939de0678b7ef8da6a0306270e0ef126a8df01.zip |
transaction: use all transaction gas to reduce attack intention (#180)
The ci test in /tests will use origin evm logic.
Diffstat (limited to 'core/state_transition.go')
-rw-r--r-- | core/state_transition.go | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/core/state_transition.go b/core/state_transition.go index 3b5ea6a2f..ce05e54a2 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -18,6 +18,7 @@ package core import ( "errors" + "flag" "math" "math/big" @@ -27,6 +28,8 @@ import ( "github.com/dexon-foundation/dexon/params" ) +var legacyEvm = flag.Bool("legacy-evm", false, "make evm run origin logic") + var ( errInsufficientBalanceForGas = errors.New("insufficient balance to pay for gas") ) @@ -221,12 +224,33 @@ func (st *StateTransition) TransitionDb() (ret []byte, usedGas uint64, failed bo return nil, 0, false, vmerr } } - st.refundGas() + + if *legacyEvm { + st.refundGas() + } else { + st.dexonRefundGas() + } st.state.AddBalance(st.evm.Coinbase, new(big.Int).Mul(new(big.Int).SetUint64(st.gasUsed()), st.gasPrice)) return ret, st.gasUsed(), vmerr != nil, err } +func (st *StateTransition) dexonRefundGas() { + // Apply refund counter, capped to half of the used gas. + refund := st.gasUsed() / 2 + if refund > st.state.GetRefund() { + refund = st.state.GetRefund() + } + + // Return ETH for remaining gas, exchanged at the original rate. + remaining := new(big.Int).Mul(new(big.Int).SetUint64(refund), st.gasPrice) + st.state.AddBalance(st.msg.From(), remaining) + + // Also return remaining gas to the block gas counter so it is + // available for the next transaction. + st.gp.AddGas(refund) +} + func (st *StateTransition) refundGas() { // Apply refund counter, capped to half of the used gas. refund := st.gasUsed() / 2 |