moonbit-beam-dist

    Erlang distribution 握手(SEND_NAME/sok/CHALLENGE/REPLY/ACK 五帧)+cookie MD5 认证+控制帧解析;纯核零依赖

    erlang
    distribution
    handshake
    cookie
    moonbit
    Download zip
    Author
    Version
    0.0.13
    License
    Apache-2.0
    Last updated
    13 hours ago
    Downloads
    51

    #moonbit-beam-dist

    Erlang distribution 协议层(MoonBit 纯核):五帧握手(SEND_NAME/sok/ CHALLENGE/REPLY/ACK)、cookie MD5 认证、控制帧解析。协议形自 OTP26 dist_util.erl/dist.c 真源+strace 真帧逐字节对拍(clean-room 零拷贝); digest 算法藏 DigestPort trait 后(六边形——真 MD5 住 adapter,候选 mooncry 绑定;测试注入确定性假实现)。

    #包结构

    包内容
    thy1016/moonbit-beam-dist五帧握手+digest 注入形+flags 常量面(唯一包)

    状态:0.0.1 骨架(阶段 3)。依赖面:moonbit-eetf(EETF 项编解码)、 moonbit-epmd(端口发现)——骨架 v0 零依赖自足,组合根候选位挂账。

    #特性

    • 五帧握手:SEND_NAME('N'+creation+flags u64+name)/sok/CHALLENGE 解/ REPLY 组帧/ACK 校验——真帧字节序全对拍。
    • digest 真形:MD5(cookie ‖ decimal_string(challenge))—— dist_util.erl:529 对拍;challenge 十进制 ASCII 直串。
    • flags 常量:OTP26 协商裁定位形 0x00000d03bf5fbd(规格书 §5)。
    • DigestPort 注入:确定性假实现测试形+真实现 adapter 位。

    #测试门

    moon check --deny-warn && moon test --target native

    #演进位

    • 控制帧解(DOP 词表 19/20/21/28——规格书 §6,真件 moonactor/erl_dist etf_gen 词表随行)
    • MD5 adapter(mooncry 绑定)+真 MD5 金罐(差分对拍,律 11)
    • 消息收发面(payload 帧/tick)+真网门(归役自跑)

    #仓库

    • mooncakes 名: thy1016/moonbit-beam-dist
    • 仓库: git@gitlink.org.cn:thy7/mbt.deam.dist.git(master)
    • 孵化: bitbang 主仓孵化件独立入库(2026-11-06;孵化期零跨仓 import——组合根候 mooncakes 发版后 moon add 接线)

    DigestPort

    pub(open) trait DigestPort {
    fn md5(self : Self, data : Bytes) -> Bytes
    }

    DigestPort(digest 六边形位):真实现(mooncry/openssl)住 adapter;测试注入假实现

    EpmdPort

    pub(open) trait EpmdPort {
    async fn send(self : Self, frame : Bytes) -> Unit raise DistError
    async fn recv_all(self : Self) -> Bytes raise DistError
    }

    epmd 传输口(TCP 4369 注入位——send=请求帧(含 u16 len 头);recv_all=应答体)

    EtfPort

    pub(open) trait EtfPort {
    fn decode_term(self : Self, bytes : Bytes, pos : Int, attab : Array[String]) -> (EtfItem, Int) raise ControlError
    }

    ETF 项解码注入位(组合根=moonbit-eetf impl;decode 一项推进一位; attab='D' 段头解析出的 atom cache 表——'R' ATOM_CACHE_REF 查表语境)

    ControlError

    pub(all) suberror ControlError {
    ShortFrame(String)
    UnknownDop(Int)
    BadTag(String)
    CacheSegment(String)
    Codec(String)
    }

    DistError

    pub(all) suberror DistError {
    Truncated(String)
    Malformed(String)
    DigestUnavailable(String)
    }

    ControlMsg

    pub(all) struct ControlMsg {
    tag : Int
    name : String
    semantics : String
    items : Array[EtfItem]
    next_pos : Int
    }

    控制消息(tag+词表名+语义动词+参数项流)

    EpmdPortInfo

    pub(all) struct EpmdPortInfo {
    port : Int
    }

    分发口信息(端口发现结果)

    EtfItem

    pub(all) enum EtfItem {
    IAtom(String)
    IInt(Int)
    IPid(String, Int, Int, Int)
    IRef(String, Int, Int)
    ITuple(Array[EtfItem])
    IList(Array[EtfItem])
    INil
    IBinary(Bytes)
    IOther
    }

    ETF 项值(控制面所需子集——beam-dist 自持,eetf 组合根映射; 不 import eetf——六边形归位)

    ServerChallenge

    pub(all) struct ServerChallenge {
    flags : UInt64
    challenge : UInt
    creation : Int
    name : String
    }

    DIST_FLAGS

    let DIST_FLAGS : UInt64

    我方 flags(单变量判决形 v2 2026-11-07——external.c:950 真源:段头期待位 =ATOM_CACHE(0x2000)|FRAGMENTS(0x800000) 双位,声明任一即被对端期待发帧 带段头(四震 corrupted 根因);0.0.7 全量形(握手 PASS 铁证)仅去 FRAGMENTS ——v1 0x33f5fbd 连裁高 32 位区=多变量违规握手拒;单变量律回归)

    DOP_DEMONITOR_P

    let DOP_DEMONITOR_P : Int

    {20, SourcePid, Target, Ref}

    DOP_EXIT2

    let DOP_EXIT2 : Int

    {8, FromPid, ToPid, Reason}

    DOP_MONITOR_P

    let DOP_MONITOR_P : Int

    {19, WatcherPid, Watched(pid|atom), Ref}——远端要监视本地

    DOP_MONITOR_P_EXIT

    let DOP_MONITOR_P_EXIT : Int

    {21, SourcePid, Target, Ref, Reason}——元组形(无 EXIT_PAYLOAD 位)

    DOP_PAYLOAD_MONITOR_P_EXIT

    let DOP_PAYLOAD_MONITOR_P_EXIT : Int

    {28, Target, Watcher, Ref}+msg=Reason 同流第 5 项(DFLAG_EXIT_PAYLOAD;'Z' ref 新形)

    DOP_REG_SEND

    let DOP_REG_SEND : Int

    {6, FromPid, Cookie='', ToName}——4 元(dist.c REG_SEND 臂 arity 必 4,R9B+ cookie 恒空 atom;payload 逻辑分离——msg 段同包自帶 131)

    DOP_SEND

    let DOP_SEND : Int

    DOP 控制消息词表常量(dist.h DOP 枚举——数据面;真源=词表 TOML) {2, '', To}——from 位普通 SEND 恒空 atom(dist.c:2508);payload 分离

    DOP_SEND_SENDER

    let DOP_SEND_SENDER : Int

    {22, FromPid, ToPid}+msg=message——SEND 带发送方形(SEND_SENDER 位声明形;rex reply 投递实形,probe dump 铁证 2026-11-07)
    let DOP_UNLINK_ID : Int

    {35, FromPid, ToPid, Id}(DFLAG_UNLINK_ID 新代)
    let DOP_UNLINK_ID_ACK : Int

    {36, FromPid, ToPid, Id}

    all_dops

    fn all_dops() -> Array[(Int, String, String, String)]

    challenge_reply

    fn challenge_reply(digest : &DigestPort, client_chal : UInt, server_chal : UInt, cookie : String) -> Bytes

    帧 4:REPLY 组帧('r' | client_chal u32 | digest 16B)

    decode_control

    fn decode_control(frame : Bytes, etf : &EtfPort) -> ControlMsg raise ControlError

    控制帧解码:83 起头核+['D' 段头跳]+首项 tag 分派+参数项流收集。 frame = 裸 ETF 流(传输面剥 u32 len 后交付——线形守恒)。

    dist_port_of

    async fn dist_port_of(name : String, epmd : &EpmdPort) -> Int raise DistError

    端口发现封装(连接远程节点前入口——beam-dist 复用位): req 组帧→send→recv_all(裸形全收——PORT2_RESP 无 len 头)→resp 解 查询名=epmd 表名(短名——外证 epmd -names 对拍形)

    dop_name_of

    fn dop_name_of(tag : Int) -> String?

    封闭查表:tag → 语义名(未知 None——负例诚实拒)

    dop_semantics_of

    fn dop_semantics_of(tag : Int) -> String?

    封闭查表:tag → 语义动词(send/account/stop——L3 分派面)

    epmd_alive2_req

    fn epmd_alive2_req(port : Int, name : String) -> Bytes

    ALIVE2 请求组帧(节点注册——真客户端形:creation 由 epmd 分配,编造野值 = 对端 dist 处理 error→shutdown,坑账条 8 铁律;moonactor epmd.mbt 底本 移植,终形=epmd -d 真帧对拍):len | 0x78 | port(BE) | 0x4d | proto=0 | hver=6(BE) | lver=5(BE) | nlen | name | creation=0(BE 请求位,分配值回 resp)

    epmd_alive2_resp

    fn epmd_alive2_resp(body : Bytes) -> Int raise DistError

    ALIVE2 应答解(4 字节裸,无 len 头——epmd_srv.c:824 真源): 'v'(0x76) | result | creation u16 BE——result≠0 拒(口占/名撞)

    epmd_port2_req

    fn epmd_port2_req(name : String) -> Bytes

    PORT2 请求组帧(端口发现——连接远程节点前查分发入口;epmd.h:27 'z'): u16 len BE | 'z' | name(name 到包尾,无独立 nlen——srv.c &buf[1] 铁证; 查询名=epmd -names 表名(短名——外证真形)

    epmd_port2_resp

    fn epmd_port2_resp(body : Bytes) -> Int raise DistError

    PORT2 应答解(裸写形——epmd_srv.c:1516 reply() 无 len 头;ok 形= 'w'|result|port u16|nodetype|protocol|highvsn|lowvsn|nlen|name; 解到 port 即用;result≠0 = NotFound(节点未注册——epmd -names 对拍))

    gen_digest

    fn gen_digest(digest : &DigestPort, challenge : UInt, cookie : String) -> Bytes

    digest 算法真形:MD5(cookie ‖ decimal_string(challenge)) (dist_util.erl:529;challenge 十进制 ASCII 直串——规格书 §4 坑账)

    parse_ack

    fn parse_ack(digest : &DigestPort, data : Bytes, client_chal : UInt, cookie : String) -> Bool raise DistError

    帧 5:ACK 校验('a' | digest 16B——server 真算我方 chal 的 digest)

    parse_challenge

    fn parse_challenge(data : Bytes) -> ServerChallenge raise DistError

    帧 3:CHALLENGE 解('N' | flags u64 | challenge u32 | creation u32 | namelen u16 | name)

    parse_status

    fn parse_status(data : Bytes) -> Bool raise DistError

    帧 2:status "ok" 解('s' | len u16 | "ok")——u16 len 头外置

    send_name

    fn send_name(creation : Int, name : String) -> Bytes

    帧 1:SEND_NAME('N' | flags u64 | creation u32 | namelen u16 | name) (真形勘定 2026-11-06:真网 probea FIN 勘——骨架役组帧序/域双错 (creation u16+flags 后置);moonactor dist_send_name 金罐真帧对拍 ——shot 门 B PASS 实证形为真:flags 先,creation u32)

    show_control_error

    fn show_control_error(e : ControlError) -> String

    控制错误文本面(show 手写——零 derive 守恒)