File size: 2,555 Bytes
ef98d50 | 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 | # -*- coding: utf-8 -*-
"""B1b 跨进程互认比对器:读两次独立运行的两份输出,字节相等才算"同参同指纹"。
用法:
python scripts/contract_interop.py --out reports/a.json
python scripts/contract_interop.py --out reports/b.json
python scripts/contract_interop_final.py --a reports/a.json --b reports/b.json --out reports/contract_v1_interop.json
判据:exit 0 = 两次运行字节一致 + I1–I4 全绿。
"""
import hashlib
import json
import os
import sys
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
def sha256_file(path):
h = hashlib.sha256()
with open(path, "rb") as f:
for chunk in iter(lambda: f.read(65536), b""):
h.update(chunk)
return h.hexdigest()
def get(argv, flag):
if flag in argv:
i = argv.index(flag)
if i + 1 < len(argv):
return argv[i + 1]
return None
def main(argv):
a = get(argv, "--a") or os.path.join(ROOT, "reports", "contract_v1_interop_a.json")
b = get(argv, "--b") or os.path.join(ROOT, "reports", "contract_v1_interop_b.json")
out = get(argv, "--out") or os.path.join(ROOT, "reports", "contract_v1_interop.json")
if not (os.path.isfile(a) and os.path.isfile(b)):
print(json.dumps({"verdict": "FAIL", "reason": "missing run output"}, ensure_ascii=False))
return 1
sha_a, sha_b = sha256_file(a), sha256_file(b)
byte_equal = sha_a == sha_b
with open(a, encoding="utf-8") as f:
ra = json.load(f)
ok = byte_equal and ra.get("same_params_equal") and ra.get("payload_changed_differs") \
and ra.get("nonce_not_in_fingerprint") and ra.get("all_valid")
report = {
"experiment": "B1b-cross-process-fingerprint",
"process_runs": 2,
"run_a_sha256": sha_a,
"run_b_sha256": sha_b,
"byte_equal": byte_equal,
"same_params_equal": bool(ra.get("same_params_equal")),
"payload_changed_differs": bool(ra.get("payload_changed_differs")),
"nonce_not_in_fingerprint": bool(ra.get("nonce_not_in_fingerprint")),
"all_valid": bool(ra.get("all_valid")),
"samples": ra.get("samples", []),
"fingerprint_rule": ra.get("fingerprint_rule", ""),
"verdict": "PASS" if ok else "FAIL",
}
text = json.dumps(report, ensure_ascii=False, indent=2, sort_keys=True)
with open(out, "w", encoding="utf-8", newline="\n") as f:
f.write(text + "\n")
print(text)
return 0 if ok else 1
if __name__ == "__main__":
sys.exit(main(sys.argv))
|