From 2be32e25545ff3bc322b1e5b55de4aa5d4d394a3 Mon Sep 17 00:00:00 2001 From: bojie Date: Thu, 31 Jan 2019 18:23:46 +0800 Subject: transaction: use all transaction gas to reduce attack intention (#180) The ci test in /tests will use origin evm logic. --- build/ci.go | 18 ++++++++++++++++++ core/state_transition.go | 26 +++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/build/ci.go b/build/ci.go index f49071295..810f7d69b 100644 --- a/build/ci.go +++ b/build/ci.go @@ -330,6 +330,15 @@ func doTest(cmdline []string) { } packages = build.ExpandPackagesNoVendor(packages) + packageForLegacyEvm := []string{} + for i := 0; i < len(packages); i++ { + if strings.HasSuffix(packages[i], "dexon/tests") { + packageForLegacyEvm = append(packageForLegacyEvm, packages[i]) + packages = append(packages[:i], packages[i+1:]...) + i-- + } + } + // Run the actual tests. // Test a single package at a time. CI builders are slow // and some tests run into timeouts under load. @@ -341,6 +350,15 @@ func doTest(cmdline []string) { gotest.Args = append(gotest.Args, packages...) build.MustRun(gotest) + + gotestForLegacyEvm := goTool("test", buildFlags(env)...) + gotestForLegacyEvm.Args = append(gotestForLegacyEvm.Args, "-p", "1", "-timeout", "5m") + if *coverage { + gotestForLegacyEvm.Args = append(gotestForLegacyEvm.Args, "-covermode=atomic", "-cover") + } + gotestForLegacyEvm.Args = append(gotestForLegacyEvm.Args, packageForLegacyEvm...) + gotestForLegacyEvm.Args = append(gotestForLegacyEvm.Args, "-legacy-evm=true") + build.MustRun(gotestForLegacyEvm) } // runs gometalinter on requested packages 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 -- cgit v1.2.3