shrub/sys/vane/ames.hoon

1622 lines
54 KiB
Plaintext
Raw Normal View History

!: :: ames (4a), networking
2013-09-29 00:21:18 +04:00
::
2017-10-24 08:17:38 +03:00
|= pit=vase
2013-09-29 00:21:18 +04:00
=> =~
2014-06-03 09:07:32 +04:00
:: structures
2017-04-17 04:52:41 +03:00
=, ames
2018-08-17 00:39:39 +03:00
:: this number needs to be below 8
::
2019-04-12 23:58:37 +03:00
=+ protocol-version=3
2017-04-17 04:52:41 +03:00
|%
2017-10-24 08:17:38 +03:00
+= move [p=duct q=(wind note:able gift:able)] :: local move
:: |pact: internal packet structures
::
++ pact
|%
+$ full [lyf=[to=life from=life] law=(unit deed) txt=@]
+$ open [lyf=[to=~ from=life] law=(unit deed) txt=@]
--
2017-04-17 04:52:41 +03:00
--
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: section 4aA, identity logic ::
:: removed in favor of jael/ethereum ::
2017-04-17 04:52:41 +03:00
::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: section 4aB, packet format ::
::
|%
++ bite :: packet to cake
2019-04-14 02:11:37 +03:00
|= pac=rock
^- (unit cake)
2017-04-17 04:52:41 +03:00
=+ [mag=(end 5 1 pac) bod=(rsh 5 1 pac)]
=+ :* vez=(end 0 3 mag) :: protocol version
chk=(cut 0 [3 20] mag) :: checksum
wix=(bex +((cut 0 [23 2] mag))) :: width of receiver
vix=(bex +((cut 0 [25 2] mag))) :: width of sender
tay=(cut 0 [27 5] mag) :: message type
==
2019-04-14 02:11:37 +03:00
:: XX these packets should be firewalled in vere so that they don't
:: make it into the event log
::
?. =(protocol-version vez) ~
?. =(chk (end 0 20 (mug bod))) ~
%- some
2017-04-17 04:52:41 +03:00
:+ [(end 3 wix bod) (cut 3 [wix vix] bod)]
(kins tay)
(rsh 3 (add wix vix) bod)
::
2017-10-24 08:17:38 +03:00
++ kins |=(tay=@ (snag tay `(list skin)`[%none %open %fast %full ~]))
++ ksin |=(sin=skin `@`?-(sin %none 0, %open 1, %fast 2, %full 3))
2017-04-17 04:52:41 +03:00
++ spit :: cake to packet
2017-10-24 08:17:38 +03:00
|= kec=cake ^- @
2017-04-17 04:52:41 +03:00
=+ wim=(met 3 p.p.kec)
=+ dum=(met 3 q.p.kec)
=+ yax=?:((lte wim 2) 0 ?:((lte wim 4) 1 ?:((lte wim 8) 2 3)))
=+ qax=?:((lte dum 2) 0 ?:((lte dum 4) 1 ?:((lte dum 8) 2 3)))
=+ wix=(bex +(yax))
=+ vix=(bex +(qax))
=+ bod=:(mix p.p.kec (lsh 3 wix q.p.kec) (lsh 3 (add wix vix) r.kec))
=+ tay=(ksin q.kec)
%+ mix
%+ can 0
:~ [3 protocol-version]
2017-04-17 04:52:41 +03:00
[20 (mug bod)]
[2 yax]
[2 qax]
[5 tay]
2016-11-24 07:25:07 +03:00
==
2017-04-17 04:52:41 +03:00
(lsh 5 1 bod)
--
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: section 4aC, PKI engine ::
2016-11-24 07:25:07 +03:00
::
2017-04-17 04:52:41 +03:00
|%
++ go :: go
2017-10-24 08:17:38 +03:00
|_ ton=town :: ames state
2017-04-17 04:52:41 +03:00
++ as :: as:go
2018-12-12 22:37:04 +03:00
|_ our=ship :: per server
2017-04-17 04:52:41 +03:00
++ lax :: lax:as:go
2017-10-24 08:17:38 +03:00
|_ [her=ship dur=dore] :: per client
2017-04-17 04:52:41 +03:00
++ cluy :: cluy:lax:as:go
2018-09-13 08:48:18 +03:00
^- [lyf=life cub=acru] :: client crypto
?> ?=(^ lew.wod.dur)
[life.u.lew.wod.dur (com:nu:crub:crypto pass.u.lew.wod.dur)]
2016-11-24 07:25:07 +03:00
::
2017-04-17 04:52:41 +03:00
++ clon
^- life
:: if we don't have a +deed for :her, we guess 1
2018-09-13 08:48:18 +03:00
::
?~(lew.wod.dur 1 life.u.lew.wod.dur)
2017-04-17 04:52:41 +03:00
::
++ griz :: griz:lax:as:go
2017-10-24 08:17:38 +03:00
|= now=@da :: generate key for
^- [p=code q=_+>]
2017-04-17 04:52:41 +03:00
=+ key=(shas %enty (mix now any.ton))
:- key
%= +>.$
any.ton (shax (mix now any.ton))
heg.caq.dur (~(put by heg.caq.dur) (shaf %hand key) key)
==
::
++ pode :: pode:lax:as:go
2017-10-24 08:17:38 +03:00
|= now=@da :: timeout route
2017-04-17 04:52:41 +03:00
^+ +>
?: (lth her 256) +>(lun.wod.dur [~ %if ~2000.1.1 0 (mix her .0.0.1.0)])
2017-04-17 04:52:41 +03:00
+>(lun.wod.dur ~)
::
++ kuch :: kuch:lax:as:go
2017-10-24 08:17:38 +03:00
|= had=hand :: hear key tag
^- (unit [code _+>])
2017-04-17 04:52:41 +03:00
=+ wey=(~(get by heg.caq.dur) had)
?^ wey
=+ key=u.wey
:+ ~ key
%= ..kuch
yed.caq.dur [~ had u.wey]
heg.caq.dur (~(del by heg.caq.dur) had)
qim.caq.dur (~(put by qim.caq.dur) had key)
==
=+ dyv=(~(get by qim.caq.dur) had)
2013-09-29 00:21:18 +04:00
?~ dyv ~
2017-04-17 04:52:41 +03:00
[~ u.dyv ..kuch]
::
++ wasc :: wasc:lax:as:go
2017-10-24 08:17:38 +03:00
|= key=code :: hear foreign code
2017-04-17 04:52:41 +03:00
^+ +>
=+ had=(shaf %hand key)
%_ ..wasc
yed.caq.dur [~ had key]
qim.caq.dur (~(put by qim.caq.dur) had key)
==
::
++ wast :: wast:lax:as:go
2017-10-24 08:17:38 +03:00
|= ryn=lane :: set route
2017-04-17 04:52:41 +03:00
^+ +>
%= +>
lun.wod.dur
2017-10-24 08:17:38 +03:00
?: ?=([%ix *] ryn)
2017-10-24 07:48:07 +03:00
?: ?| ?=(~ lun.wod.dur)
2017-10-24 08:17:38 +03:00
?=([%ix *] u.lun.wod.dur)
?& ?=([%if *] u.lun.wod.dur)
2017-04-17 04:52:41 +03:00
(gth p.ryn (add ~s10 p.u.lun.wod.dur))
==
==
[~ ryn]
lun.wod.dur
[~ ryn]
==
::
++ wist :: wist:lax:as:go
2017-10-24 08:17:38 +03:00
|= $: now=@da :: route via
waz=(list @p)
ryn=(unit lane)
pac=rock
2017-04-17 04:52:41 +03:00
==
^- (list boon)
?: =(our her) [[%ouzo *lane pac] ~]
?~ waz ~
=+ dyr=?:(=(her i.waz) dur (gur i.waz))
?. ?& !=(our i.waz)
?=(^ lun.wod.dyr)
==
$(waz t.waz)
2017-10-24 07:48:07 +03:00
:_ ?: ?=(%ix -.u.lun.wod.dyr)
2017-04-17 04:52:41 +03:00
$(waz t.waz)
~
:+ %ouzo u.lun.wod.dyr
?: &(=(i.waz her) =(~ ryn)) pac
=+ mal=(jam `meal`[%fore her ryn pac])
%- spit
^- cake
:* [our i.waz]
?~ yed.caq.dyr [%none mal]
:- %fast
%^ cat 7
p.u.yed.caq.dyr
(en:crub:crypto q.u.yed.caq.dyr mal)
2017-04-17 04:52:41 +03:00
==
::
++ zuul :: zuul:lax:as:go
|= [now=@da seg=ship ham=meal] :: encode message
2017-10-24 08:17:38 +03:00
^- [p=(list rock) q=_+>]
2017-04-17 04:52:41 +03:00
=< weft
|%
2017-06-06 23:23:58 +03:00
++ wasp :: null security
2017-10-24 08:17:38 +03:00
^-([p=skin q=@] [%none (jam ham)])
2017-06-06 23:23:58 +03:00
::
2017-04-17 04:52:41 +03:00
++ weft :: fragment message
2017-10-24 08:17:38 +03:00
^- [p=(list rock) q=_+>.$]
2017-06-06 23:23:58 +03:00
=^ gim ..weft wisp
:_ +>.$
2017-04-17 04:52:41 +03:00
^- (list rock)
2018-09-13 08:48:18 +03:00
=+ wit=(met 13 q.gim)
2017-04-17 04:52:41 +03:00
?< =(0 wit)
2017-06-06 23:23:58 +03:00
?: =(1 wit)
2017-04-17 04:52:41 +03:00
=+ yup=(spit [our her] p.gim q.gim)
[yup ~]
2018-09-13 08:48:18 +03:00
=+ ruv=(rip 13 q.gim)
2013-09-29 00:21:18 +04:00
=+ gom=(shaf %thug q.gim)
2017-04-17 03:12:12 +03:00
=+ inx=0
2017-04-17 04:52:41 +03:00
|- ^- (list rock)
?~ ruv ~
=+ ^= vie
%+ spit
[our her]
2013-09-29 00:21:18 +04:00
wasp(ham [%carp (ksin p.gim) inx wit gom i.ruv])
2017-04-17 04:52:41 +03:00
:- vie
$(ruv t.ruv, inx +(inx))
::
++ wisp :: generate message
2017-10-24 08:17:38 +03:00
^- [[p=skin q=@] q=_..wisp]
2017-04-17 04:52:41 +03:00
?: =(%carp -.ham)
2017-06-06 23:23:58 +03:00
[wasp ..wisp]
2017-04-17 04:52:41 +03:00
?: !=(~ yed.caq.dur)
?> ?=(^ yed.caq.dur)
2017-06-06 23:23:58 +03:00
:_ ..wisp
2017-04-17 04:52:41 +03:00
:- %fast
%^ cat 7
p.u.yed.caq.dur
2018-09-13 08:48:18 +03:00
(en:cub:cluy q.u.yed.caq.dur (jam ham))
2017-06-06 23:23:58 +03:00
?: &(=(~ lew.wod.dur) =(%back -.ham))
[wasp ..wisp]
:: we include our deed in asymmetric skins (%open and %full)
:: if we're a comet or moon, or if we're sponsoring her
::
=/ bil=(unit deed)
=/ rac (clan:title our)
?. ?| ?=(?(%earl %pawn) rac)
&(!?=(%czar rac) =(our seg))
==
~
2018-12-12 22:37:04 +03:00
`law.ton
=/ yig sen
=/ hom (jam ham)
2017-04-17 04:52:41 +03:00
?: =(~ lew.wod.dur)
:_ ..wisp
2017-04-17 04:52:41 +03:00
:- %open
%- jam
^- open:pact
:+ [~ lyf.yig]
bil
2018-09-13 08:48:18 +03:00
(sign:as:cub.yig hom)
=/ cay cluy
:: :tuy: symmetric key proposal
::
=^ tuy +>.$ (griz now)
:_ ..wisp
2017-04-17 04:52:41 +03:00
:- %full
%- jam
^- full:pact
:+ [lyf.cay lyf.yig]
bil
(seal:as:cub.yig pub:ex:cub.cay (jam tuy hom))
2017-04-17 04:52:41 +03:00
-- :: --zuul:lax:as:go
-- :: --lax:as:go
::
2014-07-21 07:15:02 +04:00
++ gur :: default dore
2017-10-24 08:17:38 +03:00
|= her=ship
2014-07-21 07:15:02 +04:00
^- dore
2017-04-17 04:52:41 +03:00
=+ def=?.((lth her 256) ~ [~ %if ~2000.1.1 0 (mix her .0.0.1.0)])
2018-09-13 08:48:18 +03:00
[[~2100.1.1 def ~] *clot]
2017-04-17 04:52:41 +03:00
::
2014-07-21 07:15:02 +04:00
++ myx :: dore by ship
2017-10-24 08:17:38 +03:00
|= her=ship
2017-04-17 04:52:41 +03:00
^+ lax
2018-08-02 03:52:24 +03:00
=/ fod=dore
2018-12-12 22:37:04 +03:00
(fall (~(get by hoc.ton) her) (gur her))
2018-08-02 03:52:24 +03:00
~(. lax [her fod])
2017-04-17 04:52:41 +03:00
::
2014-07-21 07:15:02 +04:00
++ nux :: install dore
2017-10-24 08:17:38 +03:00
|= new=_lax
2017-04-17 04:52:41 +03:00
^+ +>
2018-12-12 22:37:04 +03:00
+>(hoc.ton (~(put by hoc.ton) her.new dur.new))
2017-04-17 04:52:41 +03:00
::
++ sen :: current crypto
2018-09-13 08:48:18 +03:00
^- [lyf=life cub=acru]
2018-12-12 22:37:04 +03:00
?~(val.ton !! [p.i.val.ton r.i.val.ton])
2017-04-17 04:52:41 +03:00
::
++ sev :: crypto by life
2017-10-24 08:17:38 +03:00
|= mar=life
^- [p=? q=acru]
2018-12-12 22:37:04 +03:00
?~ val.ton !!
?: =(mar p.i.val.ton)
[& r.i.val.ton]
?> (lth mar p.i.val.ton)
2017-04-17 04:52:41 +03:00
:- |
|- ^- acru
2018-12-12 22:37:04 +03:00
?> ?=(^ t.val.ton)
?: =(mar p.i.t.val.ton)
r.i.t.val.ton
$(t.val.ton t.t.val.ton)
2017-04-17 04:52:41 +03:00
-- :: --as:go
::
++ su :: install safe
2018-12-12 22:37:04 +03:00
|=(new=_as `town`ton.new)
2017-04-17 04:52:41 +03:00
::
++ ti :: expire by time
2017-10-24 08:17:38 +03:00
|= now=@da
2017-04-17 04:52:41 +03:00
^- town
!!
::
++ us :: produce safe
2018-12-12 22:37:04 +03:00
|=(our=ship `_as`~(. as our))
2017-04-17 04:52:41 +03:00
-- :: --go
--
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2013-09-29 00:21:18 +04:00
:: section 4aF, packet pump ::
|%
++ pu :: packet pump
|_ shed
++ abet +<
++ ahoy :: ahoy:pu
^+ . :: initialize
%_ .
rtt ~s1
rto ~s4
rtn ~
rue ~
nus 0
nif 0
nep 0
caw 2
cag 64
diq ~
pyz ~
puq ~
==
::
++ bick :: bick:pu
2017-10-24 08:17:38 +03:00
|= [now=@da fap=flap] :: ack by hash
^- [[p=(unit soup) q=(list rock)] _+>]
2013-09-29 00:21:18 +04:00
=+ sun=(~(get by diq) fap)
?~ sun
:: ~& [%bick-none `@p`(mug fap)] :: not a real error
[[~ ~] +>.$]
:: ~& [%bick-good `@p`(mug fap) u.sun]
=. diq (~(del by diq) fap)
=^ gub +>.$ (bock now u.sun)
=^ yop +>.$ (harv now)
[[gub yop] +>.$]
::
++ bilk :: bilk:pu
2017-10-24 08:17:38 +03:00
|= now=@da :: inbound packet
2013-09-29 00:21:18 +04:00
^+ +>
=+ trt=(mul 2 rtt)
%= +>.$
rue [~ now]
rto trt
rtn ?~(puq ~ [~ (add now trt)])
==
::
2013-10-09 22:55:23 +04:00
++ boom :: boom:pu
2017-10-24 08:17:38 +03:00
|= now=@da ^- ? :: address timeout
2017-10-24 07:48:07 +03:00
|(?=(~ rue) (gte (sub now u.rue) ~m1))
2013-10-09 22:55:23 +04:00
::
2013-09-29 00:21:18 +04:00
++ bust :: bust:pu
^- ? :: not responding
&(?=(^ rtn) (gte rto ~s16))
::
++ bike :: bike:pu
^+ . :: check stats
?> .= nif
|- ^- @
?~ puq 0
:(add !liv.q.n.puq $(puq l.puq) $(puq r.puq))
.
::
++ beet :: beet:pu
^+ . :: advance unacked
=- +(nep ?~(foh nus u.foh))
^= foh
2015-12-06 00:01:00 +03:00
|- ^- (unit @ud)
2013-09-29 00:21:18 +04:00
?~ puq ~
?: (lte p.n.puq nep) $(puq l.puq)
=+ rig=$(puq r.puq)
?^(rig rig [~ p.n.puq])
::
++ bine :: bine:pu
2017-10-24 08:17:38 +03:00
|= [now=@da num=@ud] :: apply ack
^- [(unit soup) _+>]
2013-09-29 00:21:18 +04:00
?~ puq !!
?. =(num p.n.puq)
?: (gth num p.n.puq)
=+ lef=$(puq l.puq)
[-.lef +.lef(puq [n.puq puq.lef r.puq])]
=+ rig=$(puq r.puq)
[-.rig +.rig(puq [n.puq l.puq puq.rig])]
=: rtt ?. &(liv.q.n.puq =(1 nux.q.n.puq)) rtt
=+ gap=(sub now lys.q.n.puq)
:: ~& [%bock-trip num (div gap (div ~s1 1.000))]
(div (add (mul 2 rtt) gap) 3)
nif (sub nif !liv.q.n.puq)
==
=+ lez=(dec (need (~(get by pyz) gom.q.n.puq)))
=^ gub pyz
?: =(0 lez)
2013-09-29 00:21:18 +04:00
[[~ gom.q.n.puq] (~(del by pyz) gom.q.n.puq)]
[~ (~(put by pyz) gom.q.n.puq lez)]
:- gub
+>.$(puq ~(nap to puq))
::
++ bock :: bock:pu
2017-10-24 08:17:38 +03:00
|= [now=@da num=@ud] :: ack by sequence
^- [(unit soup) _+>]
2013-09-29 00:21:18 +04:00
=^ gym +> (bine now num)
:- gym
?: (gth num nep)
=+ cam=(max 2 (div caw 2))
2013-09-29 00:21:18 +04:00
:: ~& [%bock-hole num nep cam]
beet:(wept(nep num, cag cam, caw cam) nep num)
=. caw ?: (lth caw cag) +(caw)
(add caw !=(0 (mod (mug now) caw)))
?: =(num nep)
2013-09-29 00:21:18 +04:00
:: ~& [%bock-fine num nif caw cag]
beet
:: ~& [%bock-fill num nif caw cag]
+>.$
2013-09-29 00:21:18 +04:00
::
++ harv :: harv:pu
2017-10-24 08:17:38 +03:00
|= now=@da :: harvest queue
^- [(list rock) _+>]
2013-09-29 00:21:18 +04:00
?: =(~ puq) [~ +>(rtn ~)]
?. (gth caw nif) [~ +>]
=+ wid=(sub caw nif)
2017-10-24 08:17:38 +03:00
=| rub=(list rock)
2013-09-29 00:21:18 +04:00
=< abet =< apse
|%
++ abet
2013-09-29 00:21:18 +04:00
?~ rub [~ +>.$]
[(flop rub) +>.$(rtn [~ (add rto now)])]
::
++ apse
^+ .
?~ puq .
?: =(0 wid) .
=> rigt =< left
2013-12-24 00:49:15 +04:00
?> ?=(^ puq)
2013-09-29 00:21:18 +04:00
?: =(0 wid) .
?. =(| liv.q.n.puq) .
:: ~& [%harv nux.q.n.puq p.n.puq]
%_ .
wid (dec wid)
rub [pac.q.n.puq rub]
nif +(nif)
liv.q.n.puq &
nux.q.n.puq +(nux.q.n.puq)
lys.q.n.puq now
==
::
++ left
2013-12-24 00:49:15 +04:00
?> ?=(^ puq)
^+(. =+(lef=apse(puq l.puq) lef(puq [n.puq puq.lef r.puq])))
++ rigt
2013-12-24 00:49:15 +04:00
?> ?=(^ puq)
^+(. =+(rig=apse(puq r.puq) rig(puq [n.puq l.puq puq.rig])))
2013-09-29 00:21:18 +04:00
--
::
++ wack :: wack:pu
2017-10-24 08:17:38 +03:00
|= now=@da :: wakeup (timeout)
^- [(list rock) _+>]
2013-12-24 00:49:15 +04:00
?. &(!=(~ rtn) ?>(?=(^ rtn) (gte now u.rtn))) [~ +>]
2013-09-29 00:21:18 +04:00
:: ~& [%slow (div rto (div ~s1 1.000))]
=. +> (wept 0 nus)
?> =(0 nif)
=: caw 2
rto ;: min
(mul 2 rto)
2017-05-16 23:56:54 +03:00
~m2
(mul ~s16 ?~(rue 1 +((div (sub now u.rue) ~d1))))
2013-09-29 00:21:18 +04:00
==
==
(harv now)
::
++ wept :: wept:pu
2017-10-24 08:17:38 +03:00
|= [fip=@ud lap=@ud] :: fip thru lap-1
2013-09-29 00:21:18 +04:00
=< abet =< apse
|%
++ abet +>.$
++ apse
^+ .
?~ puq .
?: (lth p.n.puq fip) ?~(l.puq . left)
?: (gte p.n.puq lap) ?~(r.puq . rigt)
=> rigt =< left
2013-12-24 00:49:15 +04:00
?> ?=(^ puq)
2013-09-29 00:21:18 +04:00
?.(liv.q.n.puq . .(nif (dec nif), liv.q.n.puq |))
::
++ left
2013-12-24 00:49:15 +04:00
?> ?=(^ puq)
^+(. =+(lef=apse(puq l.puq) lef(puq [n.puq puq.lef r.puq])))
++ rigt
2013-12-24 00:49:15 +04:00
?> ?=(^ puq)
^+(. =+(rig=apse(puq r.puq) rig(puq [n.puq l.puq puq.rig])))
2013-09-29 00:21:18 +04:00
--
::
++ whap :: whap:pu
2017-10-24 08:17:38 +03:00
|= [now=@da gom=soup wyv=(list rock)] :: send a message
^- [(list rock) _+>]
2013-09-29 00:21:18 +04:00
=. pyz (~(put by pyz) gom (lent wyv))
=. +>
|- ^+ +>.^$
?~ wyv +>.^$
%= $
wyv t.wyv
nus +(nus)
diq (~(put by diq) (shaf %flap i.wyv) nus)
puq (~(put to puq) [nus `soul`[gom 0 | ~2000.1.1 i.wyv]])
==
(harv now)
--
--
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2017-04-17 04:52:41 +03:00
:: section 4aG, protocol engine ::
::
|%
++ am :: am
2018-12-08 01:45:55 +03:00
~% %ames-am ..is ~
|_ [our=ship now=@da fox=fort ski=sley] :: protocol engine
2019-01-12 01:31:29 +03:00
:: +deed-scry: for a +deed at a +life
::
2019-01-12 01:31:29 +03:00
++ deed-scry
~/ %deed-scry
|= [who=ship lyf=life]
2019-01-12 01:31:29 +03:00
^- (unit deed)
2018-12-19 22:36:05 +03:00
=; ded
?~(ded ~ u.ded)
2019-01-12 01:31:29 +03:00
;; (unit (unit deed))
2018-12-11 00:22:56 +03:00
%- (sloy-light ski)
=/ pur=spur
/(scot %ud lyf)/(scot %p who)
2018-12-11 00:22:56 +03:00
[[151 %noun] %j our %deed da+now pur]
:: +life-scry: for a +life
::
++ life-scry
~/ %life-scry
|= who=ship
^- (unit life)
=; lyf
?~(lyf ~ u.lyf)
;; (unit (unit life))
%- (sloy-light ski)
=/ pur=spur
/(scot %p who)
[[151 %noun] %j our %life da+now pur]
2019-01-12 01:31:29 +03:00
:: +sein-scry: for sponsor
::
2019-01-12 01:31:29 +03:00
++ sein-scry
2018-12-08 01:45:55 +03:00
~/ %sein
|= who=ship
;; ship
%- need %- need
2018-12-11 00:22:56 +03:00
%- (sloy-light ski)
[[151 %noun] %j our %sein da+now /(scot %p who)]
2019-01-12 01:31:29 +03:00
:: +saxo-scry: for sponsorship chain
::
2019-01-12 01:31:29 +03:00
++ saxo-scry
2018-12-08 01:45:55 +03:00
~/ %saxo
|= who=ship
;; (list ship)
%- need %- need
2018-12-11 00:22:56 +03:00
%- (sloy-light ski)
[[151 %noun] %j our %saxo da+now /(scot %p who)]
:: +turf-scry: for network domains
::
++ turf-scry
~/ %turf
;; (list turf)
%- need %- need
%- (sloy-light ski)
[[151 %noun] %j our %turf da+now ~]
::
++ vein :: vein:am
2018-12-08 01:45:55 +03:00
~/ %vein
|= [=life vein=(map life ring)] :: new private keys
^- fort
::
?. ?& (~(has by vein) life)
=(life (roll ~(tap in ~(key by vein)) max))
==
~| [%vein-mismatch +<] !!
2018-12-12 22:37:04 +03:00
%= fox
hoc.ton
:: reset connections
::
(~(run by hoc.ton.fox) |=(=dore dore(caq *clot)))
::
2018-12-12 22:37:04 +03:00
seh.ton
:: reset symmetric key cache
::
~
::
:: save our secrets, ready for action
2018-12-12 22:37:04 +03:00
law.ton
:: save our deed (for comet/moon communication)
::
2019-01-12 01:31:29 +03:00
(need (deed-scry our life))
::
2018-12-12 22:37:04 +03:00
val.ton
:: save our secrets, ready for action
::
^- wund
%+ turn
%+ sort
~(tap by vein)
|= [a=[=^life =ring] b=[=^life =ring]]
(gth life.a life.b)
|= [=^life =ring]
[life ring (nol:nu:crub:crypto ring)]
==
::
2017-04-17 04:52:41 +03:00
++ gnaw :: gnaw:am
2018-12-08 01:45:55 +03:00
~/ %gnaw
2017-10-24 08:17:38 +03:00
|= [kay=cape ryn=lane pac=rock] :: process packet
^- [p=(list boon) q=fort]
2019-04-14 02:11:37 +03:00
=/ kec=(unit cake) (bite pac)
?~ kec [~ fox]
?: (goop p.p.u.kec)
[~ fox]
2019-04-14 02:11:37 +03:00
?. =(our q.p.u.kec)
2017-04-17 04:52:41 +03:00
[~ fox]
=; zap=[p=(list boon) q=fort]
[(weld p.zap next) q.zap]
2017-04-17 04:52:41 +03:00
=< zork
2013-09-29 00:21:18 +04:00
=< zank
2019-04-14 02:11:37 +03:00
:: ~& [%hear p.p.u.kec ryn `@p`(mug (shaf %flap pac))]
%- ~(chew la:(ho:um p.p.u.kec) kay ryn %none (shaf %flap pac))
[q.u.kec r.u.kec]
2017-04-17 04:52:41 +03:00
::
++ goop :: blacklist
2017-10-24 08:17:38 +03:00
|= him=ship
2017-04-17 04:52:41 +03:00
|
::
++ kick :: kick:am
2017-10-24 08:17:38 +03:00
|= hen=duct :: refresh net
^- [p=(list boon) q=fort]
zork:(kick:um hen)
2017-04-17 04:52:41 +03:00
::
++ next
^- (list boon)
=/ doz=(unit @da) [~ (add now ~s32)]
=. doz
|- ^+ doz
2018-12-12 22:37:04 +03:00
?~ wab.zac.fox doz
=. doz $(wab.zac.fox l.wab.zac.fox)
=. doz $(wab.zac.fox r.wab.zac.fox)
=+ bah=q.n.wab.zac.fox
(hunt lth doz rtn.sop.bah)
=/ nex (hunt lth doz tim.fox)
?: =(tim.fox nex)
~
[%pito (need nex)]~
::
2014-07-24 06:02:50 +04:00
++ rack :: rack:am
2018-12-08 01:45:55 +03:00
~/ %rack
|= [her=ship cha=path cop=coop] :: e2e ack
=/ oh (ho:um her)
2014-11-26 04:02:48 +03:00
=^ gud oh (cook:oh cop cha ~)
?. gud oh
2014-07-24 06:02:50 +04:00
(cans:oh cha)
2017-04-17 04:52:41 +03:00
::
++ wake :: wake:am
2018-12-08 01:45:55 +03:00
~/ %wake
2017-10-24 08:17:38 +03:00
|= hen=duct :: harvest packets
^- [p=(list boon) q=fort]
=. tim.fox ~
2018-12-12 22:37:04 +03:00
=/ neb=(list ship) ~(tap in ~(key by wab.zac.fox))
2017-10-24 08:17:38 +03:00
=| bin=(list boon)
|- ^- [p=(list boon) q=fort]
2018-12-12 22:37:04 +03:00
?~ neb
2013-10-09 22:55:23 +04:00
=^ ban fox (kick hen)
[:(weld bin p.ban next) fox]
2019-01-19 03:02:34 +03:00
=/ fro=(list ship) (saxo-scry our)
2019-01-19 03:10:24 +03:00
=/ hoz (ho:um i.neb)
=^ bun fox zork:zank:(thaw:hoz fro)
2018-12-12 22:37:04 +03:00
$(neb t.neb, bin (weld p.bun bin))
2017-04-17 04:52:41 +03:00
::
++ wise :: wise:am
|= [hen=duct her=ship cha=path val=*] :: send a statement
2017-10-24 08:17:38 +03:00
^- [p=(list boon) q=fort]
=^ ban fox zork:zank:(wool:(ho:um her) hen cha val)
[(weld p.ban next) fox]
2017-04-17 04:52:41 +03:00
::
++ um :: per server
2018-12-12 22:37:04 +03:00
=/ gus (~(us go ton.fox) our)
=/ weg=corn zac.fox
2017-10-24 08:17:38 +03:00
=| bin=(list boon)
2017-04-17 04:52:41 +03:00
|%
++ ho :: ho:um:am
2017-10-24 08:17:38 +03:00
|= her=ship :: per friend
2017-04-17 04:52:41 +03:00
=+ diz=(myx:gus her)
=+ bah=(~(get by wab.weg) her)
2013-09-29 00:21:18 +04:00
=+ puz=?~(bah ahoy:pu %*(. pu +< sop.u.bah))
=> .(bah `bath`?~(bah [abet:puz ~ ~] u.bah))
2017-04-17 04:52:41 +03:00
|%
++ busk :: busk:ho:um:am
2017-10-24 08:17:38 +03:00
|= [waz=(list ship) pax=(list rock)] :: send packets
2017-04-17 04:52:41 +03:00
%_ +>
bin
|- ^+ bin
2013-09-29 00:21:18 +04:00
?~ pax bin
$(pax t.pax, bin (weld (flop (wist:diz now waz ~ i.pax)) bin))
2017-04-17 04:52:41 +03:00
==
::
2014-07-24 06:02:50 +04:00
++ cans :: cans:ho:um:am
2017-10-24 08:17:38 +03:00
|= cha=path
2014-07-24 06:02:50 +04:00
=+ rum=(need (~(get by raz.bah) cha))
=. rum
%= rum
did +(did.rum)
2014-07-26 06:10:24 +04:00
mis (~(del by mis.rum) did.rum)
2014-07-24 06:02:50 +04:00
==
(coat cha rum)
::
++ coat :: coat:ho:um:am
2017-10-24 08:17:38 +03:00
|= [cha=path rum=race] :: update input race
2017-04-17 04:52:41 +03:00
^+ +>
2014-07-24 06:02:50 +04:00
=+ cun=(~(get by mis.rum) did.rum)
2017-10-24 07:48:07 +03:00
?: |(!dod.rum ?=(~ cun))
::
:: if we have not yet received the current message,
:: or if we are not idle, just wait.
::
2014-07-24 06:02:50 +04:00
+>.$(raz.bah (~(put by raz.bah) cha rum))
?. =(%good p.u.cun)
::
:: if we are recording a failed message, acknowledge
:: it now, since it obviously won't be processed.
::
~& [%fail-ack did.rum]
2018-02-22 21:11:59 +03:00
=^ gud +>.$
(cook ``[%dead-message ~] cha `[q.u.cun r.u.cun])
?. gud +>.$
%= +>.$
raz.bah
%+ ~(put by raz.bah) cha
%= rum
did +(did.rum)
mis (~(del by mis.rum) did.rum)
==
==
2017-04-17 04:52:41 +03:00
::
:: the message is good. send it to be processed.
2017-04-17 04:52:41 +03:00
::
2014-07-26 06:10:24 +04:00
?> ?=(^ s.u.cun)
%= +>.$
raz.bah (~(put by raz.bah) cha rum(dod |))
2014-07-24 06:02:50 +04:00
bin
:_ bin
:^ %milk
2018-12-12 23:07:16 +03:00
her
2018-09-13 08:48:18 +03:00
`soap`[[lyf:sen:gus clon:diz] cha did.rum]
2014-07-26 06:10:24 +04:00
u.s.u.cun
2017-04-17 04:52:41 +03:00
==
::
2014-07-24 06:02:50 +04:00
++ cook :: cook:ho:um:am
2017-10-24 08:17:38 +03:00
|= [cop=coop cha=path ram=(unit [ryn=lane dam=flap])]
^- [gud=? con=_+>] :: acknowledgment
2017-10-10 08:22:47 +03:00
:: ~& [%ames-cook cop cha ram]
2014-07-24 06:02:50 +04:00
=+ rum=(need (~(get by raz.bah) cha))
=+ lat=(~(get by mis.rum) did.rum)
2017-10-24 07:48:07 +03:00
?: &(?=(~ lat) ?=(~ ram))
2014-11-26 04:02:48 +03:00
~& %ack-late-or-redundant
[%| +>.$]
:- %&
2017-10-24 08:17:38 +03:00
=+ ^- [ryn=lane dam=flap]
2014-07-26 06:10:24 +04:00
?^ ram [ryn.u.ram dam.u.ram]
2017-10-24 07:48:07 +03:00
?< ?=(~ lat)
[q r]:u.lat
2014-07-26 06:10:24 +04:00
=. raz.bah
2014-08-01 06:44:49 +04:00
?^ ram raz.bah
2014-07-26 06:10:24 +04:00
%+ ~(put by raz.bah) cha
2014-08-01 06:44:49 +04:00
rum(dod &, bum ?~(cop bum.rum (~(put by bum.rum) did.rum u.cop)))
2019-01-12 01:31:29 +03:00
=/ seg (sein-scry her)
=^ roc diz (zuul:diz now seg [%back cop dam ~s0])
2019-01-19 03:02:34 +03:00
=/ fro=(list ship) (saxo-scry our)
(busk(diz (wast:diz ryn)) (xong fro) roc)
:: XX move this logic into %zuse, namespaced under %jael?
::
++ deng :: deng:ho:um:am
2019-01-12 01:31:29 +03:00
|= law=(unit deed) :: accept inline deed
^+ diz
?: |(=(~ law) =(lew.wod.dur.diz law))
diz
~| [%deng-fail her]
?> ?=(^ law)
=* wed u.law
?> ^- ?
?- (clan:title her)
%earl
:: signed by parent
::
=/ seg (^sein:title her)
=/ yig
?: =(our seg)
sen:gus
cluy:(myx:gus seg)
?& =(lyf.yig life.wed)
?=(^ oath.wed)
.= (need (sure:as:cub.yig u.oath.wed))
(shaf %earl (sham [her life.wed pass.wed]))
==
::
%pawn
:: self-signed, life 1, address is fingerprint
::
=/ cub=acru (com:nu:crub:crypto pass.wed)
?& =(`@`fig:ex:cub her)
?=(%1 life.wed)
?=(^ oath.wed)
:: XX do we care about this signature at all?
::
.= (need (sure:as:cub u.oath.wed))
(shaf %self (sham [her life.wed pass.wed]))
==
::
*
:: our sponsor
::
?& !?=(%czar (clan:title our))
2019-01-12 01:31:29 +03:00
=(her (sein-scry our))
==
==
diz(lew.wod.dur law)
2017-04-17 04:52:41 +03:00
::
2013-09-29 00:21:18 +04:00
++ done :: done:ho:um:am
2017-10-24 08:17:38 +03:00
|= [cha=path num=@ud] :: complete outgoing
^- [(unit duct) _+>]
2017-10-10 08:22:47 +03:00
:: ~& [%ames-done cha num]
2013-09-29 00:21:18 +04:00
=+ rol=(need (~(get by ryl.bah) cha))
=+ rix=(~(get by san.rol) num)
?~ rix [~ +>.$]
:- rix
%_ +>.$
ryl.bah
2013-09-29 00:21:18 +04:00
(~(put by ryl.bah) cha rol(san (~(del by san.rol) num)))
==
2017-04-17 04:52:41 +03:00
::
2013-09-29 00:21:18 +04:00
++ la :: la:ho:um:am
2017-10-24 08:17:38 +03:00
|_ [kay=cape ryn=lane aut=skin dam=flap] :: per packet
2017-04-17 04:52:41 +03:00
::
2013-09-29 00:21:18 +04:00
++ chew :: chew:la:ho:um:am
2017-10-24 08:17:38 +03:00
|= [sin=skin msg=@] :: receive
2013-09-29 00:21:18 +04:00
^+ +>
=< abed
|%
:: +abed: check that we have the keys to communicate with :her
::
++ abed
2013-09-29 00:21:18 +04:00
^+ +>.$
:: if we don't have a deed, subscribe for public key updates
::
:: XX update state so we only ask once?
::
=? +>.$ ?=(~ lew.wod.dur.diz)
(emit %beer her)
:: if we don't have a deed, scry for it
:: (to avoid dropping the packet, if possible).
::
=? lew.wod.dur.diz ?=(~ lew.wod.dur.diz)
=/ life (life-scry her)
?~(life ~ (deed-scry her u.life))
:: if we have a deed, proceed
::
?^ lew.wod.dur.diz
apse
:: if :her is our initial sponsor, proceed (TOFU)
::
:: XX TOFU is unnecessary if we include keys
:: for the full sponsorship chain in the boot event
::
2019-01-12 01:31:29 +03:00
?: =(her (sein-scry our))
apse
:: if :her is a comet, or a moon of a known ship, proceed
::
=/ =rank:title (clan:title her)
?: ?| ?=(%pawn rank)
?& ?=(%earl rank)
2019-01-12 01:31:29 +03:00
!=(~ lew.wod.dur:(myx:gus (sein-scry her)))
== ==
apse
:: otherwise, drop the packet
::
+>.$
:: +apse: process the packet, notify if :her status changed
::
++ apse
^+ +>.$
2018-08-02 03:52:24 +03:00
=/ oub bust:puz
=/ neg =(~ yed.caq.dur.diz)
2013-09-29 00:21:18 +04:00
=. +>.$ east
2018-08-02 03:52:24 +03:00
=/ eng =(~ yed.caq.dur.diz)
=/ bou bust:puz
=? +>.$ &(oub !bou)
2018-12-12 23:07:16 +03:00
(emit [%wine her " is ok"])
2018-09-15 03:29:23 +03:00
:: the presence of a symmetric key indicates neighboring
:: XX use deed instead?
::
2018-08-02 03:52:24 +03:00
=? +>.$ &(neg !eng)
2018-09-15 03:29:23 +03:00
%- emir :~
2018-12-12 23:07:16 +03:00
[%wine her " is your neighbor"]
2018-09-15 03:29:23 +03:00
?> ?=(^ lew.wod.dur.diz)
2018-12-12 23:07:16 +03:00
[%raki her [life pass]:u.lew.wod.dur.diz]
2018-09-15 03:29:23 +03:00
==
2013-09-29 00:21:18 +04:00
+>.$
::
++ east
^+ +>.$
?- sin
2017-10-24 07:48:07 +03:00
%none
2013-09-29 00:21:18 +04:00
:: ~& %chew-none
2013-12-28 05:21:11 +04:00
=. puz (bilk:puz now)
2019-05-09 22:46:19 +03:00
(chow ;;(meal (cue msg)))
2013-09-29 00:21:18 +04:00
::
2017-10-24 07:48:07 +03:00
%fast
2013-09-29 00:21:18 +04:00
:: ~& %chew-fast
=+ [mag=`hand`(end 7 1 msg) bod=(rsh 7 1 msg)]
=/ dey (kuch:diz mag)
:: ignore unknown key
::
?~ dey +>.$
2013-12-28 05:21:11 +04:00
=. puz (bilk:puz now)
2013-09-29 00:21:18 +04:00
=^ key diz u.dey
2019-05-09 22:46:19 +03:00
(chow(aut sin) ;;(meal (cue (dy:cub:sen:gus key bod))))
2013-09-29 00:21:18 +04:00
::
2017-10-24 07:48:07 +03:00
%full
2013-09-29 00:21:18 +04:00
:: ~& %chew-full
2019-05-09 22:46:19 +03:00
=/ mex ;;(full:pact (cue msg))
=. diz (deng law.mex)
=/ wug cluy:diz
?> =(lyf.wug from.lyf.mex)
=/ gey (sev:gus to.lyf.mex)
=/ sem (need (tear:as:q.gey pub:ex:cub.wug txt.mex))
2019-05-09 22:46:19 +03:00
=/ mes ;;((pair @ @) (cue sem))
2013-09-29 00:21:18 +04:00
=. diz (wasc:diz p.mes)
2013-12-28 05:21:11 +04:00
=. puz (bilk:puz now)
(west(msg q.mes))
2013-09-29 00:21:18 +04:00
::
2017-10-24 07:48:07 +03:00
%open
2013-09-29 00:21:18 +04:00
:: ~& %chew-open
2019-05-09 22:46:19 +03:00
=/ mex ;;(open:pact (cue msg))
=. diz (deng law.mex)
=/ wug cluy:diz
?> =(lyf.wug from.lyf.mex)
=/ mes (need (sure:as:cub.wug txt.mex))
2013-12-28 05:21:11 +04:00
=. puz (bilk:puz now)
(west(msg mes))
2013-09-29 00:21:18 +04:00
==
++ west
2017-10-24 07:48:07 +03:00
|= ~
=+ vib=(cue msg)
=+ mal=(meal vib)
?. =(mal vib)
2013-10-08 06:04:08 +04:00
~& [%bad-meal her]
+>.^$
(chow(aut sin) mal)
2013-09-29 00:21:18 +04:00
--
2017-04-17 04:52:41 +03:00
::
++ chow :: chow:la:ho:um:am
2017-10-24 08:17:38 +03:00
|= fud=meal :: interpret meal
2013-09-29 00:21:18 +04:00
^+ +>
=. diz ?:(=(%none aut) diz (wast:diz ryn))
(dine fud)
2017-04-17 04:52:41 +03:00
::
++ cock :: cock:la:ho:um:am
^+ . :: send new ack
2013-09-29 00:21:18 +04:00
:: ~& [%back kay dam]
=* cop `coop`?:(=(%good kay) ~ ``[%dead-packet ~])
2019-01-12 01:31:29 +03:00
=/ seg (sein-scry her)
=^ pax diz (zuul:diz now seg [%back cop dam ~s0])
2019-01-19 03:02:34 +03:00
=/ fro=(list ship) (saxo-scry our)
2019-01-19 03:10:24 +03:00
..cock(+> (busk(diz (wast:diz ryn)) (xong fro) pax))
2017-04-17 04:52:41 +03:00
::
2014-07-24 06:02:50 +04:00
++ deer :: deer:la:ho:um:am
2017-10-24 08:17:38 +03:00
|= [cha=path num=@ud dut=(unit)] :: interpret message
2017-04-17 04:52:41 +03:00
^+ +>
2014-07-26 06:10:24 +04:00
=+ rum=(fall (~(get by raz.bah) cha) *race)
2017-10-24 07:48:07 +03:00
:: ~& [%rx kay cha num [dod.rum did.rum] ?=(~ dut)]
=* bad (~(has in bad.fox) her)
=. kay ?.((~(has in bad.fox) her) kay ~&(%blocked %dead))
2014-07-24 06:02:50 +04:00
%= +>.$
+>
?: (lth num did.rum)
::
:: this message already acknowledged; repeat old ack,
:: or negative ack if this ship is blocked
::
=* cop ^- coop
2018-02-22 21:11:59 +03:00
%+ fall
(~(get by bum.rum) num)
?:(bad ~ ``[%blocked ~])
con:(cook (~(get by bum.rum) num) cha `[ryn dam])
::
:: insert this message in unprocessed set
::
=. mis.rum (~(put by mis.rum) num [kay ryn dam dut])
2018-02-22 21:11:59 +03:00
::
:: if ship is blocked, advance pointer to latest message
::
=. did.rum ?.(bad did.rum num)
::
:: process update
::
(coat cha rum)
2017-04-17 04:52:41 +03:00
==
::
2013-09-29 00:21:18 +04:00
++ dine :: dine:la:ho:um:am
2017-10-24 08:17:38 +03:00
|= fud=meal :: interpret meal
2017-04-17 04:52:41 +03:00
^+ +>
2013-09-29 00:21:18 +04:00
?- -.fud
2017-10-24 07:48:07 +03:00
%back
=. +> ?.(=(%full aut) +> cock) :: finish handshake
2014-07-24 06:02:50 +04:00
+>(..la (tock p.fud q.fud r.fud))
::
2017-10-24 07:48:07 +03:00
%bond
:: ~& [%bond p.fud q.fud]
(deer p.fud q.fud ?-(kay %dead ~, %good [~ r.fud]))
2013-09-29 00:21:18 +04:00
::
2017-10-24 07:48:07 +03:00
%carp
2015-06-07 08:00:18 +03:00
:: =+ zol=(~(get by olz.weg) s.fud)
:: ?^ zol cock(kay u.zol)
2013-09-29 00:21:18 +04:00
=^ neb nys.weg
=+ neb=(~(get by nys.weg) s.fud)
?^ neb [u.neb nys.weg]
=+ neb=`bait`[(kins p.fud) 0 r.fud ~]
[neb (~(put by nys.weg) s.fud neb)]
?> (lth q.fud p.r.neb)
?> =((kins p.fud) p.neb)
?> =(r.fud p.r.neb)
2015-12-06 00:01:00 +03:00
=+ doy=`(unit @)`(~(get by q.r.neb) q.fud)
?^ doy cock
2013-09-29 00:21:18 +04:00
=> ^+ . %= .
q.r.neb (~(put by q.r.neb) q.fud t.fud)
q.neb +(q.neb)
==
:: ~& [%carp q.fud s.fud q.neb p.r.neb]
?: =(q.neb p.r.neb)
=: nys.weg (~(del by nys.weg) s.fud)
2015-06-07 08:00:18 +03:00
:: olz.weg (~(put by olz.weg) s.fud kay)
2013-09-29 00:21:18 +04:00
==
(golf p.neb r.neb)
=. +>.$ cock
2013-09-29 00:21:18 +04:00
+>.$(nys.weg (~(put by nys.weg) s.fud neb))
::
2017-10-24 07:48:07 +03:00
%fore
2013-09-29 00:21:18 +04:00
=+ ^= lyn ^- lane
?~ q.fud ryn
2017-10-24 07:48:07 +03:00
?. ?=(%if -.u.q.fud) u.q.fud
2014-06-04 01:01:40 +04:00
[%ix +.u.q.fud]
2013-09-29 00:21:18 +04:00
:: u.q.fud
?: =(our p.fud)
(emit %mead lyn r.fud)
2018-10-24 23:31:50 +03:00
=/ zid (myx:gus p.fud)
=/ zon %*(xong ..xong her p.fud)
2019-01-19 03:02:34 +03:00
=/ fro=(list ship) (saxo-scry our)
(emir (wist:zid now (zon fro) [~ lyn] r.fud))
2013-09-29 00:21:18 +04:00
==
2017-04-17 04:52:41 +03:00
::
2013-09-29 00:21:18 +04:00
++ emir :: emir:la:ho:um:am
2017-10-24 08:17:38 +03:00
|= ben=(list boon) :: emit boons
2017-04-17 04:52:41 +03:00
^+ +>
2013-09-29 00:21:18 +04:00
?~(ben +> $(ben t.ben, bin [i.ben bin]))
2017-04-17 04:52:41 +03:00
::
2013-09-29 00:21:18 +04:00
++ emit :: emit:la:ho:um:am
2017-10-24 08:17:38 +03:00
|= bun=boon :: emit a boon
+>(bin [bun bin])
2017-04-17 04:52:41 +03:00
::
++ golf :: golf:la:ho:um:am
2017-10-24 08:17:38 +03:00
|= [sin=skin duv=dove] :: assemble fragments
2013-09-29 00:21:18 +04:00
^+ +>
%+ chew sin
2017-04-17 04:52:41 +03:00
=+ [nix=0 rax=*(list @)]
|- ^- @
?: =(p.duv nix)
2018-09-13 08:48:18 +03:00
(can 13 (turn (flop rax) |=(a=@ [1 a])))
2017-04-17 04:52:41 +03:00
$(nix +(nix), rax [(need (~(get by q.duv) nix)) rax])
2013-09-29 00:21:18 +04:00
-- :: --la:ho:um:am
2017-04-17 04:52:41 +03:00
::
++ pong :: pong:ho:um:am
2017-10-24 08:17:38 +03:00
|= hen=duct :: test connection
2017-04-17 04:52:41 +03:00
^+ +>
2013-10-09 22:55:23 +04:00
?. ?& =(~ puq.puz)
?| bust:puz
2017-10-24 07:48:07 +03:00
?=(~ rue.puz)
2013-10-09 22:55:23 +04:00
(gth now (add ~s32 u.rue.puz))
(lth u.rue.puz hop.fox)
==
2017-04-17 04:52:41 +03:00
==
2014-04-23 21:02:36 +04:00
+>.$
2017-10-10 08:22:47 +03:00
(wool [/a/ping hen] /a/pi ~ |)
2013-09-29 00:21:18 +04:00
::
++ thaw :: thaw:ho:um:am
2019-01-19 03:02:34 +03:00
|= fro=(list ship)
^+ +> :: wakeup bomb
2013-09-29 00:21:18 +04:00
=+ oub=bust:puz
=^ yem puz (wack:puz now)
=+ bou=bust:puz
=. bin
?. &(bou !oub) bin
2018-12-12 23:07:16 +03:00
:_(bin [%wine her " not responding still trying"])
=. diz ?:((boom:puz now) (pode:diz now) diz)
2019-01-19 03:02:34 +03:00
(busk (xong fro) yem)
2013-09-29 00:21:18 +04:00
::
2014-07-24 06:02:50 +04:00
++ tock :: tock:ho:um:am
2017-10-24 08:17:38 +03:00
|= [cop=coop fap=flap cot=@dr] :: e2e ack by hash
2014-07-24 06:02:50 +04:00
^+ +>
=^ yoh puz (bick:puz now fap)
=. +>.$
?~ p.yoh +>.$
=^ hud +>.$
(done p.u.p.yoh q.u.p.yoh)
?~ hud +>.$
%= +>.$
bin
:_ bin
2018-12-12 23:07:16 +03:00
`boon`[%cake her [[lyf:sen:gus clon:diz] u.p.yoh] cop u.hud]
2017-04-17 04:52:41 +03:00
==
2019-01-19 03:02:34 +03:00
=/ fro=(list ship) (saxo-scry our)
(busk (xong fro) q.yoh)
2014-07-24 06:02:50 +04:00
::
2013-09-29 00:21:18 +04:00
++ wind :: wind:ho:um:am
2017-10-24 08:17:38 +03:00
|= [gom=soup ham=meal]
2013-09-29 00:21:18 +04:00
:: ~& [%wind her gom]
^+ +>
2019-01-12 01:31:29 +03:00
=/ seg (sein-scry her)
=^ wyv diz (zuul:diz now seg ham)
2013-09-29 00:21:18 +04:00
=^ feh puz (whap:puz now gom wyv)
2019-01-19 03:02:34 +03:00
=/ fro=(list ship) (saxo-scry our)
(busk (xong fro) feh)
2013-09-29 00:21:18 +04:00
::
++ wool :: wool:ho:um:am
2017-10-24 08:17:38 +03:00
|= [hen=duct cha=path val=*] :: send a statement
2013-09-29 00:21:18 +04:00
^+ +>
2018-08-02 03:52:24 +03:00
=/ rol=rill (fall (~(get by ryl.bah) cha) *rill)
=/ sex=@ud sed.rol
2013-11-14 02:41:08 +04:00
:: ~& [%tx [our her] cha sex]
:: if we don't have a public key for :her,
:: subscribe to %jael for keys and proceed
::
:: XX update state so we only ask once?
::
2018-12-12 23:07:16 +03:00
=? bin =(~ lew.wod.dur.diz) :_(bin [%beer her])
:: if we don't have a public key for :her,
:: scry into %jael for them.
:: (skin will only be %open if the scry is ~)
::
=? lew.wod.dur.diz =(~ lew.wod.dur.diz)
=/ life (life-scry her)
?~(life ~ (deed-scry her u.life))
=. ryl.bah
2013-09-29 00:21:18 +04:00
%+ ~(put by ryl.bah) cha
2018-08-02 03:52:24 +03:00
%= rol
sed +(sed.rol)
san (~(put by san.rol) sex hen)
==
2014-07-24 06:02:50 +04:00
%+ wind [cha sex]
[%bond cha sex val]
2013-09-29 00:21:18 +04:00
::
2013-10-08 09:56:57 +04:00
++ zest :: zest:ho:um:am
2013-10-10 06:45:57 +04:00
:~ :~ :* [%rtt rtt.sop.bah]
[%rto rto.sop.bah]
[%rtn rtn.sop.bah]
[%rue rue.sop.bah]
==
:* [%nus nus.sop.bah]
[%nif nif.sop.bah]
[%nep nep.sop.bah]
[%caw caw.sop.bah]
[%cag cag.sop.bah]
==
=+ qup=~(tap to puq.sop.bah)
2013-10-10 06:45:57 +04:00
:- %qup
%+ turn qup
2017-10-24 08:17:38 +03:00
|= [a=@ud b=soul]
:* a
2013-10-10 06:45:57 +04:00
nux.b
liv.b
lys.b
`@p`(mug (shaf %flap pac.b))
gom.b
==
2017-04-17 04:52:41 +03:00
==
2013-10-10 06:45:57 +04:00
::
:- %raz
=+ zar=~(tap by raz.bah)
2013-10-10 06:45:57 +04:00
%+ turn zar
2017-10-24 08:17:38 +03:00
|= [a=path b=race]
2013-10-10 06:45:57 +04:00
:+ a
did.b
=+ ciy=~(tap by mis.b)
2013-10-10 06:45:57 +04:00
%+ turn ciy
2017-10-24 08:17:38 +03:00
|= [c=@ud d=[p=cape q=lane r=flap s=(unit)]]
2014-07-26 06:10:24 +04:00
[c p.d r.d]
2013-10-10 06:45:57 +04:00
::
[%ryl ~(tap to ryl.bah)]
[%lun lun.wod.dur.diz]
2013-10-10 06:45:57 +04:00
[%caq caq.dur.diz]
[%lew lew.wod.dur.diz]
==
2013-10-08 09:56:57 +04:00
::
2013-09-29 00:21:18 +04:00
++ zank :: zank:ho:um:am
%= +>.$ :: resolve
gus (nux:gus diz)
2013-09-29 00:21:18 +04:00
wab.weg (~(put by wab.weg) her bah(sop abet:puz))
==
::
++ xong :: xong:ho:um:am
2019-01-19 03:02:34 +03:00
|= fro=(list ship)
^- (list ship) :: route unto
2019-01-12 01:31:29 +03:00
=/ too (saxo-scry her)
=+ ^= oot ^- (list ship)
=| oot=(list ship)
|- ^+ oot
?~ too ~
?: (lien fro |=(a=ship =(a i.too))) ~
[i.too $(too t.too)]
:: ~& [%xong-to [our her] (weld oot ?>(?=(^ fro) t.fro))]
(weld oot ?>(?=(^ fro) t.fro))
2017-04-17 04:52:41 +03:00
-- :: --ho:um:am
::
++ kick :: kick:um:am
2017-10-24 08:17:38 +03:00
|= hen=duct :: test connection
2017-04-17 04:52:41 +03:00
^+ +>
2019-01-12 01:31:29 +03:00
=/ hoy (tail (saxo-scry our))
2017-04-17 04:52:41 +03:00
|- ^+ +>.^$
?~ hoy
+>.^$
$(hoy t.hoy, +>.^$ (pong i.hoy hen))
::
++ pals :: pals:um:am
^- (list @p) :: active neighbors
%+ turn
%+ skim ~(tap by wab.weg)
2017-10-24 08:17:38 +03:00
|= [a=ship b=bath]
2013-10-10 00:28:49 +04:00
!(~(boom pu sop.b) now)
2017-10-24 08:17:38 +03:00
|=([a=ship b=bath] a)
2017-04-17 04:52:41 +03:00
::
++ pong :: pong:um:am
2017-10-24 08:17:38 +03:00
|= [her=ship hen=duct] :: test neighbor
2017-04-17 04:52:41 +03:00
^+ +>
2013-10-09 22:55:23 +04:00
zank:(pong:(ho her) hen)
2017-04-17 04:52:41 +03:00
::
++ zork :: zork:um:am
2017-10-24 08:17:38 +03:00
^- [p=(list boon) q=fort] :: resolve
2017-04-17 04:52:41 +03:00
:- (flop bin)
%_ fox
ton (~(su go ton.fox) gus)
2018-12-12 22:37:04 +03:00
zac weg
2017-04-17 04:52:41 +03:00
==
-- :: --um:am
-- :: --am
2017-04-17 03:12:12 +03:00
--
. ==
2017-04-17 04:52:41 +03:00
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: section 4aH, protocol vane ::
::
2017-10-24 08:17:38 +03:00
=| $: fox=fort :: kernel state
2017-04-17 04:52:41 +03:00
== ::
2018-12-06 00:41:21 +03:00
|= [our=ship now=@da eny=@uvJ ski=sley] :: current invocation
2017-04-17 04:52:41 +03:00
^? :: opaque core
=<
2018-12-08 01:45:55 +03:00
~% %ames-protocol ..is ~
2017-04-17 04:52:41 +03:00
|% :: vane interface
++ call :: handle request
2018-12-08 01:45:55 +03:00
~/ %call
2017-10-24 08:17:38 +03:00
|= $: hen=duct
2018-12-03 22:45:50 +03:00
type=*
wrapped-task=(hobo task:able)
2017-04-17 04:52:41 +03:00
==
^- [(list move) _..^$]
2018-12-03 22:45:50 +03:00
=/ task=task:able
?. ?=(%soft -.wrapped-task)
wrapped-task
2019-05-09 22:46:19 +03:00
;;(task:able p.wrapped-task)
2018-12-20 08:09:30 +03:00
=. any.ton.fox eny
2018-12-03 22:45:50 +03:00
=^ duy ..knob (knob hen task)
2017-04-17 04:52:41 +03:00
[duy ..^$]
::
++ load
2018-02-22 21:11:59 +03:00
|= old=fort
2017-04-17 04:52:41 +03:00
..^$(fox old)
::
++ scry
2017-10-24 08:17:38 +03:00
|= [fur=(unit (set monk)) ren=@tas why=shop syd=desk lot=coin tyl=path]
2017-04-17 04:52:41 +03:00
^- (unit (unit cage))
2018-03-19 06:54:47 +03:00
?. ?=(%& -.why) [~ ~]
2017-04-17 04:52:41 +03:00
?~ tyl [~ ~]
=+ hun=(slaw %p i.tyl)
?~ hun [~ ~]
?. =(`@`0 ren) ~
?. ?=([$$ %da @] lot)
~
?. =(now q.p.lot) ~
(temp u.hun [syd t.tyl])
2016-11-24 07:25:07 +03:00
::
2017-04-17 04:52:41 +03:00
++ stay fox
++ take :: accept response
2018-12-08 01:45:55 +03:00
~/ %take
2017-10-24 08:17:38 +03:00
|= [tea=wire hen=duct hin=(hypo sign:able)]
^- [(list move) _..^$]
2018-12-20 08:09:30 +03:00
=. any.ton.fox eny
2017-04-17 04:52:41 +03:00
=^ duy ..knap
(knap tea hen q.hin)
[duy ..^$]
2017-04-17 03:12:12 +03:00
--
2018-12-08 01:45:55 +03:00
~% %ames-impl ..is ~
2017-04-17 04:52:41 +03:00
|%
++ clop
2018-12-08 01:45:55 +03:00
~/ %clop
2017-10-24 08:17:38 +03:00
|= [now=@da hen=duct bon=boon]
^- [(list move) fort]
2017-04-17 04:52:41 +03:00
?- -.bon
2017-10-24 07:48:07 +03:00
%beer
2018-12-12 23:07:16 +03:00
=/ =wire /pubs/(scot %p p.bon)
:_ fox [hen [%pass wire %j %pubs p.bon]]~
::
%bock
:: ignore %turf if we haven't yet learned a unix duct
::
:: Only happens during first boot.
::
?~ gad.fox
[~ fox]
:_ fox
[gad.fox %give %turf tuf.fox]~
::
%brew
:_ fox [hen [%pass / %j %turf ~]]~
2017-04-17 04:52:41 +03:00
::
2017-10-24 07:48:07 +03:00
%cake
:: ~? ?=(^ r.bon) [%cake-woot-bad hen r.bon]
2014-07-24 06:02:50 +04:00
:_ fox
2018-12-12 23:07:16 +03:00
:~ [s.bon %give %woot p.bon r.bon]
2014-07-24 06:02:50 +04:00
==
2013-09-29 00:21:18 +04:00
::
%mead
=^ moz +>.$ (knob hen [%hear p.bon q.bon])
[moz fox]
::
2017-10-24 07:48:07 +03:00
%milk
:: ~& [%milk p.bon q.bon]
2017-10-24 08:17:38 +03:00
?> ?=([@ @ *] q.q.bon)
?> ?=(?(%a %c %e %g %j) i.q.q.bon)
2018-12-12 23:07:16 +03:00
=/ =wire [(scot %p our) (scot %p p.bon) q.q.bon]
:_ fox [hen %pass wire i.q.q.bon %west p.bon t.q.q.bon r.bon]~
2013-09-29 00:21:18 +04:00
::
2017-10-24 07:48:07 +03:00
%ouzo
:: drop packet if we haven't yet learned a unix duct
::
:: Only happens during first boot.
::
?~ gad.fox
[~ fox]
2018-02-22 21:11:59 +03:00
:: ~& [%send now p.bon `@p`(mug (shaf %flap q.bon))]
2017-04-17 04:52:41 +03:00
:_ fox
[[gad.fox [%give %send p.bon q.bon]] ~]
::
%pito
:_ fox(tim `p.bon)
2019-02-16 12:34:38 +03:00
%- flop
^- (list move)
:: XX should this be the unix duct (gad.fox)?
::
:: It seems far more important that the duct be always
:: predictable than that it be the unix duct, which
:: may change, or be unset during first boot.
::
:- [gad.fox %pass /ames %b %wait p.bon]
?~ tim.fox ~
[gad.fox %pass /ames %b %rest u.tim.fox]~
2018-09-15 03:29:23 +03:00
::
%raki
2018-12-12 23:07:16 +03:00
=* her p.bon
=/ moz=(list move)
2018-12-12 11:50:40 +03:00
[hen [%pass / %j %meet her life=q.bon pass=r.bon]]~
:: poke :dns with an indirect binding if her is a planet we're spnsoring
::
=? moz ?& ?=(%duke (clan:title her))
?=(%king (clan:title our))
2019-01-12 01:31:29 +03:00
=(our (~(sein-scry am [our now fox ski]) her))
==
=/ cmd [%meet her]
=/ pok [%dns %poke `cage`[%dns-command !>(cmd)]]
:_ moz [hen [%pass / %g %deal [our our] pok]]
[moz fox]
::
%sake
2018-12-12 23:07:16 +03:00
=/ =wire /our/(scot %p our)
:_ fox [hen [%pass wire %j %vein ~]]~
2017-04-17 04:52:41 +03:00
::
2017-10-24 07:48:07 +03:00
%wine
2017-04-17 04:52:41 +03:00
:_ fox
2018-12-12 23:07:16 +03:00
=+ fom=~(rend co %$ %p p.bon)
2017-04-17 04:52:41 +03:00
:~ :- hen
:+ %slip %d
:+ %flog %text
;: weld
"; "
fom
q.bon
==
2016-11-24 07:25:07 +03:00
==
==
::
2017-04-17 04:52:41 +03:00
++ knap
2018-12-08 01:45:55 +03:00
~/ %knap
2017-10-24 08:17:38 +03:00
|= [tea=wire hen=duct sih=sign:able]
^- [(list move) _+>]
:: if we got an error from behn, report it to %dill; TODO handle errors
::
?: ?=([%wake ^] +.sih)
=/ =flog:dill [%crud %wake u.error.sih]
[[hen %slip %d %flog flog]~ +>.$]
::
2014-06-22 02:06:42 +04:00
?- +<.sih
2017-10-24 07:48:07 +03:00
%crud [[[hen [%slip %d %flog +.sih]] ~] +>]
::
2017-10-24 07:48:07 +03:00
%mack ?~ +>.sih $(sih [%g %nice ~]) :: XX using old code
2015-05-07 05:00:58 +03:00
$(sih [%g %mean `[%mack +>+.sih]])
::
%pubs
?. ?=([%pubs @ ~] tea)
~& [%strange-pubs tea]
[~ +>]
=/ her=ship (slav %p i.t.tea)
2018-12-12 22:37:04 +03:00
=/ gus (~(us go ton.fox) our)
2018-11-02 04:10:46 +03:00
=/ diz (myx:gus her)
?: =(0 life.sih)
2018-11-02 04:10:46 +03:00
:: this should clear lew.wod.dur.diz because it means
2018-11-02 20:22:30 +03:00
:: we no longer trust that their public key came to
2018-11-02 04:10:46 +03:00
:: us honestly (becuse of a %jael snapshot restore).
:: in practice, that crashes in ++cluy:las:as:go, so
:: we ignore for now.
~& [%ames-hear-empty-pub her]
[~ +>.$]
=/ ded=deed
[life.sih (~(got by pubs.sih) life.sih) oath=~]
=. lew.wod.dur.diz `ded
=. ton.fox (~(su go ton.fox) (nux:gus diz))
[~ +>.$]
::
2017-10-24 07:48:07 +03:00
%unto [~ +>]
::
%vein
?. ?=([%our @ ~] tea)
~& [%strange-vein tea]
[~ +>]
=. fox (~(vein am [our now fox ski]) life.sih vein.sih)
[~ +>.$]
::
2017-10-24 07:48:07 +03:00
%woot [~ +>]
::
*
2014-07-24 06:02:50 +04:00
=+ ^= fuy
^- [p=(list boon) q=fort]
?- +<.sih
::
:: only handles the non-error %wake case; error case above
::
%wake
(~(wake am [our now fox ski]) hen)
::
%turf
?: =(tuf.fox turf.sih)
[~ fox]
=. tuf.fox turf.sih
[[%bock ~]~ fox]
::
?(%mean %nice) :: XX obsolete
?: ?=([%ye ~] tea)
[~ fox]
?> ?=([@ @ @ *] tea)
=/ her (slav %p i.t.tea)
=* pax t.t.tea
2014-07-24 06:02:50 +04:00
=< zork =< zank
%^ ~(rack am [our now fox ski]) her pax
2015-05-07 05:00:58 +03:00
:: ~& [%knap-ack ?-(+<.sih %mean `p.+.sih, %nice ~)]
2017-10-24 07:48:07 +03:00
?-(+<.sih %mean `p.+.sih, %nice ~)
==
2014-07-24 06:02:50 +04:00
=> %_(. fox q.fuy)
2017-10-24 08:17:38 +03:00
=| out=(list move)
|- ^- [p=(list move) q=_+>.^$]
2014-07-24 06:02:50 +04:00
?~ p.fuy
[(flop out) +>.^$]
=^ toe fox (clop now hen i.p.fuy)
$(p.fuy t.p.fuy, out (weld (flop toe) out))
2017-04-17 04:52:41 +03:00
==
::
++ knob
2018-12-08 01:45:55 +03:00
~/ %knob
2017-10-24 08:17:38 +03:00
|= [hen=duct kyz=task:able]
^- [(list move) _+>]
2017-10-24 07:48:07 +03:00
?: ?=(%crud -.kyz)
2017-04-17 04:52:41 +03:00
[[[hen [%slip %d %flog kyz]] ~] +>]
2017-10-24 07:48:07 +03:00
?: ?=(%west -.kyz)
2018-09-13 08:48:18 +03:00
?> ?=([%pi ~] q.kyz)
2015-06-23 03:47:19 +03:00
:_ +>.$
2018-09-13 08:48:18 +03:00
[[hen %give %mack ~] ~]
2017-10-24 07:48:07 +03:00
?: ?=(%wegh -.kyz)
2015-05-07 05:25:41 +03:00
~& %ames-weighing
[[hen %give %mass wegh]~ +>]
2018-02-22 21:11:59 +03:00
=+ ^= fuy
2017-10-24 08:17:38 +03:00
^- [p=(list boon) q=fort]
2017-04-17 04:52:41 +03:00
?- -.kyz
2017-10-24 07:48:07 +03:00
%barn
=: gad.fox hen
tuf.fox ~(turf-scry am [our now fox ski])
==
[[%bock ~]~ fox]
2019-02-16 12:34:38 +03:00
::
%bonk
:_ fox
?~ tim.fox
~& %ames-bonk-e
~
[%pito u.tim.fox]~
2017-04-17 04:52:41 +03:00
::
2017-10-24 07:48:07 +03:00
%hear
(~(gnaw am [our now fox ski]) %good p.kyz q.kyz)
2013-09-29 00:21:18 +04:00
::
2017-10-24 07:48:07 +03:00
%halo
(~(gnaw am [our now fox ski]) %dead p.kyz q.kyz)
2017-04-17 04:52:41 +03:00
::
2017-10-24 07:48:07 +03:00
%hole
(~(gnaw am [our now fox ski]) %dead p.kyz q.kyz)
2017-04-17 04:52:41 +03:00
::
%init
2018-12-12 23:07:16 +03:00
:_ fox [[%sake ~] [%brew ~] ~]
2017-04-17 04:52:41 +03:00
::
2017-10-24 07:48:07 +03:00
%kick
=^ ban fox (~(kick am [our now fox(hop p.kyz) ski]) hen)
:: +next:am called here because +wake calls +kick in a loop
::
[(weld p.ban ~(next am [our now fox ski])) fox]
2017-05-16 23:56:54 +03:00
::
2017-10-24 07:48:07 +03:00
%nuke
2017-05-16 23:56:54 +03:00
:- ~
?: (~(has in bad.fox) p.kyz)
~& [%unblock p.kyz]
fox(bad (~(del in bad.fox) p.kyz))
~& [%block p.kyz]
fox(bad (~(put in bad.fox) p.kyz))
::
%sunk
=* who p.kyz
=* lyf q.kyz
?: =(our who)
2018-12-12 22:37:04 +03:00
?: (lth lyf p:(head val.ton.fox))
:: replaying our old sinkage, ignore
:: XX review
::
[~ fox]
:: XX include some helpful instructions here
::
:_ fox
2018-12-12 23:07:16 +03:00
[%wine who ", you have sunk"]~
::
2018-12-12 22:37:04 +03:00
=: hoc.ton.fox (~(del by hoc.ton.fox) who)
wab.zac.fox (~(del by wab.zac.fox) who)
==
2018-12-12 23:07:16 +03:00
[[%wine who " has sunk"]~ fox]
::
%vega
:: re-initialize our cryptosuite B cores
::
=/ =wund
%+ turn
val.ton.fox
|= [=life =ring *]
[life ring (nol:nu:crub:crypto ring)]
[~ fox(val.ton wund)]
2017-04-17 04:52:41 +03:00
::
2017-10-24 07:48:07 +03:00
%wake
(~(wake am [our now fox ski]) hen)
2017-04-17 04:52:41 +03:00
::
2017-10-24 07:48:07 +03:00
%want
2018-12-12 23:34:18 +03:00
(~(wise am [our now fox ski]) hen p.kyz q.kyz r.kyz)
2017-04-17 04:52:41 +03:00
==
2013-09-29 00:21:18 +04:00
=> %_(. fox q.fuy)
2017-10-24 08:17:38 +03:00
=| out=(list move)
|- ^- [p=(list move) q=_+>.^$]
2013-09-29 00:21:18 +04:00
?~ p.fuy
[(flop out) +>.^$]
=^ toe fox (clop now hen i.p.fuy)
2013-09-29 00:21:18 +04:00
$(p.fuy t.p.fuy, out (weld (flop toe) out))
2017-04-17 04:52:41 +03:00
::
++ temp
2018-12-08 01:45:55 +03:00
~/ %temp
|= [his=ship tyl=path]
2017-04-17 04:52:41 +03:00
^- (unit (unit cage))
2017-10-24 08:17:38 +03:00
?: ?=([?(%show %tell) *] tyl)
2017-04-17 04:52:41 +03:00
?^ t.tyl [~ ~]
=+ zet=zest:(ho:~(um am [our now fox ski]) his)
2017-04-17 04:52:41 +03:00
``[%noun ?:(=(%show i.tyl) !>(>zet<) !>(zet))]
2017-10-24 08:17:38 +03:00
?: ?=([%pals ~] tyl)
2017-04-17 04:52:41 +03:00
?. =(our his)
~
``[%noun !>(pals:~(um am [our now fox ski]))]
2019-02-16 12:34:38 +03:00
?: ?=([%time ~] tyl)
?. =(our his)
~
``[%noun !>(tim.fox)]
~
2017-04-17 04:52:41 +03:00
::
++ wegh
^- mass
:+ %ames %|
:~ :+ %town %|
=> ton.fox
:~ wund+&+val
deed+&+law
fast+&+seh
them+&+hoc
==
:+ %corn %|
=> zac.fox
:~ incoming+&+nys
complete+&+olz
neighbor+&+wab
==
dot+&+fox
2017-04-17 04:52:41 +03:00
==
--