New OPCODES

* EXT- CODECOPY, CODESIZE
This commit is contained in:
obscuren 2014-09-08 00:49:25 +02:00
parent 0b6b6b52fe
commit a63b74e345
2 changed files with 59 additions and 24 deletions

View File

@ -49,6 +49,8 @@ const (
CODESIZE = 0x38
CODECOPY = 0x39
GASPRICE = 0x3a
EXTCODECOPY = 0x3b
EXTCODESIZE = 0x3c
// 0x40 range - block operations
PREVHASH = 0x40
@ -146,6 +148,7 @@ const (
CALL = 0xf1
RETURN = 0xf2
POST = 0xf3
CALLSTATELESS = 0xf4
// 0x70 range - other
LOG = 0xfe // XXX Unofficial
@ -203,6 +206,8 @@ var opCodeToString = map[OpCode]string{
NUMBER: "NUMBER",
DIFFICULTY: "DIFFICULTY",
GASLIMIT: "GASLIMIT",
EXTCODESIZE: "EXTCODESIZE",
EXTCODECOPY: "EXTCODECOPY",
// 0x50 range - 'storage' and execution
POP: "POP",
@ -291,6 +296,8 @@ var opCodeToString = map[OpCode]string{
CREATE: "CREATE",
CALL: "CALL",
RETURN: "RETURN",
POST: "POST",
CALLSTATELESS: "CALLSTATELESS",
// 0x70 range - other
LOG: "LOG",
@ -343,7 +350,12 @@ var OpCodes = map[string]byte{
"CALLVALUE": 0x34,
"CALLDATALOAD": 0x35,
"CALLDATASIZE": 0x36,
"GASPRICE": 0x38,
"CALLDATACOPY": 0x37,
"CODESIZE": 0x38,
"CODECOPY": 0x39,
"GASPRICE": 0x3a,
"EXTCODECOPY": 0x3b,
"EXTCODESIZE": 0x3c,
// 0x40 range - block operations
"PREVHASH": 0x40,
@ -440,6 +452,7 @@ var OpCodes = map[string]byte{
"CALL": 0xf1,
"RETURN": 0xf2,
"POST": 0xf3,
"CALLSTATELESS": 0xf4,
// 0x70 range - other
"LOG": 0xfe,

View File

@ -197,6 +197,10 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
require(3)
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:
require(7)
gas.Set(GasCall)
@ -550,14 +554,32 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
code := closure.Args[cOff : cOff+l]
mem.Set(mOff, l, code)
case CODESIZE:
l := big.NewInt(int64(len(closure.Code)))
case CODESIZE, EXTCODESIZE:
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)
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 (
size = int64(len(closure.Code))
size = int64(len(code))
mOff = stack.Pop().Int64()
cOff = stack.Pop().Int64()
l = stack.Pop().Int64()
@ -570,9 +592,9 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
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:
stack.Push(closure.Price)