【问题标题】:How are Urbit phonetic names encoded?Urbit 拼音名称是如何编码的?
【发布时间】:2019-04-11 10:00:50
【问题描述】:

Urbit 点(网络地址)由 32 位整数标识,但通常不使用编号来表示。相反,我通常看到它们以人类可发音的形式表示,其中每个字节都转换为三个字母的音节。例如:

  8 bits  galaxy  ~lyt
 16 bits  star    ~diglyt
 32 bits  planet  ~picder-ragsyt
 64 bits  moon    ~diglyt-diglyt-picder-ragsyt
128 bits  comet   ~racmus-mollen-fallyt-linpex--watres-sibbur-modlux-rinmex

我最初假设每个字节都有一个单独的文本表示,但我发现行星名称通常不包括其恒星的名称,所以它一定比这更复杂。

Urbit 的拼音名称编码系统 (@p-names) 是如何工作的?

【问题讨论】:

    标签: urbit


    【解决方案1】:

    Urbit 的语音命名系统将无符号整数编码为人类可读的字符串。这些无符号整数有时表示它们以大端序编码的字节字符串(尽管该表示无法跟踪前导零,因此如果需要,字节长度必须在带外进行通信)。语音命名方案对这些大端字节进行操作。

    语音命名系统有两种变体。对于一般用途,有@q-encoding,它适用于任何长度的值,并且经常用于在 Hoon 代码中或与 Dojo REPL 交互时表示二进制数据。对于 Urbit 点名称,有 @p-encoding,它基于 @q-encoding 但修改了某些情况。

    @q-编码:音节对

    Urbit 语音名称由 3 个字母的音节组成,分为两个列表,每个列表包含 256 个音节。每个音节由一个辅音、一个元音和另一个辅音组成。 “前缀”音节列表使用元音aio,“后缀”音节列表使用元音euy,但有一个例外:@ 987654334@,后缀列表中的第一个条目。完整的音节列表如下。

    适合一个字节的值,从0x000xFF,通过从后缀列表中获取相应的音节进行编码。示例:0x00 变为 ~zod0x01 变为 ~nec

    0x01000xFFFF的两个字节中的值是通过查找前缀列表中的高字节对应的音节并连接后缀列表中的低字节对应的音节来编码的。示例:0x0100 变为 ~marzod0x0101 变为 ~marnec

    较大的值通过以大端顺序将它们分成两字节对进行编码,按照上述对适合两个字节的值进行编码,并使用-连字符/减号字符连接结果。如果该值为奇数字节,则第一个字节对用前导零填充。示例:0x01_0000 变为 ~doznec-dozzod0x0101_0101 变为 ~marnec-marnec

    @p-编码:扰乱行星

    对于大多数值,@p 编码方案与 @q 相同。但是 17 到 64 位的值不同,对应行星和卫星的 ID。

    行星旨在对应于 Urbit 网络上的真实个体。每个行星都是从一颗恒星产生的,行星 ID 的低 16 位是其母星 ID。在@q-编码系统下,这也意味着每个行星名称的最后两个音节将是它的恒星名称。 Urbit 开发人员不希望网络上的每个人的名字都包含最初恰好产生他们的星球的恒星的名称:这会人为地将他们与恒星永远联系起来,即使他们可以立即将他们的星球转移到另一颗恒星.

    他们的解决方案是随机打乱所有行星名称,以混淆行星名称与其母星名称之间的关系。这是作为可能的行星 ID 空间上的自定义(显然是不安全的)密码来实现的。因为每颗恒星有 216 - 1 颗行星,行星的数量不是 2 的幂,所以传统的分组密码不能直接工作。相反,他们使用 Ciphers with Arbitrary Finite Domains (Black and Rockway 2002) 中描述的结构,而不是针对速度优化的自定义 Feistel 样式分组密码 (and compatibility)。

    这种加扰应用于行星 ID 和卫星 ID 的低 32 位(对应于其父行星的 ID)。在@p-encoding 下,ID 为0x01_0101 的行星变为~ralnyt-botdyt,显示与其母星~marnec 没有任何联系。星-行星关系是唯一被混淆的关系。如果您查看行星卫星的名称,它们直接包含行星的名称:例如,~ralnyt-botdyt 的卫星 0x01_0001_0101 变为 ~doznec-ralnyt-botdyt0x02_0001_0101 变为 ~dozbud-ralnyt-botdyt

    实现

    在编写 Hoon 代码时,例如在 Dojo REPL 中,您可以直接使用标准的 @p@q 函数将值编码为相应的拼音名称。在 Hoon 中,@p 编码值使用前缀 ~ 标识,@q 编码值使用前缀 .~ 标识,两者都可以使用 @u 函数解码回来。 Hoon 还使用. 句点字符作为整数文字中的(强制性)千位分隔符。

    > `@p`1.529.729.032
    ~diglyt-diglyt
    > `@q`1.529.729.032
    .~fonbyn-mopful      
    > `@u`~diglyt-diglyt
    1.529.729.032
    > `@u`.~diglyt-diglyt
    3.246.440.832
    

    在 JavaScript 中,the official urbit-ob package 提供了类似的功能。

    import ob from "urbit-ob";
    ob.patp(1529729032);           // ~diglyt-diglyt
    ob.patq(1529729032);           // ~fonbyn-mopful
    ob.patp2dec("~diglyt-diglyt"); // 1529729032
    ob.patq2dec("~diglyt-diglyt"); // 3246440832
    

    完整的音节列表

    prefixes = ["doz","mar","bin","wan","sam","lit","sig","hid","fid","lis","sog",
    "dir","wac","sab","wis","sib","rig","sol","dop","mod","fog","lid","hop","dar",
    "dor","lor","hod","fol","rin","tog","sil","mir","hol","pas","lac","rov","liv",
    "dal","sat","lib","tab","han","tic","pid","tor","bol","fos","dot","los","dil",
    "for","pil","ram","tir","win","tad","bic","dif","roc","wid","bis","das","mid",
    "lop","ril","nar","dap","mol","san","loc","nov","sit","nid","tip","sic","rop",
    "wit","nat","pan","min","rit","pod","mot","tam","tol","sav","pos","nap","nop",
    "som","fin","fon","ban","mor","wor","sip","ron","nor","bot","wic","soc","wat",
    "dol","mag","pic","dav","bid","bal","tim","tas","mal","lig","siv","tag","pad",
    "sal","div","dac","tan","sid","fab","tar","mon","ran","nis","wol","mis","pal",
    "las","dis","map","rab","tob","rol","lat","lon","nod","nav","fig","nom","nib",
    "pag","sop","ral","bil","had","doc","rid","moc","pac","rav","rip","fal","tod",
    "til","tin","hap","mic","fan","pat","tac","lab","mog","sim","son","pin","lom",
    "ric","tap","fir","has","bos","bat","poc","hac","tid","hav","sap","lin","dib",
    "hos","dab","bit","bar","rac","par","lod","dos","bor","toc","hil","mac","tom",
    "dig","fil","fas","mit","hob","har","mig","hin","rad","mas","hal","rag","lag",
    "fad","top","mop","hab","nil","nos","mil","fop","fam","dat","nol","din","hat",
    "nac","ris","fot","rib","hoc","nim","lar","fit","wal","rap","sar","nal","mos",
    "lan","don","dan","lad","dov","riv","bac","pol","lap","tal","pit","nam","bon",
    "ros","ton","fod","pon","sov","noc","sor","lav","mat","mip","fip"]
    
    suffixes = ["zod","nec","bud","wes","sev","per","sut","let","ful","pen","syt",
    "dur","wep","ser","wyl","sun","ryp","syx","dyr","nup","heb","peg","lup","dep",
    "dys","put","lug","hec","ryt","tyv","syd","nex","lun","mep","lut","sep","pes",
    "del","sul","ped","tem","led","tul","met","wen","byn","hex","feb","pyl","dul",
    "het","mev","rut","tyl","wyd","tep","bes","dex","sef","wyc","bur","der","nep",
    "pur","rys","reb","den","nut","sub","pet","rul","syn","reg","tyd","sup","sem",
    "wyn","rec","meg","net","sec","mul","nym","tev","web","sum","mut","nyx","rex",
    "teb","fus","hep","ben","mus","wyx","sym","sel","ruc","dec","wex","syr","wet",
    "dyl","myn","mes","det","bet","bel","tux","tug","myr","pel","syp","ter","meb",
    "set","dut","deg","tex","sur","fel","tud","nux","rux","ren","wyt","nub","med",
    "lyt","dus","neb","rum","tyn","seg","lyx","pun","res","red","fun","rev","ref",
    "mec","ted","rus","bex","leb","dux","ryn","num","pyx","ryg","ryx","fep","tyr",
    "tus","tyc","leg","nem","fer","mer","ten","lus","nus","syl","tec","mex","pub",
    "rym","tuc","fyl","lep","deb","ber","mug","hut","tun","byl","sud","pem","dev",
    "lur","def","bus","bep","run","mel","pex","dyt","byt","typ","lev","myl","wed",
    "duc","fur","fex","nul","luc","len","ner","lex","rup","ned","lec","ryd","lyd",
    "fen","wel","nyd","hus","rel","rud","nes","hes","fet","des","ret","dun","ler",
    "nyr","seb","hul","ryl","lud","rem","lys","fyn","wer","ryc","sug","nys","nyl",
    "lyn","dyn","dem","lux","fed","sed","bec","mun","lyr","tes","mud","nyt","byr",
    "sen","weg","fyr","mur","tel","rep","teg","pec","nel","nev","fes"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-10
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      相关资源
      最近更新 更多