天赐范式第159天:让广播走出本机——HTTP通道发出第一声

天赐范式第159天(第二篇):让广播走出本机------HTTP通道发出第一声

版本 :V3.3.1.0(代码实现版)

日期 :2026-09-08

定位 :第158天broadcast()的通道扩展------从file到http

一句话:158天证明包写到本地文件,159天证明包POST到HTTP服务器------广播走出本机了。


摘要

天赐范式第159天(第二篇):让广播走出本机------HTTP通道发出第一声。本文是V3.3.1.0的HTTP通道扩展,将第158天broadcast()的file通道扩展到http通道。定义TianCiRuntimeV331(TianCiRuntimeV33)继承V3.3.0.0全部能力,broadcast()新增channel="http"分支:调用self_prove()生成证明包→构造广播包→JSON序列化→HTTP POST到指定endpoint→接收服务器回执。设计本地HTTP接收服务器BroadcastReceiver:收到POST请求→提取proof_pack→调用verify()独立验证→返回回执(received/source/version/stages/verified/message)。运行演示:启动本地HTTP接收服务器(localhost:8080)→机器broadcast(channel="http")→服务器返回verified=True→广播记录含server_response回执。file通道 vs http通道对比:file通道是机器→本地文件→外部手动listen();http通道是机器→HTTP POST→服务器自动verify()→回执。三环贯通(HTTP版):self_prove()✓→broadcast(http)✓→服务器verify=True。证明包通过HTTP发出第一声------广播走出本机了。


一、从file通道到http通道

第158天的broadcast()只支持channel="file"------把证明包写到本地JSON文件。外部需要手动调listen(filepath)来接收验证。

第159天要做的事:扩展broadcast()支持channel="http"------把证明包POST到HTTP服务器,服务器自动接收、自动verify()、返回回执。

158天:机器把证明包写到文件,外部手动来listen()。

159天:机器把证明包POST出去,服务器自动收到自动验证。


二、HTTP通道设计

2.1 版本号

版本号 含义
V3.3.1.0 修订号1=HTTP通道扩展(新通道能力)

TianCiRuntimeV331(TianCiRuntimeV33)继承第158天全部能力,扩展broadcast()支持http通道。

2.2 broadcast()通道扩展

python 复制代码
def broadcast(self, channel="file", output_dir=".", endpoint=None):
    """
    channel="file": 写本地JSON文件(第158天已有)
    channel="http": POST到HTTP endpoint(第159天新增)
    """

channel="http"时需要指定endpoint(如"http://localhost:8080/broadcast"),broadcast()把广播包JSON POST到该地址。

2.3 HTTP接收服务器

用Python内置http.server实现本地接收服务器,无需安装额外依赖:

组件 职责
BroadcastReceiver(BaseHTTPRequestHandler) 接收POST请求,提取证明包,verify()验证
start_receiver(port) 启动后台线程运行HTTP服务器

服务器收到广播包后:

  1. 解析JSON,提取proof_pack
  2. 调用verify(proof_pack)独立验证
  3. 返回回执(含verified、message)

2.4 关键设计约束

  1. 不污染主实例------broadcast()内部调self_prove(),在配置克隆实例上跑,主实例tick/状态不变。
  2. 服务器自动验证------不需要外部手动调listen(),服务器收到即验证。
  3. 无外部依赖------用Python内置http.server + urllib,不需要pip安装。
  4. 回执确认------broadcast()返回服务器回执,机器知道"信号被收到了"。
  5. 异常处理待补充------当前实现假设self_prove()成功、网络可达且服务器正常运行,异常处理在后续迭代中补充。
  6. 安全约束待补充------当前实现仅绑定localhost,无认证机制,适用于本地/内网实验;公网部署需要补充认证和TLS。

三、运行结果

复制代码
========================================================================
  天赐范式第159天(第二篇):让广播走出本机 V3.3.1.0
========================================================================

【步骤1】启动本地HTTP接收服务器
------------------------------------------------------------------------
  接收服务器已启动: localhost:8080
  endpoint: http://localhost:8080/broadcast

【步骤2】机器通过HTTP通道广播------broadcast(channel="http")
------------------------------------------------------------------------
  主实例tick=2 R状态=ACTIVE
  调用 rt.broadcast(channel="http", endpoint=...) ...
  广播完毕,主实例tick仍=2(未被污染)

【步骤3】服务器回执
------------------------------------------------------------------------
  服务器收到: True
  来源: TianCiRuntimeV331
  版本: V3.3.1.0
  阶段数: 8
  verify结果: True
  验证消息: 全部阶段复现一致

