diff options
author | obscuren <geffobscura@gmail.com> | 2015-01-06 00:37:30 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2015-01-06 00:39:42 +0800 |
commit | b99b2c446ca3a81a692eb58294d5a4f6a999f00c (patch) | |
tree | 11c6091f79a7a5bccd485bf1d74f7dec7504b6e9 | |
parent | d001479a47ee27a460a7cc6df136176662fd1799 (diff) | |
download | dexon-b99b2c446ca3a81a692eb58294d5a4f6a999f00c.tar.gz dexon-b99b2c446ca3a81a692eb58294d5a4f6a999f00c.tar.zst dexon-b99b2c446ca3a81a692eb58294d5a4f6a999f00c.zip |
Precompiled contract & Depth change
* Added pre-compiled contract 0x04 (mem cpy)
* Changed depth error to return the gas instead of consuming
-rw-r--r-- | core/execution.go | 3 | ||||
-rw-r--r-- | vm/address.go | 16 | ||||
-rw-r--r-- | vm/common.go | 1 |
3 files changed, 19 insertions, 1 deletions
diff --git a/core/execution.go b/core/execution.go index a7bb59651..43f4b58fb 100644 --- a/core/execution.go +++ b/core/execution.go @@ -36,7 +36,8 @@ func (self *Execution) exec(code, contextAddr []byte, caller vm.ContextRef) (ret evm := vm.New(env, vm.DebugVmTy) if env.Depth() == vm.MaxCallDepth { - // Consume all gas (by not returning it) and return a depth error + caller.ReturnGas(self.Gas, self.price) + return nil, vm.DepthError{} } diff --git a/vm/address.go b/vm/address.go index 611979c94..be4284421 100644 --- a/vm/address.go +++ b/vm/address.go @@ -21,19 +21,31 @@ func (self PrecompiledAccount) Call(in []byte) []byte { } var Precompiled = map[string]*PrecompiledAccount{ + // ECRECOVER string(ethutil.LeftPadBytes([]byte{1}, 20)): &PrecompiledAccount{func(l int) *big.Int { return GasEcrecover }, ecrecoverFunc}, + + // SHA256 string(ethutil.LeftPadBytes([]byte{2}, 20)): &PrecompiledAccount{func(l int) *big.Int { n := big.NewInt(int64(l+31)/32 + 1) n.Mul(n, GasSha256) return n }, sha256Func}, + + // RIPEMD160 string(ethutil.LeftPadBytes([]byte{3}, 20)): &PrecompiledAccount{func(l int) *big.Int { n := big.NewInt(int64(l+31)/32 + 1) n.Mul(n, GasRipemd) return n }, ripemd160Func}, + + string(ethutil.LeftPadBytes([]byte{4}, 20)): &PrecompiledAccount{func(l int) *big.Int { + n := big.NewInt(int64(l+31)/32 + 1) + n.Mul(n, GasMemCpy) + + return n + }, memCpy}, } func sha256Func(in []byte) []byte { @@ -54,3 +66,7 @@ func ecrecoverFunc(in []byte) []byte { return ethutil.LeftPadBytes(crypto.Sha3(crypto.Ecrecover(append(hash, sig...))[1:])[12:], 32) } + +func memCpy(in []byte) []byte { + return in +} diff --git a/vm/common.go b/vm/common.go index 529bbdeb1..acf18eede 100644 --- a/vm/common.go +++ b/vm/common.go @@ -38,6 +38,7 @@ var ( GasSha256 = big.NewInt(50) GasRipemd = big.NewInt(50) GasEcrecover = big.NewInt(500) + GasMemCpy = big.NewInt(1) Pow256 = ethutil.BigPow(2, 256) |