File size: 3,042 Bytes
e870690
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
var BytecodeVM = {
  ops: {
    0x01: 'PUSH',
    0x02: 'ADD',
    0x03: 'SUB',
    0x04: 'MUL',
    0x05: 'PRINT',
    0x06: 'CALL_VERIFY',
    0x07: 'CALL_SEAL',
    0x08: 'HALT'
  },

  run: function(program) {
    var stack = [];
    var output = [];
    var steps = 0;
    var maxSteps = 1000;

    var tokens = program.trim().split(/\s+/);
    var pc = 0;

    while (pc < tokens.length && steps < maxSteps) {
      steps++;
      var op = tokens[pc].toUpperCase();

      switch (op) {
        case 'PUSH':
          pc++;
          var val = parseFloat(tokens[pc]);
          if (isNaN(val)) { output.push('ERROR: invalid number at token ' + pc); break; }
          stack.push(val);
          break;
        case 'ADD':
          if (stack.length < 2) { output.push('ERROR: stack underflow'); break; }
          var b = stack.pop(); var a = stack.pop();
          stack.push(a + b);
          break;
        case 'SUB':
          if (stack.length < 2) { output.push('ERROR: stack underflow'); break; }
          var b = stack.pop(); var a = stack.pop();
          stack.push(a - b);
          break;
        case 'MUL':
          if (stack.length < 2) { output.push('ERROR: stack underflow'); break; }
          var b = stack.pop(); var a = stack.pop();
          stack.push(a * b);
          break;
        case 'PRINT':
          if (stack.length < 1) { output.push('ERROR: stack empty'); break; }
          output.push(String(stack[stack.length - 1]));
          break;
        case 'CALL_VERIFY':
          output.push('VERIFY: trust_gate_pass');
          break;
        case 'CALL_SEAL':
          output.push('SEAL: sha256_generated');
          break;
        case 'HALT':
          pc = tokens.length;
          break;
        default:
          output.push('UNKNOWN: ' + op);
      }
      pc++;
    }

    if (steps >= maxSteps) output.push('HALTED: step limit reached');

    return {
      program: program,
      stack: stack,
      output: output,
      steps: steps,
      result: output.length > 0 ? output[output.length - 1] : 'empty'
    };
  },

  render: function(r) {
    return [
      '╔══════════════════════════════════════╗',
      'β•‘  BYTECODE VM (SAFE)                  β•‘',
      '╠══════════════════════════════════════╣',
      'β•‘  PROGRAM: ' + r.program.substring(0, 28).padEnd(28) + 'β•‘',
      'β•‘  STEPS:   ' + String(r.steps).padEnd(28) + 'β•‘',
      'β•‘  STACK:   ' + JSON.stringify(r.stack).substring(0, 28).padEnd(28) + 'β•‘',
      'β•‘  OUTPUT:  ' + r.output.join(', ').substring(0, 28).padEnd(28) + 'β•‘',
      'β•‘  RESULT:  ' + r.result.substring(0, 28).padEnd(28) + 'β•‘',
      'β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•'
    ].join('\n');
  }
};