区块链后端【免费下载链接】chia-blockchainChia blockchain python implementation (full node, farmer, harvester, timelord, and wallet)项目地址https://gitcode.com/gh_mirrors/ch/chia-blockchain点击查看免费下载导读本文聚焦 Chia 区块链 Python 实现中的chia/solver/服务模块它是 V2 图v2 plot部分证明partial proof求解的专用服务边界负责接收 Farmer 发来的SolverInfo消息通过 Rust 扩展chia_rs.solve_proof()将PartialProof片段展开为完整证明字节并返回SolverResponse供 Farmer 重新接入常规的时空证明proof-of-space处理流程。读完本文你将掌握 solver 服务的职责边界、端到端运行时流程、SolverInfo/SolverResponse网络协议契约、config.yaml中的完整配置项、可信对等节点准入机制以及 Farmer 侧请求关联与响应处理的关键实现。Solver 是 Chia 网络中一个刻意保持小而专的服务它不是链、图、密钥或 Farmer 状态的权威只负责把证明展开这种计算密集工作从 Farmer 热路径中分离出来。为什么需要 SolverV2 图与部分证明的职责分离V1 图由 Harvester 直接生成完整证明并上报 Farmer而 V2 图采用不同的架构Harvester 在本地只做质量查找quality lookup产出部分证明partial proof并发送给 Farmer由独立的 Solver 服务完成昂贵的证明展开。从源码结构看这一设计体现了清晰的关注点分离职责归属模块图文件与证明器prover的本地所有权Harvesterchia/harvester/签名点上下文校验、Harvester 关联、请求广播与响应重建Farmerchia/farmer/昂贵的证明展开partial → full proofSolverchia/solver/chia_rs最终证明的验收Full node 与共识层Solver 自身不具备图的打开能力也不验证图归属。V2 Harvester 只提供部分证明加图元数据V1 图则完全绕过 Solver 直接返回完整证明见 harvester_api.py 中_handle_v1_responses与_handle_v2_responses的并行处理逻辑。正因如此Solver 吞吐量与响应处理是 Farmer 的热路径hot path——尽管 Solver 服务本身实现很小任何一个响应延迟都会直接影响 Farmer 对证明的后续处理。主运行时流程从部分证明到完整证明的端到端链路依据 farmer_api.py 与 solver_api.py 的实现完整流程如下Harvester 产出部分证明V2 Harvester 对签名点找到合格的部分证明后封装为PartialProofsData包含challenge_hash、sp_hash、plot_identifier、partial_proofs、signage_point_index、plot_size、plot_index、meta_group、strength等发送给 Farmer。Farmer 校验签名点上下文Farmer 收到partial_proofs消息后若sp_hash不在其短时签名点缓存farmer.number_of_responses中则拒绝处理新签名点会登记到cache_add_time。Farmer 登记待处理请求对每个部分证明Farmer 以bytes(partial_proof)为键将原始PartialProofsData与来源 Harvester peer 存入pending_solver_requests见 farmer.py 第 208 行的pending_solver_requests: dict[bytes, dict[str, Any]]。Farmer 广播 solve 请求构造SolverInfo(partial_proof, plot_id, strength, size)通过send_to_all([msg], NodeType.SOLVER)广播给所有当前 Solver 连接farmer_api.py的partial_proofs处理器。Solver 求解收到solve后检查solver.started调用chia_rs.solve_proof(partial_proof, plot_id, strength, size, constants.TESTNET)成功则返回SolverResponse(partial_proof, proof)。Farmer 重建并继续Farmer 的solution_response处理器仅当partial_proof匹配待处理请求时才接受空证明直接丢弃随后用求解得到的 proof 字节重建 V2ProofOfSpace封装为NewProofOfSpace并调用new_proof_of_space()携带原始 Harvester peer 继续后续签名流程。关键实现细节farmer_api.pysolution_response第 572–629 行关联键是序列化后的部分证明本身key bytes(response.partial_proof)不是 WebSocket 请求 ID重建的ProofOfSpace中size字段固定为uint8(0)V2 证明中 size 不使用size field的语义与 V1 不同plot_identifier由partial_proof.get_string(strength).hex() plot_identifier拼接而来最终通过await self.new_proof_of_space(new_proof_of_space, original_peer)重新进入常规证明处理。关联键的脆弱性请求关联键仅为序列化部分证明。如果不同 Harvester/签名点上下文并发出现完全相同的部分证明后写入的请求会覆盖先前的元数据。修改这一键控逻辑属于 Farmer/Solver 正确性敏感改动。网络与协议契约SolverInfo / SolverResponse消息定义Solver 的线上契约定义在 solver_protocol.py两者都是基于chia.util.streamable的Streamable冻结数据类streamable dataclass(frozenTrue) class SolverInfo(Streamable): partial_proof: PartialProof # 来自 chia_rs 的部分证明片段 plot_id: bytes32 # 图 ID strength: uint8 # V2 强度参数 size: uint8 # k-size streamable dataclass(frozenTrue) class SolverResponse(Streamable): partial_proof: PartialProof # 回传原部分证明供 Farmer 关联匹配 proof: bytes # 展开后的完整证明字节消息类型与发送授权ProtocolMessageTypes.solve 109solution_response 108见 protocol_message_types.py 第 142、145 行发送授权不对称Farmer 可以发送solveSolver 可以发送solution_responseSolverAPI.solve()虽通过metadata.request(peer_requiredFalse, reply_types[ProtocolMessageTypes.solution_response])声明了回复类型但 Farmer 实际通过广播发送solve而非 request-id 的call_api()匹配。这意味着 Solver 的响应是作为入站协议消息处理的而非请求 ID 状态机匹配见 solver_api.py 第 32 行。协议版本与能力NodeType.SOLVER拥有独立的协议版本0.0.37见 shared_protocol.py 第 19 行并挂载与其它节点类型相同的共享能力集solve与solution_response被期望保持为小型、受速率限制rate-limited的载荷。不要向这两个 schema 添加大字段否则必须同步更新chia/protocols/与chia/server/中的速率限制假设Schema 修改遵循协议锁步protocol lockstep流程消息类型、发送者映射、API/stub 元数据、速率限制、兼容性测试以及协议版本号都需要一并评估。生命周期、配置与对等节点准入服务组装start_solver.py 的create_solver_service()第 33–70 行遵循 Chia 标准服务组装模式读取config[solver]段配置与selected_network基于DEFAULT_CONSTANTS应用网络覆盖update_testnet_overrides并替换字符串常量为字节replace_str_to_bytes构建Solver节点、SolverAPI对等 API若start_rpc_server为真则挂载SolverRpcApi与rpc_port以NodeType.SOLVER类型、advertised_portservice_config[port]包装为ServiceSolverService Service[Solver, SolverAPI, SolverRpcApi]见 solver_service.py。完整配置项config.yaml 的 solver 段以下配置来自 initial-config.yaml 第 667–701 行是chia init后config.yaml中 solver 段的模板solver: # Solver 服务监听端口 port: 8666 # 是否启用 UPnP 端口转发 enable_upnp: False # 可信 solver 对等节点 Node ID默认仅这些节点可连接 trusted_peers: 0ThisisanexampleNodeID7ff9d60f1c3fa270c213c0ad0cb89c01274634a7c3cb7: Does_not_matter # False接受所有对等节点连接 # True默认仅接受 localhost 与 trusted_peers 中的连接 trusted_peers_only: True logging: *logging network_overrides: *network_overrides selected_network: *selected_network # Solver 求解线程池大小 num_threads: 1 # 本地 RPC 服务配置仅观测用途 rpc_port: 8667 start_rpc_server: True ssl: private_crt: config/ssl/solver/private_solver.crt private_key: config/ssl/solver/private_solver.key public_crt: config/ssl/solver/public_solver.crt public_key: config/ssl/solver/public_solver.keyFarmer 侧对接配置Farmer 段中的solver_peers指定要连接的 solver 列表initial-config.yaml 第 215–218 行farmer: # The farmer will attempt to connect to these solvers for V2 plot solving solver_peers: - host: *self_hostname # 默认本机 port: 8666 # 与 solver.port 对应可信对等节点准入实现Solver.on_connect()solver.py 第 81–91 行实现准入逻辑若连接来自trusted_peers配置中的节点 ID直接接受否则若trusted_peers_only为False即被显式禁用接受并记录日志否则记录警告并关闭连接。线程池与关闭语义num_threads控制ThreadPoolExecutor大小线程名前缀solver-。注意当前solve()实现是在 API 处理器中同步调用solve_proof()并未把工作调度到执行器上见 solver.py 第 70–76 行与 solver_api.py 第 48 行——因此调整求解吞吐或阻塞行为时必须评估 API 任务延迟与事件循环影响关闭流程manage()设置_shut_down True、标记服务关闭并以executor.shutdown(waitTrue)等待线程池任务排空solver.py 第 57–68 行。本地 RPC仅观测SolverRpcApisolver_rpc_api.py只暴露一个路由get_state返回{started: self.service.started}。它不配置对等节点、不提交求解工作、不暴露证明数据_state_changed()返回空列表即不产生任何 WebSocket 事件——UI/守护进程应将其视为仅轮询polling-only接口。Farmer 侧请求关联与connect_to_solver广播与响应匹配Farmer 对每个部分证明广播solve给所有当前 Solver 连接并在solution_response中按bytes(partial_proof)查找待处理请求未命中则记录 unknown partial proof 警告并丢弃命中则弹出请求取出原始proof_data与original_peer空 prooflen(proof_bytes) 0记录警告后返回不继续处理成功则重建NewProofOfSpace并调用new_proof_of_space()。由于 Farmer 广播给所有 Solver多个 Solver 可能竞争回答同一个部分证明第一个匹配的响应会弹出待处理请求之后到达的合法响应会被记录为未知并丢弃farmer_api.py 第 572–629 行。请求清理SolverAPI.solve()返回None时如求解失败或服务未启动会对 Farmer静默无响应。Farmer 侧的待处理请求只在发送失败或收到匹配响应时清理无响应场景下条目会一直留存直到周边 Farmer 缓存清理任务_periodically_clear_cache_and_refresh_task基于SUB_SLOT_TIME_TARGET * 3的超时清理见 farmer.py 第 936–968 行处理相关状态。connect_to_solver RPCFarmer RPC 暴露/connect_to_solver路由farmer_rpc_api.py 第 109、372 行起先关闭所有现有NodeType.SOLVER连接再解析目标host/port发起新连接用于动态切换/重连 solver。CLI 侧入口位于 farm_funcs.pychia farm ...相关命令调用farmer_client.connect_to_solver(host, port)。对应集成测试见 test_farmer_harvester_rpc.py 的test_farmer_connect_to_solver第 528–553 行覆盖成功连接现有 solver 与连接不存在 solverlocalhost:65000抛ResponseFailureError两种场景。关键脆弱点Fragility Hotspotsconstants.TESTNET传入solve_proof()网络/分叉行为发生变化时需确认该标志是否是 mainnet 与 testnet 配置下 Rust API 的预期输入solver.py 第 73 行。日志热路径Solver 会记录部分证明片段与 plot IDpartial_proof.fragments[:5]、plot-id。应避免在热签名点路径上提高日志量或引入敏感本地元数据。无响应语义SolverAPI.solve()返回None时对 Farmer 静默无响应待处理请求的清理依赖发送失败或匹配响应长期无响应可能残留条目直至周边缓存清理。多 Solver 竞争广播语义下多个 Solver 可能竞答同一部分证明首个匹配响应弹出请求后续响应被丢弃。RPC 无事件推送SolverRpcApi._state_changed()不返回 WebSocket 事件除非刻意增加事件支持否则 UI/守护进程只能轮询。测试策略从文档规划与仓库测试现状看Solver 相关测试应覆盖以下层次单元/服务测试就绪门控ready()依赖solver.started、成功构造SolverResponse、solve_proof()失败时返回无消息、服务关闭时执行器资源正确排空Farmer/Solver 集成测试待处理请求插入、未知响应丢弃、空证明清理、成功重建NewProofOfSpace、Solver 发送异常、单个部分证明的多个 Solver 响应。仓库中已具备的集成示例是test_farmer_connect_to_solverfixturefarmer_one_harvester_solver见 test_farmer_harvester_rpc.py协议测试Solver 消息序列化以及 schema/消息 ID 变更时发送者映射与回复元数据的静态不变量生命周期/RPC 测试默认与配置的 solver peer 连接、可信对等节点准入、get_state、通过 farmerconnect_to_solver的重连行为。源码指路Solver 服务/API/RPC solver.py、solver_api.py、solver_rpc_api.py、start_solver.py、solver_service.pyFarmer 侧请求关联 farmer.py、farmer_api.py、farmer_rpc_api.pyHarvester 部分证明产出 harvester_api.py、prover.py线上契约与发送授权 solver_protocol.py、protocol_message_types.py、shared_protocol.py证明展开实现边界chia_rs.solve_proofRust 扩展Python 侧仅做编排与边界封装配置模板 initial-config.yamlsolver 段第 667–701 行farmersolver_peers第 215–218 行综上Solver 模块是 Chia V2 图架构中计算下放的关键一环职责边界清晰、协议精简、配置集中在config.yaml的solver段而其正确性与性能高度依赖 Farmer 侧的请求关联、广播竞答处理与缓存清理语义。理解这一条链路是排障 V2 图出块延迟与证明丢失问题的起点。赞分享区块链后端【免费下载链接】chia-blockchainChia blockchain python implementation (full node, farmer, harvester, timelord, and wallet)项目地址https://gitcode.com/gh_mirrors/ch/chia-blockchain点击查看免费下载相关推荐Chia 节点服务 API 协议元数据解析chia/apis 存根模块与 ApiMetadata 装饰器运行机制Chia 节点服务 API 协议元数据解析chia/apis 存根模块与 ApiMetadata 装饰器运行机制 导读 chia/apis/ 目录是 Chia区块链后端Devenv 声明式配置 PostgreSQL 服务services.postgres 模块配置与源码级解析Devenv 声明式配置 PostgreSQL 服务services.postgres 模块配置与源码级解析 devenv 通过 services.postg开发工具CLIProxySQL DuckDB 服务器插件嵌入分析引擎、双协议监听与配置运维全解析ProxySQL DuckDB 服务器插件嵌入分析引擎、双协议监听与配置运维全解析 ProxySQL 的 DuckDB Server Plugin 将 Duc后端数据库负载均衡创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考