首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Urbit语音名称是如何编码的?

Urbit语音名称是如何编码的?
EN

Stack Overflow用户
提问于 2019-04-09 23:38:39
回答 1查看 0关注 0票数 0

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)如何工作?

EN

回答 1

Stack Overflow用户

发布于 2019-04-10 08:50:24

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

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

@q-Encoding:成对的音节

Urbit语音名称由3个字母的音节组成,每个音节由两个256个音节组成。每个音节由辅音,元音,然后是另一个辅音组成。在“前缀”音节列表使用元音 ai以及o和“后缀”音节列表使用元音euy,有一个例外:zod在后缀列表中的第一项。完整的音节列表如下。

值在一个字节装修,从0x000xFF,通过从后缀列表采取相应的音节编码。例子:0x00成为~zod0x01成为~nec

值两个字节,从配件0x01000xFFFF,通过查找与前缀列表中的高位字节的音节和连接对应于后缀列表中的低字节的音节编码。例子:0x0100成为~marzod0x0101成为~marnec

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

@p- 编码:加扰行星

@p-encoding方案是一样的@q大多数值。但是,对于17到64位之间的值,它们是不同的,它们对应于行星和卫星的ID。

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

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

这种加扰应用于行星ID,并应用于月球ID的低32位(对应于其父行星的ID)。在@p编码不足的情况下,具有ID的行星0x01_0101变为~ralnyt-botdyt,与其母星没有任何联系~marnec。星球关系是唯一被隐藏的关系。如果你看一个行星卫星的名字,它们包括行星的名字,它不会被隐藏:例如,0x01_0001_0101变成~doznec-ralnyt-botdyt0x02_0001_0101变成~dozbud-ralnyt-botdyt

33到64位之间的值是彗星,其ID非常长,随机,并且不与任何父级相关联,因此它们不需要加扰。

实现

在编写Hoon代码时,例如在Dojo REPL中,您可以直接使用标准@p@q函数将值编码为相应的语音名称。在Hoon中,@p使用前缀标识~@q编码的值.~,并使用前缀标识已编码的值,并且可以使用该@u函数对其进行解码。

> `@p`0x0   
~zod        
> `@q`0x0   
.~zod       
> `@u`~zod  
0           
> `@u`.~zod 
0           

在JavaScript中,官方urbit-ob提供类似的功能。

const ob = require('urbit-ob');
ob.hex2patp('00');   // "~zod"
ob.hex2patq('00');   // "~zod"
ob.patp2hex('~zod'); // "00"
ob.patq2hex('~zod'); // "00"

完整音节列表

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"]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100005169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档