Spaces:
Sleeping
Sleeping
File size: 1,966 Bytes
77051f2 |
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 |
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 |