【步骤4】广播记录
------------------------------------------------------------------------
  通道: http
  endpoint: http://localhost:8080/broadcast
  时间: 2026-09-08T06:40:46.628231
  证明包claim: 我跑完了完整生命周期
  证明包version: V3.3.1.0
  证明包阶段数: 8
  证明包verifiable: True
  广播状态: sent

【步骤5】file通道 vs http通道对比
------------------------------------------------------------------------
  第158天 channel="file":  证明包写到本地JSON文件
  第159天 channel="http":  证明包POST到HTTP服务器

  file通道: 机器 → 本地文件 → 外部手动listen()
  http通道: 机器 → HTTP POST → 服务器自动verify() → 回执

【步骤6】三环贯通(HTTP版)
------------------------------------------------------------------------
  第1环 self_prove():  机器自己生成证明包
  第2环 broadcast(http): 机器把证明包POST到服务器
  第3环 服务器verify():  服务器收到并独立验证

  三环贯通: self_prove()✓ → broadcast(http)✓ → 服务器verify=True
  证明包通过HTTP发出第一声------广播走出本机了。

========================================================================
  结语
========================================================================

  第158天:broadcast(channel="file")------证明包写到本地文件。
  第159天:broadcast(channel="http")------证明包POST到HTTP服务器。

  从本地文件到HTTP请求------广播的传输介质升级了。
  服务器收到广播包,自动verify()验证,返回回执。
  机器不再需要外部手动来listen()------服务器自动接收自动验证。

  证明包通过HTTP发出第一声。
  这一声,走出了本机。
========================================================================

四、三个关键确认

4.1 服务器verify=True

服务器收到广播包,提取proof_pack,调verify()新建干净实例逐阶段重跑,全部8阶段输出一致。证明包通过HTTP传输后内容完整、验证通过。

4.2 主实例未被污染

broadcast(channel="http")前后,主实例tick始终=2,R状态始终=ACTIVE。HTTP广播在配置克隆实例上生成证明包,不碰主实例。

4.3 三环贯通(HTTP版)

方法 角色 结果
1 self_prove() 机器自己生成证明包
2 broadcast(http) 机器把证明包POST到服务器
3 服务器verify() 服务器收到并独立验证 ✅ True

从"自证"到"HTTP广播"到"服务器自动验证"------三环贯通,证明包从机器内存通过HTTP走到服务器,被独立验证通过。


五、file通道 vs http通道

维度 file通道(158天) http通道(159天)
传输方式 写本地JSON文件 HTTP POST
接收方 文件系统 HTTP服务器
验证方式 外部手动调listen() 服务器自动verify()
回执 无(外部自己来取) 有(服务器返回验证结果)
跨进程 ❌ 同进程文件读写 ✅ 跨进程HTTP通信

http通道的关键升级:机器知道信号被收到了------服务器返回回执,broadcast()能拿到验证结果。file通道是"写完文件不知道谁会来读",http通道是"POST出去马上知道收到且验证通过"。


六、与第一篇的关系

第一篇解决"接收者是谁"------让另一个运行时实例当接收者,互证。

第二篇解决"信号怎么传"------让广播走出本机,通过HTTP传输。

两篇合在一起:互证有了传输基础。两个运行时实例可以通过HTTP互相广播互相验证------不限于同一台机器、同一个文件系统。当DigitalColony的成员通过HTTP通道互证时,互证就不再限于同一台机器------跨机器的数字群落成为可能。


七、结语

第158天broadcast(channel="file")------证明包写到本地文件。

第159天broadcast(channel="http")------证明包POST到HTTP服务器。

从本地文件到HTTP请求------广播的传输介质升级了。

服务器收到广播包,自动verify()验证,返回回执。机器不再需要外部手动来listen()------服务器自动接收自动验证。

证明包通过HTTP发出第一声。这一声,走出了本机。


附录:完整代码

python 复制代码
# -*- coding: utf-8 -*-
"""
天赐范式第159天(第二篇):让广播走出本机 V3.3.1.0
broadcast()扩展channel="http"------证明包通过HTTP POST发出第一声。
本地HTTP接收服务器收到广播包,verify()验证,返回回执。
"""

import json
import os
import urllib.request
from datetime import datetime
from typing import Dict, Tuple
from http.server import HTTPServer, BaseHTTPRequestHandler
from threading import Thread
from tianci_158_2 import TianCiRuntimeV33, verify
from tianci_155_2 import Observation


