New OPCODES
* EXT- CODECOPY, CODESIZE
This commit is contained in:
parent
0b6b6b52fe
commit
a63b74e345
@ -49,6 +49,8 @@ const (
|
|||||||
CODESIZE = 0x38
|
CODESIZE = 0x38
|
||||||
CODECOPY = 0x39
|
CODECOPY = 0x39
|
||||||
GASPRICE = 0x3a
|
GASPRICE = 0x3a
|
||||||
|
EXTCODECOPY = 0x3b
|
||||||
|
EXTCODESIZE = 0x3c
|
||||||
|
|
||||||
// 0x40 range - block operations
|
// 0x40 range - block operations
|
||||||
PREVHASH = 0x40
|
PREVHASH = 0x40
|
||||||
@ -146,6 +148,7 @@ const (
|
|||||||
CALL = 0xf1
|
CALL = 0xf1
|
||||||
RETURN = 0xf2
|
RETURN = 0xf2
|
||||||
POST = 0xf3
|
POST = 0xf3
|
||||||
|
CALLSTATELESS = 0xf4
|
||||||
|
|
||||||
// 0x70 range - other
|
// 0x70 range - other
|
||||||
LOG = 0xfe // XXX Unofficial
|
LOG = 0xfe // XXX Unofficial
|
||||||
@ -203,6 +206,8 @@ var opCodeToString = map[OpCode]string{
|
|||||||
NUMBER: "NUMBER",
|
NUMBER: "NUMBER",
|
||||||
DIFFICULTY: "DIFFICULTY",
|
DIFFICULTY: "DIFFICULTY",
|
||||||
GASLIMIT: "GASLIMIT",
|
GASLIMIT: "GASLIMIT",
|
||||||
|
EXTCODESIZE: "EXTCODESIZE",
|
||||||
|
EXTCODECOPY: "EXTCODECOPY",
|
||||||
|
|
||||||
// 0x50 range - 'storage' and execution
|
// 0x50 range - 'storage' and execution
|
||||||
POP: "POP",
|
POP: "POP",
|
||||||
@ -291,6 +296,8 @@ var opCodeToString = map[OpCode]string{
|
|||||||
CREATE: "CREATE",
|
CREATE: "CREATE",
|
||||||
CALL: "CALL",
|
CALL: "CALL",
|
||||||
RETURN: "RETURN",
|
RETURN: "RETURN",
|
||||||
|
POST: "POST",
|
||||||
|
CALLSTATELESS: "CALLSTATELESS",
|
||||||
|
|
||||||
// 0x70 range - other
|
// 0x70 range - other
|
||||||
LOG: "LOG",
|
LOG: "LOG",
|
||||||
@ -343,7 +350,12 @@ var OpCodes = map[string]byte{
|
|||||||
"CALLVALUE": 0x34,
|
"CALLVALUE": 0x34,
|
||||||
"CALLDATALOAD": 0x35,
|
"CALLDATALOAD": 0x35,
|
||||||
"CALLDATASIZE": 0x36,
|
"CALLDATASIZE": 0x36,
|
||||||
"GASPRICE": 0x38,
|
"CALLDATACOPY": 0x37,
|
||||||
|
"CODESIZE": 0x38,
|
||||||
|
"CODECOPY": 0x39,
|
||||||
|
"GASPRICE": 0x3a,
|
||||||
|
"EXTCODECOPY": 0x3b,
|
||||||
|
"EXTCODESIZE": 0x3c,
|
||||||
|
|
||||||
// 0x40 range - block operations
|
// 0x40 range - block operations
|
||||||
"PREVHASH": 0x40,
|
"PREVHASH": 0x40,
|
||||||
@ -440,6 +452,7 @@ var OpCodes = map[string]byte{
|
|||||||
"CALL": 0xf1,
|
"CALL": 0xf1,
|
||||||
"RETURN": 0xf2,
|
"RETURN": 0xf2,
|
||||||
"POST": 0xf3,
|
"POST": 0xf3,
|
||||||
|
"CALLSTATELESS": 0xf4,
|
||||||
|
|
||||||
// 0x70 range - other
|
// 0x70 range - other
|
||||||
"LOG": 0xfe,
|
"LOG": 0xfe,
|
||||||
|
34
ethvm/vm.go
34
ethvm/vm.go
@ -197,6 +197,10 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
|
|||||||
require(3)
|
require(3)
|
||||||
|
|
||||||
newMemSize = stack.Peek().Uint64() + stack.data[stack.Len()-3].Uint64()
|
newMemSize = stack.Peek().Uint64() + stack.data[stack.Len()-3].Uint64()
|
||||||
|
case EXTCODECOPY:
|
||||||
|
require(4)
|
||||||
|
|
||||||
|
newMemSize = stack.data[stack.Len()-1].Uint64() + stack.data[stack.Len()-4].Uint64()
|
||||||
case CALL:
|
case CALL:
|
||||||
require(7)
|
require(7)
|
||||||
gas.Set(GasCall)
|
gas.Set(GasCall)
|
||||||
@ -550,14 +554,32 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
|
|||||||
code := closure.Args[cOff : cOff+l]
|
code := closure.Args[cOff : cOff+l]
|
||||||
|
|
||||||
mem.Set(mOff, l, code)
|
mem.Set(mOff, l, code)
|
||||||
case CODESIZE:
|
case CODESIZE, EXTCODESIZE:
|
||||||
l := big.NewInt(int64(len(closure.Code)))
|
var code []byte
|
||||||
|
if op == EXTCODECOPY {
|
||||||
|
addr := stack.Pop().Bytes()
|
||||||
|
|
||||||
|
code = self.env.State().GetCode(addr)
|
||||||
|
} else {
|
||||||
|
code = closure.Code
|
||||||
|
}
|
||||||
|
|
||||||
|
l := big.NewInt(int64(len(code)))
|
||||||
stack.Push(l)
|
stack.Push(l)
|
||||||
|
|
||||||
self.Printf(" => %d", l)
|
self.Printf(" => %d", l)
|
||||||
case CODECOPY:
|
case CODECOPY, EXTCODECOPY:
|
||||||
|
var code []byte
|
||||||
|
if op == EXTCODECOPY {
|
||||||
|
addr := stack.Pop().Bytes()
|
||||||
|
|
||||||
|
code = self.env.State().GetCode(addr)
|
||||||
|
} else {
|
||||||
|
code = closure.Code
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
size = int64(len(closure.Code))
|
size = int64(len(code))
|
||||||
mOff = stack.Pop().Int64()
|
mOff = stack.Pop().Int64()
|
||||||
cOff = stack.Pop().Int64()
|
cOff = stack.Pop().Int64()
|
||||||
l = stack.Pop().Int64()
|
l = stack.Pop().Int64()
|
||||||
@ -570,9 +592,9 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
|
|||||||
l = 0
|
l = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
code := closure.Code[cOff : cOff+l]
|
codeCopy := code[cOff : cOff+l]
|
||||||
|
|
||||||
mem.Set(mOff, l, code)
|
mem.Set(mOff, l, codeCopy)
|
||||||
case GASPRICE:
|
case GASPRICE:
|
||||||
stack.Push(closure.Price)
|
stack.Push(closure.Price)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user