Spaces:
Sleeping
Sleeping
| import hashlib | |
| import time | |
| class CodexByteVM: | |
| def __init__(self): | |
| self.reg = [0] * 8 | |
| self.mem = {} | |
| self.pc = 0 | |
| self.flags = {"Z": False} | |
| self.ledger = [] | |
| def _hash(self, v): | |
| return hashlib.sha256(str(v).encode()).hexdigest() | |
| def step(self, prog): | |
| op = prog[self.pc] | |
| self.pc += 1 | |
| if op == 0x00: # HALT | |
| return False | |
| elif op == 0x01: # LOAD_IMM r v | |
| r, v = prog[self.pc], prog[self.pc + 1] | |
| self.pc += 2 | |
| self.reg[r] = v | |
| elif op == 0x02: # LOAD_MEM r a | |
| r, a = prog[self.pc], prog[self.pc + 1] | |
| self.pc += 2 | |
| self.reg[r] = self.mem.get(a, 0) | |
| elif op == 0x03: # STORE r a | |
| r, a = prog[self.pc], prog[self.pc + 1] | |
| self.pc += 2 | |
| self.mem[a] = self.reg[r] | |
| elif op == 0x04: # ADD r1 r2 | |
| r1, r2 = prog[self.pc], prog[self.pc + 1] | |
| self.pc += 2 | |
| self.reg[r1] += self.reg[r2] | |
| elif op == 0x08: # CMP r1 r2 | |
| r1, r2 = prog[self.pc], prog[self.pc + 1] | |
| self.pc += 2 | |
| self.flags["Z"] = (self.reg[r1] == self.reg[r2]) | |
| elif op == 0x0A: # JZ addr | |
| addr = prog[self.pc] | |
| self.pc += 1 | |
| if self.flags["Z"]: | |
| self.pc = addr | |
| elif op == 0x0C: # HASH r | |
| r = prog[self.pc] | |
| self.pc += 1 | |
| self.reg[r] = self._hash(self.reg[r]) | |
| elif op == 0x0F: # COMMIT | |
| state = (tuple(self.reg), dict(self.mem)) | |
| self.ledger.append(self._hash(state)) | |
| elif op == 0x11: # EMIT r | |
| r = prog[self.pc] | |
| self.pc += 1 | |
| self.mem["LAST_PROOF"] = self.reg[r] | |
| return True | |
| def run(self, prog): | |
| self.pc = 0 | |
| self.ledger.clear() | |
| while self.step(prog): | |
| pass | |
| return self.ledger |