ETHnodeJS/index.js
Marcos Paulo f59d3f3be8 dbg
2024-10-03 14:48:16 -03:00

97 lines
2.5 KiB
JavaScript

/*
* 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);