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 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
@ -142,10 +144,11 @@ const (
SWAP16 = 0x9f SWAP16 = 0x9f
// 0xf0 range - closures // 0xf0 range - closures
CREATE = 0xf0 CREATE = 0xf0
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
@ -197,12 +200,14 @@ var opCodeToString = map[OpCode]string{
GASPRICE: "TXGASPRICE", GASPRICE: "TXGASPRICE",
// 0x40 range - block operations // 0x40 range - block operations
PREVHASH: "PREVHASH", PREVHASH: "PREVHASH",
COINBASE: "COINBASE", COINBASE: "COINBASE",
TIMESTAMP: "TIMESTAMP", TIMESTAMP: "TIMESTAMP",
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",
@ -288,9 +293,11 @@ var opCodeToString = map[OpCode]string{
SWAP16: "SWAP16", SWAP16: "SWAP16",
// 0xf0 range // 0xf0 range
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,
@ -436,10 +448,11 @@ var OpCodes = map[string]byte{
"SWAP16": 0x9f, "SWAP16": 0x9f,
// 0xf0 range - closures // 0xf0 range - closures
"CREATE": 0xf0, "CREATE": 0xf0,
"CALL": 0xf1, "CALL": 0xf1,
"RETURN": 0xf2, "RETURN": 0xf2,
"POST": 0xf3, "POST": 0xf3,
"CALLSTATELESS": 0xf4,
// 0x70 range - other // 0x70 range - other
"LOG": 0xfe, "LOG": 0xfe,

View File

@ -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)