diff --git a/tools/fleet/box-prover.py b/tools/fleet/box-prover.py index 4adcae74..29d39980 100644 --- a/tools/fleet/box-prover.py +++ b/tools/fleet/box-prover.py @@ -27,6 +27,7 @@ HOST = f"{FLOOR}/bin/igneum-prove-host"; EXPORT = f"{FLOOR}/bin/igneum-prove-exp EVM = "http://127.0.0.1:26790"; GRPC = "grpc://127.0.0.1:26610"; CHAIN = "igneum-devnet" LABEL = os.environ.get("LABEL", "box"); WALLET = os.environ.get("WALLET", "0x" + "19" * 20) THRESHOLD = os.environ.get("THRESHOLD", ""); MINER = os.environ.get("MINER", "keep"); RUN_HOURS = float(os.environ.get("RUN_HOURS", "9")) +EXPORT_FROM = int(os.environ.get("EXPORT_FROM", "27276")) # the devnet's exec restart block (ov13.json exec_restart_number) when the node does not report one MINE = f"{F}/card{CARD}/mine" if CARD else f"{F}/mine" os.makedirs(f"{OUT}/segs", exist_ok=True); os.makedirs(f"{MINE}/packs", exist_ok=True) DEV = os.environ.get("IGNEUM_CUDA_DEVICE", "0") @@ -171,7 +172,16 @@ while (time.time() - t_run0) / 3600 < RUN_HOURS: seg = {"first": first, "last": last, "claimed_at": stamp(), "shards": len(picked["shards"]), "fresh": prev_file is None}; state["segments"].append(seg) d = f"{OUT}/segs/seg-{first}"; os.makedirs(d, exist_ok=True); t_seg0 = time.time() # export - t = time.time(); body = json.dumps({"jsonrpc": "2.0", "id": 1, "method": "igneum_exportSegments", "params": ["0x0", hex(last)]}) + # a node whose EVM restarted at a chain block (0.3.13's exec restart rule) exports from that block, not genesis: the + # blocks below it are not executed and the exporter refuses their zero state roots (6 October 2026, 16:02Z) + ex = rpc("igneum_getExecStatus", []) or {} + start_blk = hexi(ex.get("restartNumber") or ex.get("execRestartNumber") or ex.get("startedAt") or 0) + if not start_blk: + sf = str(ex.get("startedFrom", "")) + import re as _re; m = _re.search(r"chain block (\d+)", sf); start_blk = int(m.group(1)) if m else 0 + if not start_blk and EXPORT_FROM: start_blk = EXPORT_FROM + t = time.time(); body = json.dumps({"jsonrpc": "2.0", "id": 1, "method": "igneum_exportSegments", "params": [hex(start_blk), hex(last)]}) + seg["export_from"] = start_blk r = subprocess.run(["curl", "-s", "-m", "600", "-X", "POST", EVM, "-H", "Content-Type: application/json", "--data-binary", body, "-o", f"{d}/seq.json"]) try: json.dump(json.load(open(f"{d}/seq.json"))["result"], open(f"{d}/export.json", "w")) except Exception as e: say(f"RESULT seg {first} export FAILED {str(e)[:100]}"); continue diff --git a/tools/fleet/night.py b/tools/fleet/night.py index d3003a9c..7a03f4da 100644 --- a/tools/fleet/night.py +++ b/tools/fleet/night.py @@ -15,11 +15,11 @@ PROBE = r"""grep -E '^RESULT (swap_done|swap_failed)' /root/fleet/out/node-swap. curl -s -m 6 -X POST -H 'Content-Type: application/json' --data '{"jsonrpc":"2.0","id":1,"method":"igneum_getExecStatus","params":[]}' http://127.0.0.1:26790/ | python3 -c 'import sys,json; r=sys.stdin.read(); d=json.loads(r).get("result",{}) if r.strip() else {}; print("exec", int(d.get("executedTip","0x0"),16), "blocked", "yes" if d.get("blocked") else "no", "from", str(d.get("startedFrom",""))[:30])' 2>/dev/null curl -s -m 6 -X POST -H 'Content-Type: application/json' --data '{"jsonrpc":"2.0","id":1,"method":"igneum_getProvingStatus","params":[]}' http://127.0.0.1:26790/ | python3 -c 'import sys,json; r=sys.stdin.read(); d=json.loads(r).get("result",{}) if r.strip() else {}; v=d.get("v1",{}); w=v.get("segmentsInWindow",{}); print("tipDaa", int(d.get("tipDaa","0x0"),16), "fresh", v.get("freshRuleActive"), "paidShards", d.get("paidShards"), "pending", w.get("pending"), "proven", w.get("proven"), "unproven", w.get("unproven"), "paidSeg", v.get("paidSegments"))' 2>/dev/null /opt/igneum/pkg/bin/igneum-miner watch 1 grpc://127.0.0.1:26610 2>/dev/null | grep -o 'daa=[0-9]*' | tail -1 -pgrep -c -f 'box-prover.py' -for f in /root/fleet/out/prover-state.json /root/fleet/card*/out/prover-state.json; do [ -f $f ] && python3 -c 'import json,sys; s=json.load(open(sys.argv[1])); print("ps", s.get("claimed",0), s.get("submitted",0), s.get("paid",0), s.get("shards_accepted",0), s.get("shards_refused",0), s.get("segment_refused",0), s.get("held",0), s.get("miner_mhs",0))' $f; done""" +pgrep -c -f '^python3 -u /root/fleet/in/box-prover.py' +for f in /root/fleet/out/prover-state.json /root/fleet/card*/out/prover-state.json; do [ -f $f ] && python3 -c 'import json,sys; s=json.load(open(sys.argv[1])); print("ps", s.get("claimed",0), s.get("submitted",0), s.get("paid",0), s.get("shards_accepted",0), s.get("shards_refused",0), s.get("segment_refused",0), s.get("held",0), s.get("miner_mhs",0))' $f; done; true""" def probe(b): r, out, err = fleet.ssh(b, PROBE, timeout=45) - if r not in (0,): return None + if r != 0 or not out.strip(): return None l = out.strip().split("\n"); d = {"swap": "", "exec": None, "blocked": "", "from": "", "tipDaa": None, "fresh": "", "paidShards": None, "pending": None, "proven": None, "unproven": None, "paidSeg": None, "daa": None, "provers": 0, "ps": []} for x in l: if x.startswith("RESULT swap"): d["swap"] = x