class TianCiRuntimeV331(TianCiRuntimeV33):
    """
    天赐范式动态运行时 V3.3.1.0
    主版本3: 审计完备迭代
    次版本3: 广播能力
    修订号1: HTTP通道扩展------broadcast()支持channel="http"
    构建号0: 第159天首发
    """

    VERSION = "V3.3.1.0"

    def broadcast(self, channel: str = "file", output_dir: str = ".",
                  endpoint: str = None) -> Dict:
        """
        机器广播:把self_prove()的证明包发到外部。
        channel="file": 写本地JSON文件(第158天已有)
        channel="http": POST到HTTP endpoint(第159天新增)
        """
        proof_pack = self.self_prove()

        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        iso_timestamp = datetime.now().isoformat()

        broadcast_pack = {
            "header": {
                "source": "TianCiRuntimeV331",
                "version": self.VERSION,
                "timestamp": iso_timestamp,
                "channel": channel,
            },
            "proof_pack": proof_pack,
            "broadcast_status": "sent",
        }

        if channel == "file":
            # file通道逻辑自包含复制(非super()调用),让V331的broadcast()不依赖父类实现细节
            filename = "broadcast_{}.json".format(timestamp)
            filepath = os.path.join(output_dir, filename)
            with open(filepath, "w", encoding="utf-8") as f:
                json.dump(broadcast_pack, f, ensure_ascii=False, indent=2)
            return {
                "channel": channel,
                "filepath": filepath,
                "timestamp": iso_timestamp,
                "proof_summary": {
                    "claim": proof_pack["claim"],
                    "version": proof_pack["version"],
                    "stages": len(proof_pack["stages"]),
                    "verifiable": proof_pack["verifiable"],
                },
                "broadcast_status": "sent",
            }

        elif channel == "http":
            if endpoint is None:
                raise ValueError("http通道需要指定endpoint")

            data = json.dumps(broadcast_pack).encode("utf-8")
            req = urllib.request.Request(
                endpoint, data=data,
                headers={"Content-Type": "application/json"}
            )
            resp = urllib.request.urlopen(req)
            resp_data = json.loads(resp.read().decode("utf-8"))

            return {
                "channel": channel,
                "endpoint": endpoint,
                "timestamp": iso_timestamp,
                "proof_summary": {
                    "claim": proof_pack["claim"],
                    "version": proof_pack["version"],
                    "stages": len(proof_pack["stages"]),
                    "verifiable": proof_pack["verifiable"],
                },
                "broadcast_status": "sent",
                "server_response": resp_data,
            }

        else:
            raise ValueError("未知通道: " + channel)


# ================================================================
# HTTP接收服务器
# ================================================================

class BroadcastReceiver(BaseHTTPRequestHandler):
    """
    本地HTTP接收服务器:收到广播包,verify()验证,返回回执。
    """

    def do_POST(self):
        content_length = int(self.headers.get("Content-Length", 0))
        body = self.rfile.read(content_length)
        broadcast_pack = json.loads(body.decode("utf-8"))

        proof_pack = broadcast_pack["proof_pack"]
        ok, msg = verify(proof_pack)

        result = {
            "received": True,
            "source": broadcast_pack["header"]["source"],
            "version": broadcast_pack["header"]["version"],
            "stages": len(proof_pack["stages"]),
            "verified": ok,
            "message": msg,
        }

        resp = json.dumps(result).encode("utf-8")
        self.send_response(200)
        self.send_header("Content-Type", "application/json")
        self.end_headers()
        self.wfile.write(resp)

    def log_message(self, format, *args):
        pass


def start_receiver(port=8080):
    server = HTTPServer(("localhost", port), BroadcastReceiver)
    thread = Thread(target=server.serve_forever, daemon=True)
    thread.start()
    return server


# ================================================================
# 主循环与实验
# ================================================================

def bar(title):
    print("=" * 72)
    print("  " + title)
    print("=" * 72)
    print()


def sub(title):
    print("【" + title)
    print("-" * 72)


