/* * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/ClientSide/javascript.js to edit this template */ /** * instrucoes iniciais para criacao da maquina de estado EVM * */ //instrucoes das operacoes a ser realizadas pelo smart contract const STOP = "STOP"; const ADD = "ADD"; const PUSH = "PUSH"; class Interpreter { constructor() { this.state = { programCounter : 0, stack: [], code : [] }; } runCode(code) { const a = 0; const b = 0; const value = 0; const opcode = null; this.state.code = code; while(this.state.programCounter < this.state.code.length) { const opcode = this.state.code[this.state.programCounter]; console.log("dbg-programCounter" + this.state.programCounter); // console.log("dbg-code" + this.state.programCounter); console.log("dbg-opcode" + opcode); try { switch (opcode) { case STOP: console.log("dbg-case-stop"); throw new Error("execution complete"); case PUSH: console.log("dbg-case-push"); this.state.programCounter++; value = this.state.code[this.state.programCounter]; this.state.stack.push(value); break; case ADD: console.log("dbg-case-add"); a = this.state.stack.pop(); b = this.state.stack.pop(); this.state.stack.push(a + b); break; default: console.log("dbg-case-default"); break; } } catch (error) { console.log("dbg-catch-err"); return this.state.stack[this.state.stack.length - 1]; } console.log("dbg-program-counter-++"); this.state.programCounter++; } } } let code = [ PUSH, 10, PUSH, 5, ADD, STOP ], result = new Interpreter().runCode(code); console.log("resultado da soma", result);