From fba185cd99111c155d8a4726fbe69670b0bfef7f Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Thu, 23 Apr 2020 11:40:06 +0300 Subject: [PATCH 1/2] vm: remove stack isolation opcodes They are not present in NEO3 and will be creating additional difficulties during future flow-control opcodes implementation. --- pkg/vm/context.go | 6 +- pkg/vm/opcode/opcode.go | 7 -- pkg/vm/opcode/opcode_string.go | 182 ++++++++++++++++----------------- pkg/vm/vm.go | 71 ------------- pkg/vm/vm_test.go | 149 --------------------------- 5 files changed, 89 insertions(+), 326 deletions(-) diff --git a/pkg/vm/context.go b/pkg/vm/context.go index 44dfcd77a..01d4c039a 100644 --- a/pkg/vm/context.go +++ b/pkg/vm/context.go @@ -99,14 +99,12 @@ func (c *Context) Next() (opcode.Opcode, []byte, error) { numtoread = int(n) c.nextip += 4 } - case opcode.JMP, opcode.JMPIF, opcode.JMPIFNOT, opcode.CALL, opcode.CALLED, opcode.CALLEDT: + case opcode.JMP, opcode.JMPIF, opcode.JMPIFNOT, opcode.CALL: numtoread = 2 - case opcode.CALLI, opcode.SYSCALL: + case opcode.SYSCALL: numtoread = 4 case opcode.APPCALL, opcode.TAILCALL: numtoread = 20 - case opcode.CALLE, opcode.CALLET: - numtoread = 22 default: if instr <= opcode.PUSHINT256 { numtoread = 1 << instr diff --git a/pkg/vm/opcode/opcode.go b/pkg/vm/opcode/opcode.go index a1b364bf6..c4f5f50c8 100644 --- a/pkg/vm/opcode/opcode.go +++ b/pkg/vm/opcode/opcode.go @@ -141,13 +141,6 @@ const ( KEYS Opcode = 0xCC VALUES Opcode = 0xCD - // Stack isolation - CALLI Opcode = 0xE0 - CALLE Opcode = 0xE1 - CALLED Opcode = 0xE2 - CALLET Opcode = 0xE3 - CALLEDT Opcode = 0xE4 - // Exceptions THROW Opcode = 0xF0 THROWIFNOT Opcode = 0xF1 diff --git a/pkg/vm/opcode/opcode_string.go b/pkg/vm/opcode/opcode_string.go index 4a1fe00ee..72e791e08 100644 --- a/pkg/vm/opcode/opcode_string.go +++ b/pkg/vm/opcode/opcode_string.go @@ -38,6 +38,7 @@ func _() { _ = x[PUSH14-30] _ = x[PUSH15-31] _ = x[PUSH16-32] + _ = x[OLDPUSH1-81] _ = x[NOP-97] _ = x[JMP-98] _ = x[JMPIF-99] @@ -120,16 +121,11 @@ func _() { _ = x[HASKEY-203] _ = x[KEYS-204] _ = x[VALUES-205] - _ = x[CALLI-224] - _ = x[CALLE-225] - _ = x[CALLED-226] - _ = x[CALLET-227] - _ = x[CALLEDT-228] _ = x[THROW-240] _ = x[THROWIFNOT-241] } -const _Opcode_name = "PUSHINT8PUSHINT16PUSHINT32PUSHINT64PUSHINT128PUSHINT256PUSHNULLPUSHDATA1PUSHDATA2PUSHDATA4PUSHM1PUSH0PUSH1PUSH2PUSH3PUSH4PUSH5PUSH6PUSH7PUSH8PUSH9PUSH10PUSH11PUSH12PUSH13PUSH14PUSH15PUSH16NOPJMPJMPIFJMPIFNOTCALLRETAPPCALLSYSCALLTAILCALLDUPFROMALTSTACKTOALTSTACKFROMALTSTACKXDROPISNULLXSWAPXTUCKDEPTHDROPDUPNIPOVERPICKROLLROTSWAPTUCKCATSUBSTRLEFTRIGHTSIZEINVERTANDORXOREQUALINCDECSIGNNEGATEABSNOTNZADDSUBMULDIVMODSHLSHRBOOLANDBOOLORNUMEQUALNUMNOTEQUALLTGTLTEGTEMINMAXWITHINSHA1SHA256HASH160HASH256CHECKSIGVERIFYCHECKMULTISIGARRAYSIZEPACKUNPACKPICKITEMSETITEMNEWARRAYNEWSTRUCTNEWMAPAPPENDREVERSEREMOVEHASKEYKEYSVALUESCALLICALLECALLEDCALLETCALLEDTTHROWTHROWIFNOT" +const _Opcode_name = "PUSHINT8PUSHINT16PUSHINT32PUSHINT64PUSHINT128PUSHINT256PUSHNULLPUSHDATA1PUSHDATA2PUSHDATA4PUSHM1PUSH0PUSH1PUSH2PUSH3PUSH4PUSH5PUSH6PUSH7PUSH8PUSH9PUSH10PUSH11PUSH12PUSH13PUSH14PUSH15PUSH16OLDPUSH1NOPJMPJMPIFJMPIFNOTCALLRETAPPCALLSYSCALLTAILCALLDUPFROMALTSTACKTOALTSTACKFROMALTSTACKXDROPISNULLXSWAPXTUCKDEPTHDROPDUPNIPOVERPICKROLLROTSWAPTUCKCATSUBSTRLEFTRIGHTSIZEINVERTANDORXOREQUALINCDECSIGNNEGATEABSNOTNZADDSUBMULDIVMODSHLSHRBOOLANDBOOLORNUMEQUALNUMNOTEQUALLTGTLTEGTEMINMAXWITHINSHA1SHA256HASH160HASH256CHECKSIGVERIFYCHECKMULTISIGARRAYSIZEPACKUNPACKPICKITEMSETITEMNEWARRAYNEWSTRUCTNEWMAPAPPENDREVERSEREMOVEHASKEYKEYSVALUESTHROWTHROWIFNOT" var _Opcode_map = map[Opcode]string{ 0: _Opcode_name[0:8], @@ -160,95 +156,91 @@ var _Opcode_map = map[Opcode]string{ 30: _Opcode_name[170:176], 31: _Opcode_name[176:182], 32: _Opcode_name[182:188], - 97: _Opcode_name[188:191], - 98: _Opcode_name[191:194], - 99: _Opcode_name[194:199], - 100: _Opcode_name[199:207], - 101: _Opcode_name[207:211], - 102: _Opcode_name[211:214], - 103: _Opcode_name[214:221], - 104: _Opcode_name[221:228], - 105: _Opcode_name[228:236], - 106: _Opcode_name[236:251], - 107: _Opcode_name[251:261], - 108: _Opcode_name[261:273], - 109: _Opcode_name[273:278], - 112: _Opcode_name[278:284], - 114: _Opcode_name[284:289], - 115: _Opcode_name[289:294], - 116: _Opcode_name[294:299], - 117: _Opcode_name[299:303], - 118: _Opcode_name[303:306], - 119: _Opcode_name[306:309], - 120: _Opcode_name[309:313], - 121: _Opcode_name[313:317], - 122: _Opcode_name[317:321], - 123: _Opcode_name[321:324], - 124: _Opcode_name[324:328], - 125: _Opcode_name[328:332], - 126: _Opcode_name[332:335], - 127: _Opcode_name[335:341], - 128: _Opcode_name[341:345], - 129: _Opcode_name[345:350], - 130: _Opcode_name[350:354], - 131: _Opcode_name[354:360], - 132: _Opcode_name[360:363], - 133: _Opcode_name[363:365], - 134: _Opcode_name[365:368], - 135: _Opcode_name[368:373], - 139: _Opcode_name[373:376], - 140: _Opcode_name[376:379], - 141: _Opcode_name[379:383], - 143: _Opcode_name[383:389], - 144: _Opcode_name[389:392], - 145: _Opcode_name[392:395], - 146: _Opcode_name[395:397], - 147: _Opcode_name[397:400], - 148: _Opcode_name[400:403], - 149: _Opcode_name[403:406], - 150: _Opcode_name[406:409], - 151: _Opcode_name[409:412], - 152: _Opcode_name[412:415], - 153: _Opcode_name[415:418], - 154: _Opcode_name[418:425], - 155: _Opcode_name[425:431], - 156: _Opcode_name[431:439], - 158: _Opcode_name[439:450], - 159: _Opcode_name[450:452], - 160: _Opcode_name[452:454], - 161: _Opcode_name[454:457], - 162: _Opcode_name[457:460], - 163: _Opcode_name[460:463], - 164: _Opcode_name[463:466], - 165: _Opcode_name[466:472], - 167: _Opcode_name[472:476], - 168: _Opcode_name[476:482], - 169: _Opcode_name[482:489], - 170: _Opcode_name[489:496], - 172: _Opcode_name[496:504], - 173: _Opcode_name[504:510], - 174: _Opcode_name[510:523], - 192: _Opcode_name[523:532], - 193: _Opcode_name[532:536], - 194: _Opcode_name[536:542], - 195: _Opcode_name[542:550], - 196: _Opcode_name[550:557], - 197: _Opcode_name[557:565], - 198: _Opcode_name[565:574], - 199: _Opcode_name[574:580], - 200: _Opcode_name[580:586], - 201: _Opcode_name[586:593], - 202: _Opcode_name[593:599], - 203: _Opcode_name[599:605], - 204: _Opcode_name[605:609], - 205: _Opcode_name[609:615], - 224: _Opcode_name[615:620], - 225: _Opcode_name[620:625], - 226: _Opcode_name[625:631], - 227: _Opcode_name[631:637], - 228: _Opcode_name[637:644], - 240: _Opcode_name[644:649], - 241: _Opcode_name[649:659], + 81: _Opcode_name[188:196], + 97: _Opcode_name[196:199], + 98: _Opcode_name[199:202], + 99: _Opcode_name[202:207], + 100: _Opcode_name[207:215], + 101: _Opcode_name[215:219], + 102: _Opcode_name[219:222], + 103: _Opcode_name[222:229], + 104: _Opcode_name[229:236], + 105: _Opcode_name[236:244], + 106: _Opcode_name[244:259], + 107: _Opcode_name[259:269], + 108: _Opcode_name[269:281], + 109: _Opcode_name[281:286], + 112: _Opcode_name[286:292], + 114: _Opcode_name[292:297], + 115: _Opcode_name[297:302], + 116: _Opcode_name[302:307], + 117: _Opcode_name[307:311], + 118: _Opcode_name[311:314], + 119: _Opcode_name[314:317], + 120: _Opcode_name[317:321], + 121: _Opcode_name[321:325], + 122: _Opcode_name[325:329], + 123: _Opcode_name[329:332], + 124: _Opcode_name[332:336], + 125: _Opcode_name[336:340], + 126: _Opcode_name[340:343], + 127: _Opcode_name[343:349], + 128: _Opcode_name[349:353], + 129: _Opcode_name[353:358], + 130: _Opcode_name[358:362], + 131: _Opcode_name[362:368], + 132: _Opcode_name[368:371], + 133: _Opcode_name[371:373], + 134: _Opcode_name[373:376], + 135: _Opcode_name[376:381], + 139: _Opcode_name[381:384], + 140: _Opcode_name[384:387], + 141: _Opcode_name[387:391], + 143: _Opcode_name[391:397], + 144: _Opcode_name[397:400], + 145: _Opcode_name[400:403], + 146: _Opcode_name[403:405], + 147: _Opcode_name[405:408], + 148: _Opcode_name[408:411], + 149: _Opcode_name[411:414], + 150: _Opcode_name[414:417], + 151: _Opcode_name[417:420], + 152: _Opcode_name[420:423], + 153: _Opcode_name[423:426], + 154: _Opcode_name[426:433], + 155: _Opcode_name[433:439], + 156: _Opcode_name[439:447], + 158: _Opcode_name[447:458], + 159: _Opcode_name[458:460], + 160: _Opcode_name[460:462], + 161: _Opcode_name[462:465], + 162: _Opcode_name[465:468], + 163: _Opcode_name[468:471], + 164: _Opcode_name[471:474], + 165: _Opcode_name[474:480], + 167: _Opcode_name[480:484], + 168: _Opcode_name[484:490], + 169: _Opcode_name[490:497], + 170: _Opcode_name[497:504], + 172: _Opcode_name[504:512], + 173: _Opcode_name[512:518], + 174: _Opcode_name[518:531], + 192: _Opcode_name[531:540], + 193: _Opcode_name[540:544], + 194: _Opcode_name[544:550], + 195: _Opcode_name[550:558], + 196: _Opcode_name[558:565], + 197: _Opcode_name[565:573], + 198: _Opcode_name[573:582], + 199: _Opcode_name[582:588], + 200: _Opcode_name[588:594], + 201: _Opcode_name[594:601], + 202: _Opcode_name[601:607], + 203: _Opcode_name[607:613], + 204: _Opcode_name[613:617], + 205: _Opcode_name[617:623], + 240: _Opcode_name[623:628], + 241: _Opcode_name[628:638], } func (i Opcode) String() string { diff --git a/pkg/vm/vm.go b/pkg/vm/vm.go index de2b1e1bb..ece7ef0e4 100644 --- a/pkg/vm/vm.go +++ b/pkg/vm/vm.go @@ -529,8 +529,6 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro } parameter = v.estack.Pop().Bytes() - fallthrough - case opcode.CALLED, opcode.CALLEDT: if !ctx.hasDynamicInvoke { panic("contract is not allowed to make dynamic invocations") } @@ -1281,75 +1279,6 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro case opcode.NOP: // unlucky ^^ - case opcode.CALLI, opcode.CALLE, opcode.CALLED, opcode.CALLET, opcode.CALLEDT: - var ( - tailCall = (op == opcode.CALLET || op == opcode.CALLEDT) - hashOnStack = (op == opcode.CALLED || op == opcode.CALLEDT) - addElement int - newCtx *Context - ) - - if hashOnStack { - addElement = 1 - } - - rvcount := int(parameter[0]) - pcount := int(parameter[1]) - if v.estack.Len() < pcount+addElement { - panic("missing some parameters") - } - if tailCall { - if ctx.rvcount != rvcount { - panic("context and parameter rvcount mismatch") - } - } else { - v.checkInvocationStackSize() - } - - if op == opcode.CALLI { - newCtx = ctx.Copy() - } else { - var hashBytes []byte - - if hashOnStack { - hashBytes = v.estack.Pop().Bytes() - } else { - hashBytes = parameter[2:] - } - - hash, err := util.Uint160DecodeBytesBE(hashBytes) - if err != nil { - panic(err) - } - script, hasDynamicInvoke := v.getScript(hash) - if script == nil { - panic(fmt.Sprintf("could not find script %s", hash)) - } - newCtx = NewContext(script) - newCtx.scriptHash = hash - newCtx.hasDynamicInvoke = hasDynamicInvoke - } - newCtx.rvcount = rvcount - newCtx.estack = NewStack("evaluation") - newCtx.astack = NewStack("alt") - // Going backwards to naturally push things onto the new stack. - for i := pcount; i > 0; i-- { - elem := v.estack.RemoveAt(i - 1) - newCtx.estack.Push(elem) - } - if tailCall { - _ = v.istack.Pop() - } - v.istack.PushVal(newCtx) - v.estack = newCtx.estack - v.astack = newCtx.astack - if op == opcode.CALLI { - // CALLI is a bit different from other JMPs - // https://github.com/neo-project/neo-vm/blob/master-2.x/src/neo-vm/ExecutionEngine.cs#L1175 - offset := v.getJumpOffset(newCtx, parameter[2:], 2) - v.jumpIf(newCtx, offset, true) - } - case opcode.THROW: panic("THROW") diff --git a/pkg/vm/vm_test.go b/pkg/vm/vm_test.go index 6d96879dc..6f2738d24 100644 --- a/pkg/vm/vm_test.go +++ b/pkg/vm/vm_test.go @@ -3026,155 +3026,6 @@ func TestBitAndNumericOpcodes(t *testing.T) { } } -var stackIsolationTestCases = map[opcode.Opcode][]struct { - name string - params []interface{} -}{ - opcode.CALLE: { - { - name: "no_params", - }, - { - name: "with_params", - params: []interface{}{big.NewInt(5), true, []byte{1, 2, 3}}, - }, - }, - opcode.CALLED: { - { - name: "no_paranms", - }, - { - name: "with_params", - params: []interface{}{big.NewInt(5), true, []byte{1, 2, 3}}, - }, - }, - opcode.CALLET: { - { - name: "no_params", - }, - { - name: "with_params", - params: []interface{}{big.NewInt(5), true, []byte{1, 2, 3}}, - }, - }, - opcode.CALLEDT: { - { - name: "no_params", - }, - { - name: "with_params", - params: []interface{}{big.NewInt(5), true, []byte{1, 2, 3}}, - }, - }, -} - -func TestStackIsolationOpcodes(t *testing.T) { - scriptHash := util.Uint160{1, 2, 3} - for code, codeTestCases := range stackIsolationTestCases { - t.Run(code.String(), func(t *testing.T) { - for _, testCase := range codeTestCases { - t.Run(testCase.name, func(t *testing.T) { - rvcount := len(testCase.params) + 1 // parameters + DEPTH - pcount := len(testCase.params) - prog := []byte{byte(code), byte(rvcount), byte(pcount)} - if code == opcode.CALLE || code == opcode.CALLET { - prog = append(prog, scriptHash.BytesBE()...) - } - prog = append(prog, byte(opcode.RET)) - - vm := load(prog) - vm.SetScriptGetter(func(in util.Uint160) ([]byte, bool) { - if in.Equals(scriptHash) { - return makeProgram(opcode.DEPTH), true - } - return nil, false - }) - if code == opcode.CALLED || code == opcode.CALLEDT { - vm.Context().hasDynamicInvoke = true - } - if code == opcode.CALLET || code == opcode.CALLEDT { - vm.Context().rvcount = rvcount - } - // add extra parameter just to check that it won't appear on new estack - vm.estack.PushVal(7) - for _, param := range testCase.params { - vm.estack.PushVal(param) - } - if code == opcode.CALLED || code == opcode.CALLEDT { - vm.estack.PushVal(scriptHash.BytesBE()) - } - - runVM(t, vm) - elem := vm.estack.Pop() // depth should be equal to params count, as it's a separate execution context - assert.Equal(t, int64(pcount), elem.BigInt().Int64()) - for i := pcount; i > 0; i-- { - p := vm.estack.Pop() - assert.Equal(t, testCase.params[i-1], p.value.Value()) - } - }) - } - }) - } -} - -func TestCALLIAltStack(t *testing.T) { - prog := []byte{ - byte(opcode.PUSH1), - byte(opcode.DUP), - byte(opcode.TOALTSTACK), - byte(opcode.JMP), 0x5, 0, // to CALLI (+5 including JMP parameters) - byte(opcode.FROMALTSTACK), // altstack is empty, so panic here - byte(opcode.RET), - byte(opcode.CALLI), byte(0), byte(0), 0xfc, 0xff, // to FROMALTSTACK (-4) with clean stacks - byte(opcode.RET), - } - - vm := load(prog) - checkVMFailed(t, vm) -} - -func TestCALLIDEPTH(t *testing.T) { - prog := []byte{ - byte(opcode.PUSH3), - byte(opcode.PUSH2), - byte(opcode.PUSH1), - byte(opcode.JMP), 0x5, 0, // to CALLI (+5 including JMP parameters) - byte(opcode.DEPTH), // depth is 2, put it on stack - byte(opcode.RET), - byte(opcode.CALLI), byte(3), byte(2), 0xfc, 0xff, // to DEPTH (-4) with [21 on stack - byte(opcode.RET), - } - - vm := load(prog) - - runVM(t, vm) - assert.Equal(t, 4, vm.estack.Len()) - assert.Equal(t, int64(2), vm.estack.Pop().BigInt().Int64()) // depth was 2 - for i := 1; i < 4; i++ { - assert.Equal(t, int64(i), vm.estack.Pop().BigInt().Int64()) - } -} - -func TestCALLI(t *testing.T) { - prog := []byte{ - byte(opcode.PUSH3), - byte(opcode.PUSH2), - byte(opcode.PUSH1), - byte(opcode.JMP), 0x5, 0, // to CALLI (+5 including JMP parameters) - byte(opcode.SUB), // 2 - 1 - byte(opcode.RET), - byte(opcode.CALLI), byte(1), byte(2), 0xfc, 0xff, // to SUB (-4) with [21 on stack - byte(opcode.MUL), // 3 * 1 - byte(opcode.RET), - } - - vm := load(prog) - - runVM(t, vm) - assert.Equal(t, 1, vm.estack.Len()) - assert.Equal(t, int64(3), vm.estack.Pop().BigInt().Int64()) -} - func makeProgram(opcodes ...opcode.Opcode) []byte { prog := make([]byte, len(opcodes)+1) // RET for i := 0; i < len(opcodes); i++ { From d6624a92ca10b223ccb35860496482b4e25514fa Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Thu, 23 Apr 2020 11:56:36 +0300 Subject: [PATCH 2/2] vm: implement new JMP* and CALL* opcodes In compiler JMP*_L opcodes are always used, as this requires less effort. --- pkg/compiler/codegen.go | 55 +++--- pkg/rpc/server/server_test.go | 6 +- pkg/rpc/server/testdata/test_contract.avm | Bin 797 -> 841 bytes pkg/rpc/server/testdata/testblocks.acc | Bin 204213 -> 204257 bytes pkg/vm/context.go | 10 +- pkg/vm/emit/emit.go | 7 +- pkg/vm/opcode/opcode.go | 30 ++- pkg/vm/opcode/opcode_string.go | 214 +++++++++++++--------- pkg/vm/vm.go | 51 +++++- pkg/vm/vm_test.go | 96 +++++++++- 10 files changed, 328 insertions(+), 141 deletions(-) diff --git a/pkg/compiler/codegen.go b/pkg/compiler/codegen.go index 610cafd7c..510cacabe 100644 --- a/pkg/compiler/codegen.go +++ b/pkg/compiler/codegen.go @@ -435,13 +435,13 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { if n.Cond != nil { ast.Walk(c, n.Cond) - emit.Jmp(c.prog.BinWriter, opcode.JMPIFNOT, lElse) + emit.Jmp(c.prog.BinWriter, opcode.JMPIFNOTL, lElse) } c.setLabel(lIf) ast.Walk(c, n.Body) if n.Else != nil { - emit.Jmp(c.prog.BinWriter, opcode.JMP, lElseEnd) + emit.Jmp(c.prog.BinWriter, opcode.JMPL, lElseEnd) } c.setLabel(lElse) @@ -476,9 +476,9 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { ast.Walk(c, cc.List[j]) emit.Opcode(c.prog.BinWriter, eqOpcode) if j == l-1 { - emit.Jmp(c.prog.BinWriter, opcode.JMPIFNOT, lEnd) + emit.Jmp(c.prog.BinWriter, opcode.JMPIFNOTL, lEnd) } else { - emit.Jmp(c.prog.BinWriter, opcode.JMPIF, lStart) + emit.Jmp(c.prog.BinWriter, opcode.JMPIFL, lStart) } } } @@ -487,12 +487,12 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { last := len(cc.Body) - 1 for j, stmt := range cc.Body { if j == last && isFallthroughStmt(stmt) { - emit.Jmp(c.prog.BinWriter, opcode.JMP, startLabels[i+1]) + emit.Jmp(c.prog.BinWriter, opcode.JMPL, startLabels[i+1]) break } ast.Walk(c, stmt) } - emit.Jmp(c.prog.BinWriter, opcode.JMP, switchEnd) + emit.Jmp(c.prog.BinWriter, opcode.JMPL, switchEnd) c.setLabel(lEnd) } @@ -562,9 +562,9 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { next := c.newLabel() end := c.newLabel() ast.Walk(c, n.X) - emit.Jmp(c.prog.BinWriter, opcode.JMPIF, next) + emit.Jmp(c.prog.BinWriter, opcode.JMPIFL, next) emit.Opcode(c.prog.BinWriter, opcode.PUSHF) - emit.Jmp(c.prog.BinWriter, opcode.JMP, end) + emit.Jmp(c.prog.BinWriter, opcode.JMPL, end) c.setLabel(next) ast.Walk(c, n.Y) c.setLabel(end) @@ -574,9 +574,9 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { next := c.newLabel() end := c.newLabel() ast.Walk(c, n.X) - emit.Jmp(c.prog.BinWriter, opcode.JMPIFNOT, next) + emit.Jmp(c.prog.BinWriter, opcode.JMPIFNOTL, next) emit.Opcode(c.prog.BinWriter, opcode.PUSHT) - emit.Jmp(c.prog.BinWriter, opcode.JMP, end) + emit.Jmp(c.prog.BinWriter, opcode.JMPL, end) c.setLabel(next) ast.Walk(c, n.Y) c.setLabel(end) @@ -686,7 +686,7 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { case isSyscall(f): c.convertSyscall(n, f.selector.Name, f.name) default: - emit.Call(c.prog.BinWriter, opcode.CALL, f.label) + emit.Call(c.prog.BinWriter, opcode.CALLL, f.label) } return nil @@ -782,10 +782,10 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { switch n.Tok { case token.BREAK: end := c.getLabelOffset(labelEnd, label) - emit.Jmp(c.prog.BinWriter, opcode.JMP, end) + emit.Jmp(c.prog.BinWriter, opcode.JMPL, end) case token.CONTINUE: post := c.getLabelOffset(labelPost, label) - emit.Jmp(c.prog.BinWriter, opcode.JMP, post) + emit.Jmp(c.prog.BinWriter, opcode.JMPL, post) } return nil @@ -819,7 +819,7 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { ast.Walk(c, n.Cond) // Jump if the condition is false - emit.Jmp(c.prog.BinWriter, opcode.JMPIFNOT, fend) + emit.Jmp(c.prog.BinWriter, opcode.JMPIFNOTL, fend) } // Walk body followed by the iterator (post stmt). @@ -830,7 +830,7 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { } // Jump back to condition. - emit.Jmp(c.prog.BinWriter, opcode.JMP, fstart) + emit.Jmp(c.prog.BinWriter, opcode.JMPL, fstart) c.setLabel(fend) c.dropStackLabel() @@ -867,7 +867,7 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { emit.Opcode(c.prog.BinWriter, opcode.OVER) emit.Opcode(c.prog.BinWriter, opcode.OVER) emit.Opcode(c.prog.BinWriter, opcode.LTE) // finish if len <= i - emit.Jmp(c.prog.BinWriter, opcode.JMPIF, end) + emit.Jmp(c.prog.BinWriter, opcode.JMPIFL, end) if n.Key != nil { emit.Opcode(c.prog.BinWriter, opcode.DUP) @@ -881,7 +881,7 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { c.setLabel(post) emit.Opcode(c.prog.BinWriter, opcode.INC) - emit.Jmp(c.prog.BinWriter, opcode.JMP, start) + emit.Jmp(c.prog.BinWriter, opcode.JMPL, start) c.setLabel(end) c.dropStackLabel() @@ -1346,21 +1346,28 @@ func (c *codegen) writeJumps(b []byte) error { ctx := vm.NewContext(b) for op, _, err := ctx.Next(); err == nil && ctx.NextIP() < len(b); op, _, err = ctx.Next() { switch op { - case opcode.JMP, opcode.JMPIFNOT, opcode.JMPIF, opcode.CALL: + case opcode.JMP, opcode.JMPIFNOT, opcode.JMPIF, opcode.CALL, + opcode.JMPEQ, opcode.JMPNE, + opcode.JMPGT, opcode.JMPGE, opcode.JMPLE, opcode.JMPLT: + panic("short jumps are not yet supported") + case opcode.JMPL, opcode.JMPIFL, opcode.JMPIFNOTL, + opcode.JMPEQL, opcode.JMPNEL, + opcode.JMPGTL, opcode.JMPGEL, opcode.JMPLEL, opcode.JMPLTL, + opcode.CALLL: // we can't use arg returned by ctx.Next() because it is copied nextIP := ctx.NextIP() - arg := b[nextIP-2:] + arg := b[nextIP-4:] index := binary.LittleEndian.Uint16(arg) if int(index) > len(c.l) { return fmt.Errorf("unexpected label number: %d (max %d)", index, len(c.l)) } - offset := c.l[index] - nextIP + 3 - if offset > math.MaxUint16 { - return fmt.Errorf("label offset is too big at the instruction %d: %d (max %d)", - nextIP-3, offset, math.MaxUint16) + offset := c.l[index] - nextIP + 5 + if offset > math.MaxInt32 || offset < math.MinInt32 { + return fmt.Errorf("label offset is too big at the instruction %d: %d (max %d, min %d)", + nextIP-5, offset, math.MaxInt32, math.MinInt32) } - binary.LittleEndian.PutUint16(arg, uint16(offset)) + binary.LittleEndian.PutUint32(arg, uint32(offset)) } } return nil diff --git a/pkg/rpc/server/server_test.go b/pkg/rpc/server/server_test.go index 4c0448234..65f46dbe0 100644 --- a/pkg/rpc/server/server_test.go +++ b/pkg/rpc/server/server_test.go @@ -48,18 +48,18 @@ type rpcTestCase struct { check func(t *testing.T, e *executor, result interface{}) } -const testContractHash = "8bb068bca226bf013e7d19400b9d85c4eb865607" +const testContractHash = "6b9e88be61028590ebbb1296cbee09beed4ae75d" var rpcTestCases = map[string][]rpcTestCase{ "getapplicationlog": { { name: "positive", - params: `["66238fd4ac778326b0c151c025ee8f1c6d738e7e191820537564d2b887f3ecde"]`, + params: `["4459d8050e0abb0a42a9ec5a84dee1c5f8c449b11859265ef45a47c5ea369bc5"]`, result: func(e *executor) interface{} { return &result.ApplicationLog{} }, check: func(t *testing.T, e *executor, acc interface{}) { res, ok := acc.(*result.ApplicationLog) require.True(t, ok) - expectedTxHash, err := util.Uint256DecodeStringLE("66238fd4ac778326b0c151c025ee8f1c6d738e7e191820537564d2b887f3ecde") + expectedTxHash, err := util.Uint256DecodeStringLE("4459d8050e0abb0a42a9ec5a84dee1c5f8c449b11859265ef45a47c5ea369bc5") require.NoError(t, err) assert.Equal(t, expectedTxHash, res.TxHash) assert.Equal(t, 1, len(res.Executions)) diff --git a/pkg/rpc/server/testdata/test_contract.avm b/pkg/rpc/server/testdata/test_contract.avm index 19a8d34045275a9b97961da4c0468febd6476a08..07f9c80eda3c75cbd81b775cd11e8f4fa6010ed9 100755 GIT binary patch literal 841 zcmZ`%%Wl&^6g6%7K)57+#7$Sk3SwAwg;y!k)I4dKKkt|i>r9>W6dxo<}H~^ z%Acz7m>*Zf0kK*;IBXlp_@WuxVHBhpOe=_(5YV~clKvnK64?eRdWECdnqObKQ!_42Clvhd5SWQii$jk!llr(hc0;N zE#SI{RWlEC-a>Z|b?#Cp^Z%$|1uzcgI;W(Mn%j+rX1NmbuXVf2 zb$3Cvi#wi@yQs5MQK~pjgESJdA1e`FiAq!7GgQIIZVlSzCa~Zw`}Tm*!@lnrJ~ak~ zhP;Xnn|MgHruNjCx)=AjxUe^1X=1igk-}ZRfX^!8q^iG$KHHnk^|k5sVagu1`ge+H bERgGl3~+C&$txd61(j(obY#B<8-S`m);JX1 literal 797 zcmZ`%%Wl&^6rDDGfI4mbikog|R3R#{V1-yie;_D`1?V+p_PX}La}oy>OWXJbryMzZ2$yH+jc(4|ShL^Gbz5#1MYO+d`vZlk0wP>t+58Qi8_d5uOt@~+O z7WwIQL%5CG@DNntQgs{QV5L&Ue>5;U3=Bg#b9xKmgH}QELQD16lD*ZEhoCt$o6YG7 z!XA^APE!`MM5;lmCH*5FOMJ(T2JCtbDBC}73gN129~gbp^({A_7K1`dz6#7V2@TPm zdQ*QI{Jyp2{k%kQ3QRJ%xMyoWHLII1l<=e3!rqcy8yt>In|~cJS|ZmOz%{sSPQ^GW OiDHGcQT>QINdE##Zys#` diff --git a/pkg/rpc/server/testdata/testblocks.acc b/pkg/rpc/server/testdata/testblocks.acc index 4f28d0d7aab47a7e45d7fc69ba5b2b2c23b89141..32d68bff962b5814c7163e91aa42f788b8482c1d 100644 GIT binary patch delta 70717 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�v}nk9;y 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 delta 70772 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 ST%I&t>+NH?-T&;tF$n-yfT2qO diff --git a/pkg/vm/context.go b/pkg/vm/context.go index 01d4c039a..3e67bc6f5 100644 --- a/pkg/vm/context.go +++ b/pkg/vm/context.go @@ -99,9 +99,13 @@ func (c *Context) Next() (opcode.Opcode, []byte, error) { numtoread = int(n) c.nextip += 4 } - case opcode.JMP, opcode.JMPIF, opcode.JMPIFNOT, opcode.CALL: - numtoread = 2 - case opcode.SYSCALL: + case opcode.JMP, opcode.JMPIF, opcode.JMPIFNOT, opcode.JMPEQ, opcode.JMPNE, + opcode.JMPGT, opcode.JMPGE, opcode.JMPLT, opcode.JMPLE, + opcode.CALL: + numtoread = 1 + case opcode.JMPL, opcode.JMPIFL, opcode.JMPIFNOTL, opcode.JMPEQL, opcode.JMPNEL, + opcode.JMPGTL, opcode.JMPGEL, opcode.JMPLTL, opcode.JMPLEL, + opcode.CALLL, opcode.SYSCALL: numtoread = 4 case opcode.APPCALL, opcode.TAILCALL: numtoread = 20 diff --git a/pkg/vm/emit/emit.go b/pkg/vm/emit/emit.go index 4aa5ef688..1401d4364 100644 --- a/pkg/vm/emit/emit.go +++ b/pkg/vm/emit/emit.go @@ -135,7 +135,7 @@ func Jmp(w *io.BinWriter, op opcode.Opcode, label uint16) { w.Err = fmt.Errorf("opcode %s is not a jump or call type", op.String()) return } - buf := make([]byte, 2) + buf := make([]byte, 4) binary.LittleEndian.PutUint16(buf, label) Instruction(w, op, buf) } @@ -172,10 +172,7 @@ func AppCallWithOperation(w *io.BinWriter, scriptHash util.Uint160, operation st } func isInstructionJmp(op opcode.Opcode) bool { - if op == opcode.JMP || op == opcode.JMPIFNOT || op == opcode.JMPIF || op == opcode.CALL { - return true - } - return false + return opcode.JMP <= op && op <= opcode.CALLL } // InteropNameToID returns an identificator of the method based on its name. diff --git a/pkg/vm/opcode/opcode.go b/pkg/vm/opcode/opcode.go index c4f5f50c8..3e4a5d640 100644 --- a/pkg/vm/opcode/opcode.go +++ b/pkg/vm/opcode/opcode.go @@ -42,14 +42,32 @@ const ( PUSH15 Opcode = 0x1F PUSH16 Opcode = 0x20 + // Flow control + NOP Opcode = 0x21 + JMP Opcode = 0x22 + JMPL Opcode = 0x23 + JMPIF Opcode = 0x24 + JMPIFL Opcode = 0x25 + JMPIFNOT Opcode = 0x26 + JMPIFNOTL Opcode = 0x27 + JMPEQ Opcode = 0x28 + JMPEQL Opcode = 0x29 + JMPNE Opcode = 0x2A + JMPNEL Opcode = 0x2B + JMPGT Opcode = 0x2C + JMPGTL Opcode = 0x2D + JMPGE Opcode = 0x2E + JMPGEL Opcode = 0x2F + JMPLT Opcode = 0x30 + JMPLTL Opcode = 0x31 + JMPLE Opcode = 0x32 + JMPLEL Opcode = 0x33 + CALL Opcode = 0x34 + CALLL Opcode = 0x35 + + // Legacy OLDPUSH1 Opcode = 0x51 - // Flow control - NOP Opcode = 0x61 - JMP Opcode = 0x62 - JMPIF Opcode = 0x63 - JMPIFNOT Opcode = 0x64 - CALL Opcode = 0x65 RET Opcode = 0x66 APPCALL Opcode = 0x67 SYSCALL Opcode = 0x68 diff --git a/pkg/vm/opcode/opcode_string.go b/pkg/vm/opcode/opcode_string.go index 72e791e08..3b34e8fdd 100644 --- a/pkg/vm/opcode/opcode_string.go +++ b/pkg/vm/opcode/opcode_string.go @@ -38,12 +38,28 @@ func _() { _ = x[PUSH14-30] _ = x[PUSH15-31] _ = x[PUSH16-32] + _ = x[NOP-33] + _ = x[JMP-34] + _ = x[JMPL-35] + _ = x[JMPIF-36] + _ = x[JMPIFL-37] + _ = x[JMPIFNOT-38] + _ = x[JMPIFNOTL-39] + _ = x[JMPEQ-40] + _ = x[JMPEQL-41] + _ = x[JMPNE-42] + _ = x[JMPNEL-43] + _ = x[JMPGT-44] + _ = x[JMPGTL-45] + _ = x[JMPGE-46] + _ = x[JMPGEL-47] + _ = x[JMPLT-48] + _ = x[JMPLTL-49] + _ = x[JMPLE-50] + _ = x[JMPLEL-51] + _ = x[CALL-52] + _ = x[CALLL-53] _ = x[OLDPUSH1-81] - _ = x[NOP-97] - _ = x[JMP-98] - _ = x[JMPIF-99] - _ = x[JMPIFNOT-100] - _ = x[CALL-101] _ = x[RET-102] _ = x[APPCALL-103] _ = x[SYSCALL-104] @@ -125,7 +141,7 @@ func _() { _ = x[THROWIFNOT-241] } -const _Opcode_name = "PUSHINT8PUSHINT16PUSHINT32PUSHINT64PUSHINT128PUSHINT256PUSHNULLPUSHDATA1PUSHDATA2PUSHDATA4PUSHM1PUSH0PUSH1PUSH2PUSH3PUSH4PUSH5PUSH6PUSH7PUSH8PUSH9PUSH10PUSH11PUSH12PUSH13PUSH14PUSH15PUSH16OLDPUSH1NOPJMPJMPIFJMPIFNOTCALLRETAPPCALLSYSCALLTAILCALLDUPFROMALTSTACKTOALTSTACKFROMALTSTACKXDROPISNULLXSWAPXTUCKDEPTHDROPDUPNIPOVERPICKROLLROTSWAPTUCKCATSUBSTRLEFTRIGHTSIZEINVERTANDORXOREQUALINCDECSIGNNEGATEABSNOTNZADDSUBMULDIVMODSHLSHRBOOLANDBOOLORNUMEQUALNUMNOTEQUALLTGTLTEGTEMINMAXWITHINSHA1SHA256HASH160HASH256CHECKSIGVERIFYCHECKMULTISIGARRAYSIZEPACKUNPACKPICKITEMSETITEMNEWARRAYNEWSTRUCTNEWMAPAPPENDREVERSEREMOVEHASKEYKEYSVALUESTHROWTHROWIFNOT" +const _Opcode_name = "PUSHINT8PUSHINT16PUSHINT32PUSHINT64PUSHINT128PUSHINT256PUSHNULLPUSHDATA1PUSHDATA2PUSHDATA4PUSHM1PUSH0PUSH1PUSH2PUSH3PUSH4PUSH5PUSH6PUSH7PUSH8PUSH9PUSH10PUSH11PUSH12PUSH13PUSH14PUSH15PUSH16NOPJMPJMP_LJMPIFJMPIF_LJMPIFNOTJMPIFNOT_LJMPEQJMPEQ_LJMPNEJMPNE_LJMPGTJMPGT_LJMPGEJMPGE_LJMPLTJMPLT_LJMPLEJMPLE_LCALLCALL_LOLDPUSH1RETAPPCALLSYSCALLTAILCALLDUPFROMALTSTACKTOALTSTACKFROMALTSTACKXDROPISNULLXSWAPXTUCKDEPTHDROPDUPNIPOVERPICKROLLROTSWAPTUCKCATSUBSTRLEFTRIGHTSIZEINVERTANDORXOREQUALINCDECSIGNNEGATEABSNOTNZADDSUBMULDIVMODSHLSHRBOOLANDBOOLORNUMEQUALNUMNOTEQUALLTGTLTEGTEMINMAXWITHINSHA1SHA256HASH160HASH256CHECKSIGVERIFYCHECKMULTISIGARRAYSIZEPACKUNPACKPICKITEMSETITEMNEWARRAYNEWSTRUCTNEWMAPAPPENDREVERSEREMOVEHASKEYKEYSVALUESTHROWTHROWIFNOT" var _Opcode_map = map[Opcode]string{ 0: _Opcode_name[0:8], @@ -156,91 +172,107 @@ var _Opcode_map = map[Opcode]string{ 30: _Opcode_name[170:176], 31: _Opcode_name[176:182], 32: _Opcode_name[182:188], - 81: _Opcode_name[188:196], - 97: _Opcode_name[196:199], - 98: _Opcode_name[199:202], - 99: _Opcode_name[202:207], - 100: _Opcode_name[207:215], - 101: _Opcode_name[215:219], - 102: _Opcode_name[219:222], - 103: _Opcode_name[222:229], - 104: _Opcode_name[229:236], - 105: _Opcode_name[236:244], - 106: _Opcode_name[244:259], - 107: _Opcode_name[259:269], - 108: _Opcode_name[269:281], - 109: _Opcode_name[281:286], - 112: _Opcode_name[286:292], - 114: _Opcode_name[292:297], - 115: _Opcode_name[297:302], - 116: _Opcode_name[302:307], - 117: _Opcode_name[307:311], - 118: _Opcode_name[311:314], - 119: _Opcode_name[314:317], - 120: _Opcode_name[317:321], - 121: _Opcode_name[321:325], - 122: _Opcode_name[325:329], - 123: _Opcode_name[329:332], - 124: _Opcode_name[332:336], - 125: _Opcode_name[336:340], - 126: _Opcode_name[340:343], - 127: _Opcode_name[343:349], - 128: _Opcode_name[349:353], - 129: _Opcode_name[353:358], - 130: _Opcode_name[358:362], - 131: _Opcode_name[362:368], - 132: _Opcode_name[368:371], - 133: _Opcode_name[371:373], - 134: _Opcode_name[373:376], - 135: _Opcode_name[376:381], - 139: _Opcode_name[381:384], - 140: _Opcode_name[384:387], - 141: _Opcode_name[387:391], - 143: _Opcode_name[391:397], - 144: _Opcode_name[397:400], - 145: _Opcode_name[400:403], - 146: _Opcode_name[403:405], - 147: _Opcode_name[405:408], - 148: _Opcode_name[408:411], - 149: _Opcode_name[411:414], - 150: _Opcode_name[414:417], - 151: _Opcode_name[417:420], - 152: _Opcode_name[420:423], - 153: _Opcode_name[423:426], - 154: _Opcode_name[426:433], - 155: _Opcode_name[433:439], - 156: _Opcode_name[439:447], - 158: _Opcode_name[447:458], - 159: _Opcode_name[458:460], - 160: _Opcode_name[460:462], - 161: _Opcode_name[462:465], - 162: _Opcode_name[465:468], - 163: _Opcode_name[468:471], - 164: _Opcode_name[471:474], - 165: _Opcode_name[474:480], - 167: _Opcode_name[480:484], - 168: _Opcode_name[484:490], - 169: _Opcode_name[490:497], - 170: _Opcode_name[497:504], - 172: _Opcode_name[504:512], - 173: _Opcode_name[512:518], - 174: _Opcode_name[518:531], - 192: _Opcode_name[531:540], - 193: _Opcode_name[540:544], - 194: _Opcode_name[544:550], - 195: _Opcode_name[550:558], - 196: _Opcode_name[558:565], - 197: _Opcode_name[565:573], - 198: _Opcode_name[573:582], - 199: _Opcode_name[582:588], - 200: _Opcode_name[588:594], - 201: _Opcode_name[594:601], - 202: _Opcode_name[601:607], - 203: _Opcode_name[607:613], - 204: _Opcode_name[613:617], - 205: _Opcode_name[617:623], - 240: _Opcode_name[623:628], - 241: _Opcode_name[628:638], + 33: _Opcode_name[188:191], + 34: _Opcode_name[191:194], + 35: _Opcode_name[194:199], + 36: _Opcode_name[199:204], + 37: _Opcode_name[204:211], + 38: _Opcode_name[211:219], + 39: _Opcode_name[219:229], + 40: _Opcode_name[229:234], + 41: _Opcode_name[234:241], + 42: _Opcode_name[241:246], + 43: _Opcode_name[246:253], + 44: _Opcode_name[253:258], + 45: _Opcode_name[258:265], + 46: _Opcode_name[265:270], + 47: _Opcode_name[270:277], + 48: _Opcode_name[277:282], + 49: _Opcode_name[282:289], + 50: _Opcode_name[289:294], + 51: _Opcode_name[294:301], + 52: _Opcode_name[301:305], + 53: _Opcode_name[305:311], + 81: _Opcode_name[311:319], + 102: _Opcode_name[319:322], + 103: _Opcode_name[322:329], + 104: _Opcode_name[329:336], + 105: _Opcode_name[336:344], + 106: _Opcode_name[344:359], + 107: _Opcode_name[359:369], + 108: _Opcode_name[369:381], + 109: _Opcode_name[381:386], + 112: _Opcode_name[386:392], + 114: _Opcode_name[392:397], + 115: _Opcode_name[397:402], + 116: _Opcode_name[402:407], + 117: _Opcode_name[407:411], + 118: _Opcode_name[411:414], + 119: _Opcode_name[414:417], + 120: _Opcode_name[417:421], + 121: _Opcode_name[421:425], + 122: _Opcode_name[425:429], + 123: _Opcode_name[429:432], + 124: _Opcode_name[432:436], + 125: _Opcode_name[436:440], + 126: _Opcode_name[440:443], + 127: _Opcode_name[443:449], + 128: _Opcode_name[449:453], + 129: _Opcode_name[453:458], + 130: _Opcode_name[458:462], + 131: _Opcode_name[462:468], + 132: _Opcode_name[468:471], + 133: _Opcode_name[471:473], + 134: _Opcode_name[473:476], + 135: _Opcode_name[476:481], + 139: _Opcode_name[481:484], + 140: _Opcode_name[484:487], + 141: _Opcode_name[487:491], + 143: _Opcode_name[491:497], + 144: _Opcode_name[497:500], + 145: _Opcode_name[500:503], + 146: _Opcode_name[503:505], + 147: _Opcode_name[505:508], + 148: _Opcode_name[508:511], + 149: _Opcode_name[511:514], + 150: _Opcode_name[514:517], + 151: _Opcode_name[517:520], + 152: _Opcode_name[520:523], + 153: _Opcode_name[523:526], + 154: _Opcode_name[526:533], + 155: _Opcode_name[533:539], + 156: _Opcode_name[539:547], + 158: _Opcode_name[547:558], + 159: _Opcode_name[558:560], + 160: _Opcode_name[560:562], + 161: _Opcode_name[562:565], + 162: _Opcode_name[565:568], + 163: _Opcode_name[568:571], + 164: _Opcode_name[571:574], + 165: _Opcode_name[574:580], + 167: _Opcode_name[580:584], + 168: _Opcode_name[584:590], + 169: _Opcode_name[590:597], + 170: _Opcode_name[597:604], + 172: _Opcode_name[604:612], + 173: _Opcode_name[612:618], + 174: _Opcode_name[618:631], + 192: _Opcode_name[631:640], + 193: _Opcode_name[640:644], + 194: _Opcode_name[644:650], + 195: _Opcode_name[650:658], + 196: _Opcode_name[658:665], + 197: _Opcode_name[665:673], + 198: _Opcode_name[673:682], + 199: _Opcode_name[682:688], + 200: _Opcode_name[688:694], + 201: _Opcode_name[694:701], + 202: _Opcode_name[701:707], + 203: _Opcode_name[707:713], + 204: _Opcode_name[713:717], + 205: _Opcode_name[717:723], + 240: _Opcode_name[723:728], + 241: _Opcode_name[728:738], } func (i Opcode) String() string { diff --git a/pkg/vm/vm.go b/pkg/vm/vm.go index ece7ef0e4..f6a88ac8c 100644 --- a/pkg/vm/vm.go +++ b/pkg/vm/vm.go @@ -1118,16 +1118,25 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro arr := elem.Bytes() v.estack.PushVal(len(arr)) - case opcode.JMP, opcode.JMPIF, opcode.JMPIFNOT: + case opcode.JMP, opcode.JMPL, opcode.JMPIF, opcode.JMPIFL, opcode.JMPIFNOT, opcode.JMPIFNOTL, + opcode.JMPEQ, opcode.JMPEQL, opcode.JMPNE, opcode.JMPNEL, + opcode.JMPGT, opcode.JMPGTL, opcode.JMPGE, opcode.JMPGEL, + opcode.JMPLT, opcode.JMPLTL, opcode.JMPLE, opcode.JMPLEL: offset := v.getJumpOffset(ctx, parameter, 0) cond := true - if op != opcode.JMP { - cond = v.estack.Pop().Bool() == (op == opcode.JMPIF) + switch op { + case opcode.JMP, opcode.JMPL: + case opcode.JMPIF, opcode.JMPIFL, opcode.JMPIFNOT, opcode.JMPIFNOTL: + cond = v.estack.Pop().Bool() == (op == opcode.JMPIF || op == opcode.JMPIFL) + default: + b := v.estack.Pop().BigInt() + a := v.estack.Pop().BigInt() + cond = getJumpCondition(op, a, b) } v.jumpIf(ctx, offset, cond) - case opcode.CALL: + case opcode.CALL, opcode.CALLL: v.checkInvocationStackSize() newCtx := ctx.Copy() @@ -1293,6 +1302,27 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro return } +// getJumpCondition performs opcode specific comparison of a and b +func getJumpCondition(op opcode.Opcode, a, b *big.Int) bool { + cmp := a.Cmp(b) + switch op { + case opcode.JMPEQ, opcode.JMPEQL: + return cmp == 0 + case opcode.JMPNE, opcode.JMPNEL: + return cmp != 0 + case opcode.JMPGT, opcode.JMPGTL: + return cmp > 0 + case opcode.JMPGE, opcode.JMPGEL: + return cmp >= 0 + case opcode.JMPLT, opcode.JMPLTL: + return cmp < 0 + case opcode.JMPLE, opcode.JMPLEL: + return cmp <= 0 + default: + panic(fmt.Sprintf("invalid JMP* opcode: %s", op)) + } +} + // jumpIf performs jump to offset if cond is true. func (v *VM) jumpIf(ctx *Context, offset int, cond bool) { if cond { @@ -1302,9 +1332,18 @@ func (v *VM) jumpIf(ctx *Context, offset int, cond bool) { // getJumpOffset returns instruction number in a current context // to a which JMP should be performed. -// parameter is interpreted as little-endian int16. +// parameter should have length either 1 or 4 and +// is interpreted as little-endian. func (v *VM) getJumpOffset(ctx *Context, parameter []byte, mod int) int { - rOffset := int16(binary.LittleEndian.Uint16(parameter)) + var rOffset int32 + switch l := len(parameter); l { + case 1: + rOffset = int32(int8(parameter[0])) + case 4: + rOffset = int32(binary.LittleEndian.Uint32(parameter)) + default: + panic(fmt.Sprintf("invalid JMP* parameter length: %d", l)) + } offset := ctx.ip + int(rOffset) + mod if offset < 0 || offset > len(ctx.prog) { panic(fmt.Sprintf("JMP: invalid offset %d ip at %d", offset, ctx.ip)) diff --git a/pkg/vm/vm_test.go b/pkg/vm/vm_test.go index 6f2738d24..29a793f5f 100644 --- a/pkg/vm/vm_test.go +++ b/pkg/vm/vm_test.go @@ -719,9 +719,9 @@ func callNTimes(n uint16) []byte { return makeProgram( opcode.PUSHINT16, opcode.Opcode(n), opcode.Opcode(n>>8), // little-endian opcode.TOALTSTACK, opcode.DUPFROMALTSTACK, - opcode.JMPIF, 0x4, 0, opcode.RET, + opcode.JMPIF, 0x3, opcode.RET, opcode.FROMALTSTACK, opcode.DEC, - opcode.CALL, 0xF8, 0xFF) // -8 -> JMP to TOALTSTACK) + opcode.CALL, 0xF9) // -7 -> JMP to TOALTSTACK) } func TestInvocationLimitGood(t *testing.T) { @@ -736,6 +736,96 @@ func TestInvocationLimitBad(t *testing.T) { checkVMFailed(t, v) } +func isLongJMP(op opcode.Opcode) bool { + return op == opcode.JMPL || op == opcode.JMPIFL || op == opcode.JMPIFNOTL || + op == opcode.JMPEQL || op == opcode.JMPNEL || + op == opcode.JMPGEL || op == opcode.JMPGTL || + op == opcode.JMPLEL || op == opcode.JMPLTL +} + +func getJMPProgram(op opcode.Opcode) []byte { + prog := []byte{byte(op)} + if isLongJMP(op) { + prog = append(prog, 0x07, 0x00, 0x00, 0x00) + } else { + prog = append(prog, 0x04) + } + return append(prog, byte(opcode.PUSH1), byte(opcode.RET), byte(opcode.PUSH2), byte(opcode.RET)) +} + +func testJMP(t *testing.T, op opcode.Opcode, res interface{}, items ...interface{}) { + prog := getJMPProgram(op) + v := load(prog) + for i := range items { + v.estack.PushVal(items[i]) + } + if res == nil { + checkVMFailed(t, v) + return + } + runVM(t, v) + require.EqualValues(t, res, v.estack.Pop().BigInt().Int64()) +} + +func TestJMPs(t *testing.T) { + testCases := []struct { + name string + items []interface{} + }{ + { + name: "no condition", + }, + { + name: "single item (true)", + items: []interface{}{true}, + }, + { + name: "single item (false)", + items: []interface{}{false}, + }, + { + name: "24 and 42", + items: []interface{}{24, 42}, + }, + { + name: "42 and 24", + items: []interface{}{42, 24}, + }, + { + name: "42 and 42", + items: []interface{}{42, 42}, + }, + } + + // 2 is true, 1 is false + results := map[opcode.Opcode][]interface{}{ + opcode.JMP: {2, 2, 2, 2, 2, 2}, + opcode.JMPIF: {nil, 2, 1, 2, 2, 2}, + opcode.JMPIFNOT: {nil, 1, 2, 1, 1, 1}, + opcode.JMPEQ: {nil, nil, nil, 1, 1, 2}, + opcode.JMPNE: {nil, nil, nil, 2, 2, 1}, + opcode.JMPGE: {nil, nil, nil, 1, 2, 2}, + opcode.JMPGT: {nil, nil, nil, 1, 2, 1}, + opcode.JMPLE: {nil, nil, nil, 2, 1, 2}, + opcode.JMPLT: {nil, nil, nil, 2, 1, 1}, + } + + for i, tc := range testCases { + i := i + t.Run(tc.name, func(t *testing.T) { + for op := opcode.JMP; op < opcode.JMPLEL; op++ { + resOp := op + if isLongJMP(op) { + resOp-- + } + t.Run(op.String(), func(t *testing.T) { + testJMP(t, op, results[resOp][i], tc.items...) + }) + } + }) + } +} + func TestNOTNoArgument(t *testing.T) { prog := makeProgram(opcode.NOT) vm := load(prog) @@ -1798,7 +1888,7 @@ func TestSimpleCall(t *testing.T) { buf := io.NewBufBinWriter() w := buf.BinWriter emit.Opcode(w, opcode.PUSH2) - emit.Instruction(w, opcode.CALL, []byte{04, 00}) + emit.Instruction(w, opcode.CALL, []byte{03}) emit.Opcode(w, opcode.RET) emit.Opcode(w, opcode.PUSH10) emit.Opcode(w, opcode.ADD)