天赐范式第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服务器 |
服务器收到广播包后:
- 解析JSON,提取
proof_pack - 调用
verify(proof_pack)独立验证 - 返回回执(含verified、message)
2.4 关键设计约束
- 不污染主实例------broadcast()内部调self_prove(),在配置克隆实例上跑,主实例tick/状态不变。
- 服务器自动验证------不需要外部手动调listen(),服务器收到即验证。
- 无外部依赖------用Python内置http.server + urllib,不需要pip安装。
- 回执确认------broadcast()返回服务器回执,机器知道"信号被收到了"。
- 异常处理待补充------当前实现假设self_prove()成功、网络可达且服务器正常运行,异常处理在后续迭代中补充。
- 安全约束待补充------当前实现仅绑定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