97 lines
2.5 KiB
JavaScript
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);
|
|
|
|
|
|
|
|
|