def main():
    bar("天赐范式第159天(第二篇):让广播走出本机 V3.3.1.0")

    sub("步骤1】启动本地HTTP接收服务器")
    port = 8080
    server = start_receiver(port)
    endpoint = "http://localhost:{}/broadcast".format(port)
    print("  接收服务器已启动: localhost:" + str(port))
    print("  endpoint: " + endpoint)
    print()

    rt = TianCiRuntimeV331({
        "domain": "r_operator_system", "grid_n": 256,
        "commutator_norm": 0.5, "epsilon_abel": 0.1, "epsilon_emergency": 1.0,
    })
    rt.xi_init("r_operator_system", 256)
    rt.xi_anchor("HTTP广播")
    rt.heartbeat(Observation("气象/北京", [36.5, 0.45, 12.0, 2.3], {"is_rain": True}))
    rt.heartbeat(Observation("金融/SH600000", [12.5, 1.2, 0.25, 3.2]))

    sub("步骤2】机器通过HTTP通道广播------broadcast(channel=\"http\")")
    print("  主实例tick=" + str(rt._tick) + " R状态=" + rt.r_state.state)
    print("  调用 rt.broadcast(channel=\"http\", endpoint=...) ...")
    log = rt.broadcast(channel="http", endpoint=endpoint)
    print("  广播完毕,主实例tick仍=" + str(rt._tick) + "(未被污染)")
    print()

    sub("步骤3】服务器回执")
    resp = log["server_response"]
    print("  服务器收到: " + str(resp["received"]))
    print("  来源: " + resp["source"])
    print("  版本: " + resp["version"])
    print("  阶段数: " + str(resp["stages"]))
    print("  verify结果: " + str(resp["verified"]))
    print("  验证消息: " + resp["message"])
    print()

    sub("步骤4】广播记录")
    print("  通道: " + log["channel"])
    print("  endpoint: " + log["endpoint"])
    print("  时间: " + log["timestamp"])
    print("  证明包claim: " + log["proof_summary"]["claim"])
    print("  证明包version: " + log["proof_summary"]["version"])
    print("  证明包阶段数: " + str(log["proof_summary"]["stages"]))
    print("  证明包verifiable: " + str(log["proof_summary"]["verifiable"]))
    print("  广播状态: " + log["broadcast_status"])
    print()

    sub("步骤5】file通道 vs http通道对比")
    print("  第158天 channel=\"file\":  证明包写到本地JSON文件")
    print("  第159天 channel=\"http\":  证明包POST到HTTP服务器")
    print()
    print("  file通道: 机器 → 本地文件 → 外部手动listen()")
    print("  http通道: 机器 → HTTP POST → 服务器自动verify() → 回执")
    print()

    sub("步骤6】三环贯通(HTTP版)")
    print("  第1环 self_prove():  机器自己生成证明包")
    print("  第2环 broadcast(http): 机器把证明包POST到服务器")
    print("  第3环 服务器verify():  服务器收到并独立验证")
    print()
    print("  三环贯通: self_prove()✓ → broadcast(http)✓ → 服务器verify=" + str(resp["verified"]))
    print("  证明包通过HTTP发出第一声------广播走出本机了。")
    print()

    server.shutdown()

    bar("结语")
    print("  第158天:broadcast(channel=\"file\")------证明包写到本地文件。")
    print("  第159天:broadcast(channel=\"http\")------证明包POST到HTTP服务器。")
    print()
    print("  从本地文件到HTTP请求------广播的传输介质升级了。")
    print("  服务器收到广播包,自动verify()验证,返回回执。")
    print("  机器不再需要外部手动来listen()------服务器自动接收自动验证。")
    print()
    print("  证明包通过HTTP发出第一声。")
    print("  这一声,走出了本机。")
    print("=" * 72)


if __name__ == "__main__":
    main()

v3.3.1.0(代码实现版) | 天赐范式第159天(第二篇) | 2026-09-08

相关推荐
keke.shengfengpolang1 小时前
2026秋招信用风险分析岗面试:SQL和Python到底要学到什么程度才能过?
python
2601_962099082 小时前
python flask sqlalchemy连接数据库流程介绍
数据库·python·flask·教程·sqlalchemy
2601_962293242 小时前
python接口自动化(二十八)--html测试 报告——下(详解)
python·接口自动化·编码问题·htmltestrunner·报告优化
烂蜻蜓2 小时前
Flask入门教程(附录):模板渲染API——Jinja2集成全解析
后端·python·flask
2601_962387822 小时前
Python CUDA 编程 - 2 - Numba 简介
python·numpy·cuda·jit编译器·numba
智能体与具身智能10 小时前
TVA具身智能的概念、架构与应用(19)
人工智能·python·具身智能
2601_9622946111 小时前
python中range函数怎么用
python·for循环·可迭代对象·range函数·整数列表
青 春 记 忆12 小时前
零基础入门python70:Docker Compose 编排完整后端
python·后端开发
新时代牛马12 小时前
字符设备驱动完整篇:从 cdev_add、file_operations 到chrdev_open 与排障
开发语言·python