forked from cerc-io/plugeth
Merge branch 'develop' of github.com:ethereum/eth-go into develop
This commit is contained in:
commit
6c66cb3fa9
@ -21,7 +21,7 @@ func Disassemble(script []byte) (asm []string) {
|
||||
asm = append(asm, fmt.Sprintf("%v", op))
|
||||
|
||||
switch op {
|
||||
case oPUSH: // Push PC+1 on to the stack
|
||||
case oPUSH32: // Push PC+1 on to the stack
|
||||
pc.Add(pc, ethutil.Big1)
|
||||
data := script[pc.Int64() : pc.Int64()+32]
|
||||
val := ethutil.BigD(data)
|
||||
@ -36,20 +36,6 @@ func Disassemble(script []byte) (asm []string) {
|
||||
asm = append(asm, fmt.Sprintf("0x%x", b))
|
||||
|
||||
pc.Add(pc, big.NewInt(31))
|
||||
case oPUSH20:
|
||||
pc.Add(pc, ethutil.Big1)
|
||||
data := script[pc.Int64() : pc.Int64()+20]
|
||||
val := ethutil.BigD(data)
|
||||
var b []byte
|
||||
if val.Int64() == 0 {
|
||||
b = []byte{0}
|
||||
} else {
|
||||
b = val.Bytes()
|
||||
}
|
||||
|
||||
asm = append(asm, fmt.Sprintf("0x%x", b))
|
||||
|
||||
pc.Add(pc, big.NewInt(19))
|
||||
}
|
||||
|
||||
pc.Add(pc, ethutil.Big1)
|
||||
|
@ -48,8 +48,6 @@ const (
|
||||
oGASLIMIT = 0x45
|
||||
|
||||
// 0x50 range - 'storage' and execution
|
||||
oPUSH = 0x50
|
||||
oPUSH20 = 0x80
|
||||
oPOP = 0x51
|
||||
oDUP = 0x52
|
||||
oSWAP = 0x53
|
||||
@ -63,14 +61,48 @@ const (
|
||||
oPC = 0x5b
|
||||
oMSIZE = 0x5c
|
||||
|
||||
// 0x60 range - closures
|
||||
oCREATE = 0x60
|
||||
oCALL = 0x61
|
||||
oRETURN = 0x62
|
||||
// 0x60 range
|
||||
oPUSH1 = 0x60
|
||||
oPUSH2 = 0x61
|
||||
oPUSH3 = 0x62
|
||||
oPUSH4 = 0x63
|
||||
oPUSH5 = 0x64
|
||||
oPUSH6 = 0x65
|
||||
oPUSH7 = 0x66
|
||||
oPUSH8 = 0x67
|
||||
oPUSH9 = 0x68
|
||||
oPUSH10 = 0x69
|
||||
oPUSH11 = 0x6a
|
||||
oPUSH12 = 0x6b
|
||||
oPUSH13 = 0x6c
|
||||
oPUSH14 = 0x6d
|
||||
oPUSH15 = 0x6e
|
||||
oPUSH16 = 0x6f
|
||||
oPUSH17 = 0x70
|
||||
oPUSH18 = 0x71
|
||||
oPUSH19 = 0x72
|
||||
oPUSH20 = 0x73
|
||||
oPUSH21 = 0x74
|
||||
oPUSH22 = 0x75
|
||||
oPUSH23 = 0x76
|
||||
oPUSH24 = 0x77
|
||||
oPUSH25 = 0x78
|
||||
oPUSH26 = 0x79
|
||||
oPUSH27 = 0x7a
|
||||
oPUSH28 = 0x7b
|
||||
oPUSH29 = 0x7c
|
||||
oPUSH30 = 0x7d
|
||||
oPUSH31 = 0x7e
|
||||
oPUSH32 = 0x7f
|
||||
|
||||
// 0xf0 range - closures
|
||||
oCREATE = 0xf0
|
||||
oCALL = 0xf2
|
||||
oRETURN = 0xf3
|
||||
|
||||
// 0x70 range - other
|
||||
oLOG = 0x70 // XXX Unofficial
|
||||
oSUICIDE = 0x7f
|
||||
oLOG = 0xfe // XXX Unofficial
|
||||
oSUICIDE = 0xff
|
||||
)
|
||||
|
||||
// Since the opcodes aren't all in order we can't use a regular slice
|
||||
@ -119,8 +151,6 @@ var opCodeToString = map[OpCode]string{
|
||||
oGASLIMIT: "GASLIMIT",
|
||||
|
||||
// 0x50 range - 'storage' and execution
|
||||
oPUSH: "PUSH",
|
||||
oPOP: "POP",
|
||||
oDUP: "DUP",
|
||||
oSWAP: "SWAP",
|
||||
oMLOAD: "MLOAD",
|
||||
@ -133,7 +163,41 @@ var opCodeToString = map[OpCode]string{
|
||||
oPC: "PC",
|
||||
oMSIZE: "MSIZE",
|
||||
|
||||
// 0x60 range - closures
|
||||
// 0x60 range - push
|
||||
oPUSH1: "PUSH1",
|
||||
oPUSH2: "PUSH2",
|
||||
oPUSH3: "PUSH3",
|
||||
oPUSH4: "PUSH4",
|
||||
oPUSH5: "PUSH5",
|
||||
oPUSH6: "PUSH6",
|
||||
oPUSH7: "PUSH7",
|
||||
oPUSH8: "PUSH8",
|
||||
oPUSH9: "PUSH9",
|
||||
oPUSH10: "PUSH10",
|
||||
oPUSH11: "PUSH11",
|
||||
oPUSH12: "PUSH12",
|
||||
oPUSH13: "PUSH13",
|
||||
oPUSH14: "PUSH14",
|
||||
oPUSH15: "PUSH15",
|
||||
oPUSH16: "PUSH16",
|
||||
oPUSH17: "PUSH17",
|
||||
oPUSH18: "PUSH18",
|
||||
oPUSH19: "PUSH19",
|
||||
oPUSH20: "PUSH20",
|
||||
oPUSH21: "PUSH21",
|
||||
oPUSH22: "PUSH22",
|
||||
oPUSH23: "PUSH23",
|
||||
oPUSH24: "PUSH24",
|
||||
oPUSH25: "PUSH25",
|
||||
oPUSH26: "PUSH26",
|
||||
oPUSH27: "PUSH27",
|
||||
oPUSH28: "PUSH28",
|
||||
oPUSH29: "PUSH29",
|
||||
oPUSH30: "PUSH30",
|
||||
oPUSH31: "PUSH31",
|
||||
oPUSH32: "PUSH32",
|
||||
|
||||
// 0xf0 range
|
||||
oCREATE: "CREATE",
|
||||
oCALL: "CALL",
|
||||
oRETURN: "RETURN",
|
||||
@ -193,10 +257,6 @@ var OpCodes = map[string]byte{
|
||||
"GASLIMIT": 0x45,
|
||||
|
||||
// 0x50 range - 'storage' and execution
|
||||
"PUSH": 0x50,
|
||||
|
||||
"PUSH20": 0x80,
|
||||
|
||||
"POP": 0x51,
|
||||
"DUP": 0x52,
|
||||
"SWAP": 0x53,
|
||||
@ -210,13 +270,47 @@ var OpCodes = map[string]byte{
|
||||
"PC": 0x5b,
|
||||
"MSIZE": 0x5c,
|
||||
|
||||
// 0x60 range - closures
|
||||
"CREATE": 0x60,
|
||||
"CALL": 0x61,
|
||||
"RETURN": 0x62,
|
||||
// 0x70 range - 'push'
|
||||
"PUSH1": 0x60,
|
||||
"PUSH2": 0x61,
|
||||
"PUSH3": 0x62,
|
||||
"PUSH4": 0x63,
|
||||
"PUSH5": 0x64,
|
||||
"PUSH6": 0x65,
|
||||
"PUSH7": 0x66,
|
||||
"PUSH8": 0x67,
|
||||
"PUSH9": 0x68,
|
||||
"PUSH10": 0x69,
|
||||
"PUSH11": 0x6a,
|
||||
"PUSH12": 0x6b,
|
||||
"PUSH13": 0x6c,
|
||||
"PUSH14": 0x6d,
|
||||
"PUSH15": 0x6e,
|
||||
"PUSH16": 0x6f,
|
||||
"PUSH17": 0x70,
|
||||
"PUSH18": 0x71,
|
||||
"PUSH19": 0x72,
|
||||
"PUSH20": 0x73,
|
||||
"PUSH21": 0x74,
|
||||
"PUSH22": 0x75,
|
||||
"PUSH23": 0x76,
|
||||
"PUSH24": 0x77,
|
||||
"PUSH25": 0x78,
|
||||
"PUSH26": 0x70,
|
||||
"PUSH27": 0x7a,
|
||||
"PUSH28": 0x7b,
|
||||
"PUSH29": 0x7c,
|
||||
"PUSH30": 0x7d,
|
||||
"PUSH31": 0x7e,
|
||||
"PUSH32": 0x7f,
|
||||
|
||||
// 0xf0 range - closures
|
||||
"CREATE": 0xf0,
|
||||
"CALL": 0xf1,
|
||||
"RETURN": 0xf2,
|
||||
|
||||
// 0x70 range - other
|
||||
"LOG": 0x70,
|
||||
"LOG": 0xfe,
|
||||
"SUICIDE": 0x7f,
|
||||
}
|
||||
|
||||
|
@ -97,6 +97,8 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
|
||||
ethutil.Config.Log.Debugf("# op\n")
|
||||
}
|
||||
|
||||
fmt.Println(closure.Script)
|
||||
|
||||
for {
|
||||
// The base for all big integer arithmetic
|
||||
base := new(big.Int)
|
||||
@ -106,11 +108,9 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
|
||||
val := closure.Get(pc)
|
||||
// Get the opcode (it must be an opcode!)
|
||||
op := OpCode(val.Uint())
|
||||
/*
|
||||
if ethutil.Config.Debug {
|
||||
ethutil.Config.Log.Debugf("%-3d %-4s", pc, op.String())
|
||||
}
|
||||
*/
|
||||
if ethutil.Config.Debug {
|
||||
ethutil.Config.Log.Debugf("%-3d %-4s", pc, op.String())
|
||||
}
|
||||
|
||||
gas := new(big.Int)
|
||||
useGas := func(amount *big.Int) {
|
||||
@ -354,27 +354,17 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
|
||||
// TODO
|
||||
stack.Push(big.NewInt(0))
|
||||
|
||||
// 0x50 range
|
||||
case oPUSH: // Push PC+1 on to the stack
|
||||
// 0x50 range
|
||||
case oPUSH1, oPUSH2, oPUSH3, oPUSH4, oPUSH5, oPUSH6, oPUSH7, oPUSH8, oPUSH9, oPUSH10, oPUSH11, oPUSH12, oPUSH13, oPUSH14, oPUSH15, oPUSH16, oPUSH17, oPUSH18, oPUSH19, oPUSH20, oPUSH21, oPUSH22, oPUSH23, oPUSH24, oPUSH25, oPUSH26, oPUSH27, oPUSH28, oPUSH29, oPUSH30, oPUSH31, oPUSH32:
|
||||
a := big.NewInt(int64(op) - int64(oPUSH1) + 1)
|
||||
pc.Add(pc, ethutil.Big1)
|
||||
data := closure.Gets(pc, big.NewInt(32))
|
||||
data := closure.Gets(pc, a)
|
||||
val := ethutil.BigD(data.Bytes())
|
||||
|
||||
// Push value to stack
|
||||
stack.Push(val)
|
||||
|
||||
pc.Add(pc, big.NewInt(31))
|
||||
pc.Add(pc, a.Sub(a, big.NewInt(1)))
|
||||
step++
|
||||
case oPUSH20:
|
||||
pc.Add(pc, ethutil.Big1)
|
||||
data := closure.Gets(pc, big.NewInt(20))
|
||||
val := ethutil.BigD(data.Bytes())
|
||||
|
||||
// Push value to stack
|
||||
stack.Push(val)
|
||||
|
||||
pc.Add(pc, big.NewInt(19))
|
||||
step++
|
||||
case oPOP:
|
||||
require(1)
|
||||
stack.Pop()
|
||||
|
@ -86,7 +86,7 @@ func TestRun4(t *testing.T) {
|
||||
int32 a = 10
|
||||
int32 b = 20
|
||||
if a > b {
|
||||
int32 c = this.Caller()
|
||||
int32 c = this.caller()
|
||||
}
|
||||
Exit()
|
||||
`), false)
|
||||
@ -98,21 +98,21 @@ func TestRun4(t *testing.T) {
|
||||
|
||||
callerScript, err := mutan.Compile(strings.NewReader(`
|
||||
// Check if there's any cash in the initial store
|
||||
if store[1000] == 0 {
|
||||
store[1000] = 10^20
|
||||
if this.store[1000] == 0 {
|
||||
this.store[1000] = 10^20
|
||||
}
|
||||
|
||||
|
||||
store[1001] = this.Value() * 20
|
||||
store[this.Origin()] = store[this.Origin()] + 1000
|
||||
this.store[1001] = this.value() * 20
|
||||
this.store[this.origin()] = this.store[this.origin()] + 1000
|
||||
|
||||
if store[1001] > 20 {
|
||||
store[1001] = 10^50
|
||||
if this.store[1001] > 20 {
|
||||
this.store[1001] = 10^50
|
||||
}
|
||||
|
||||
int8 ret = 0
|
||||
int8 arg = 10
|
||||
Call(0xe6a12555fad1fb6eaaaed69001a87313d1fd7b54, 0, 100, arg, ret)
|
||||
call(0xe6a12555fad1fb6eaaaed69001a87313d1fd7b54, 0, 100, arg, ret)
|
||||
|
||||
big t
|
||||
for int8 i = 0; i < 10; i++ {
|
||||
|
Loading…
Reference in New Issue
Block a user