aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbojie <bojie@dexon.org>2019-01-31 18:23:46 +0800
committerWei-Ning Huang <w@dexon.org>2019-03-12 12:19:09 +0800
commit2be32e25545ff3bc322b1e5b55de4aa5d4d394a3 (patch)
tree39a361e16cdeb0b5534857658068983f683216bf
parentc441f75b52279fd1dd86bddf7fce3c454b6e2b7f (diff)
downloaddexon-2be32e25545ff3bc322b1e5b55de4aa5d4d394a3.tar.gz
dexon-2be32e25545ff3bc322b1e5b55de4aa5d4d394a3.tar.zst
dexon-2be32e25545ff3bc322b1e5b55de4aa5d4d394a3.zip
transaction: use all transaction gas to reduce attack intention (#180)
The ci test in /tests will use origin evm logic.
-rw-r--r--build/ci.go18
-rw-r--r--core/state_transition.go26
2 files changed, 43 insertions, 1 deletions
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