aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2015-01-06 00:37:30 +0800
committerobscuren <geffobscura@gmail.com>2015-01-06 00:39:42 +0800
commitb99b2c446ca3a81a692eb58294d5a4f6a999f00c (patch)
tree11c6091f79a7a5bccd485bf1d74f7dec7504b6e9
parentd001479a47ee27a460a7cc6df136176662fd1799 (diff)
downloaddexon-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.go3
-rw-r--r--vm/address.go16
-rw-r--r--vm/common.go1
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)