Hex Artifact Content
Not logged in

Artifact 8d036f91db27753966f343a42260ba832a48bc8b:


0000: 23 20 43 6f 6d 6d 61 6e 64 73 20 23 0a 0a 56 65  # Commands #..Ve
0010: 72 73 69 6f 6e 20 30 2e 39 2e 31 2d 32 30 31 39  rsion 0.9.1-2019
0020: 30 38 32 32 2e 0a 0a 6e 65 74 32 6f 20 73 65 70  0822...net2o sep
0030: 61 72 61 74 65 73 20 64 61 74 61 20 61 6e 64 20  arates data and 
0040: 63 6f 6d 6d 61 6e 64 73 2e 20 20 44 61 74 61 20  commands.  Data 
0050: 69 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  is passed throug
0060: 68 20 74 6f 20 68 69 67 68 65 72 0a 6c 61 79 65  h to higher.laye
0070: 72 73 2c 20 63 6f 6d 6d 61 6e 64 73 20 61 72 65  rs, commands are
0080: 20 69 6e 74 65 72 70 72 65 74 65 64 20 77 68 65   interpreted whe
0090: 6e 20 74 68 65 79 20 61 72 72 69 76 65 2e 20 20  n they arrive.  
00a0: 46 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 72  For connection.r
00b0: 65 71 75 65 73 74 73 2c 20 61 20 73 70 65 63 69  equests, a speci
00c0: 61 6c 20 62 69 74 20 69 73 20 73 65 74 2c 20 61  al bit is set, a
00d0: 6e 64 20 74 68 65 20 61 64 64 72 65 73 73 20 74  nd the address t
00e0: 68 65 6e 20 69 73 6e 27 74 20 75 73 65 64 20 61  hen isn't used a
00f0: 73 0a 61 64 64 72 65 73 73 2c 20 62 75 74 20 61  s.address, but a
0100: 73 20 49 56 20 66 6f 72 20 74 68 65 20 6f 70 70  s IV for the opp
0110: 6f 72 74 75 6e 69 73 74 69 63 20 65 6e 63 6f 64  ortunistic encod
0120: 69 6e 67 2e 0a 0a 54 68 65 20 63 6f 6d 6d 61 6e  ing...The comman
0130: 64 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 73  d interpreter is
0140: 20 61 20 73 74 61 63 6b 20 6d 61 63 68 69 6e 65   a stack machine
0150: 20 77 69 74 68 20 74 77 6f 20 64 61 74 61 20 74   with two data t
0160: 79 70 65 73 3a 20 36 34 0a 62 69 74 20 69 6e 74  ypes: 64.bit int
0170: 65 67 65 72 73 20 61 6e 64 20 73 74 72 69 6e 67  egers and string
0180: 73 20 28 66 6c 6f 61 74 73 20 61 72 65 20 61 6c  s (floats are al
0190: 73 6f 20 73 75 70 70 6f 72 65 64 2c 20 62 75 74  so suppored, but
01a0: 20 75 73 65 64 0a 69 6e 66 72 65 71 75 65 6e 74   used.infrequent
01b0: 6c 79 29 2e 20 20 45 6e 63 6f 64 69 6e 67 20 6f  ly).  Encoding o
01c0: 66 20 63 6f 6d 6d 61 6e 64 73 2c 20 69 6e 74 65  f commands, inte
01d0: 67 65 72 73 20 61 6e 64 20 73 74 72 69 6e 67 20  gers and string 
01e0: 6c 65 6e 67 74 68 0a 66 6f 6c 6c 6f 77 73 20 70  length.follows p
01f0: 72 6f 74 6f 62 75 66 20 63 6f 6e 63 65 70 74 75  rotobuf conceptu
0200: 61 6c 6c 79 20 28 62 75 74 20 4d 53 42 20 66 69  ally (but MSB fi
0210: 72 73 74 2c 20 6e 6f 74 20 4c 53 42 20 66 69 72  rst, not LSB fir
0220: 73 74 20 61 73 20 77 69 74 68 0a 70 72 6f 74 6f  st as with.proto
0230: 62 75 66 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79  buf, to simplify
0240: 20 73 63 61 6e 6e 69 6e 67 29 2c 20 73 74 72 69   scanning), stri
0250: 6e 67 73 20 61 72 65 20 6a 75 73 74 20 73 65 71  ngs are just seq
0260: 75 65 6e 63 65 73 20 6f 66 0a 62 79 74 65 73 20  uences of.bytes 
0270: 28 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20  (interpretation 
0280: 63 61 6e 20 76 61 72 79 29 2e 20 20 43 6f 6d 6d  can vary).  Comm
0290: 61 6e 64 20 62 6c 6f 63 6b 73 20 63 6f 6e 74 61  and blocks conta
02a0: 69 6e 20 61 20 73 65 71 75 65 6e 63 65 0a 6f 66  in a sequence.of
02b0: 20 63 6f 6d 6d 61 6e 64 73 3b 20 74 68 65 72 65   commands; there
02c0: 20 61 72 65 20 6e 6f 20 63 6f 6e 64 69 74 69 6f   are no conditio
02d0: 6e 61 6c 73 20 61 6e 64 20 6c 6f 6f 70 69 6e 67  nals and looping
02e0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 0a 0a   instructions...
02f0: 53 74 72 69 6e 67 73 20 63 61 6e 20 63 6f 6e 74  Strings can cont
0300: 61 69 6e 20 65 6e 63 72 79 70 74 65 64 20 6e 65  ain encrypted ne
0310: 73 74 65 64 20 63 6f 6d 6d 61 6e 64 73 2c 20 75  sted commands, u
0320: 73 65 64 20 64 75 72 69 6e 67 0a 63 6f 6d 6d 75  sed during.commu
0330: 6e 69 63 61 74 69 6f 6e 20 73 65 74 75 70 2e 0a  nication setup..
0340: 0a 23 23 20 4c 69 73 74 20 6f 66 20 43 6f 6d 6d  .## List of Comm
0350: 61 6e 64 73 20 23 23 0a 0a 43 6f 6d 6d 61 6e 64  ands ##..Command
0360: 73 20 61 72 65 20 63 6f 6e 74 65 78 74 2d 73 65  s are context-se
0370: 6e 73 69 74 69 76 65 20 69 6e 20 61 6e 20 4f 4f  nsitive in an OO
0380: 50 20 6d 65 74 68 6f 64 20 68 69 65 72 61 72 63  P method hierarc
0390: 68 79 20 73 65 6e 73 65 2e 0a 0a 23 23 23 20 62  hy sense...### b
03a0: 61 73 65 20 63 6f 6d 6d 61 6e 64 73 20 23 23 23  ase commands ###
03b0: 0a 0a 2a 20 24 30 20 65 6e 64 2d 63 6d 64 20 28  ..* $0 end-cmd (
03c0: 20 2d 2d 20 29 0a 20 20 65 6e 64 20 63 6f 6d 6d   -- ).  end comm
03d0: 61 6e 64 20 62 75 66 66 65 72 0a 2a 20 24 31 20  and buffer.* $1 
03e0: 6c 69 74 20 28 20 23 75 20 2d 2d 20 75 20 29 0a  lit ( #u -- u ).
03f0: 20 20 6c 69 74 65 72 61 6c 0a 2a 20 24 32 20 2d    literal.* $2 -
0400: 6c 69 74 20 28 20 23 6e 20 2d 2d 20 6e 20 29 0a  lit ( #n -- n ).
0410: 20 20 6e 65 67 61 74 69 76 65 20 6c 69 74 65 72    negative liter
0420: 61 6c 2c 20 69 6e 76 65 72 74 65 64 20 65 6e 63  al, inverted enc
0430: 6f 64 65 64 0a 2a 20 24 33 20 73 74 72 69 6e 67  oded.* $3 string
0440: 20 28 20 23 73 74 72 69 6e 67 20 2d 2d 20 24 3a   ( #string -- $:
0450: 73 74 72 69 6e 67 20 29 0a 20 20 73 74 72 69 6e  string ).  strin
0460: 67 20 6c 69 74 65 72 61 6c 0a 2a 20 24 34 20 66  g literal.* $4 f
0470: 6c 69 74 20 28 20 23 64 66 6c 6f 61 74 20 2d 2d  lit ( #dfloat --
0480: 20 72 20 29 0a 20 20 64 6f 75 62 6c 65 20 66 6c   r ).  double fl
0490: 6f 61 74 20 6c 69 74 65 72 61 6c 0a 2a 20 24 35  oat literal.* $5
04a0: 20 65 6e 64 2d 77 69 74 68 20 28 20 6f 3a 6f 62   end-with ( o:ob
04b0: 6a 65 63 74 20 2d 2d 20 29 0a 20 20 65 6e 64 20  ject -- ).  end 
04c0: 73 63 6f 70 65 0a 2a 20 24 36 20 6f 73 77 61 70  scope.* $6 oswap
04d0: 20 28 20 6f 3a 6e 65 73 74 20 6f 3a 63 75 72 72   ( o:nest o:curr
04e0: 65 6e 74 20 2d 2d 20 6f 3a 63 75 72 72 65 6e 74  ent -- o:current
04f0: 20 6f 3a 6e 65 73 74 20 29 0a 2a 20 24 37 20 74   o:nest ).* $7 t
0500: 72 75 20 28 20 2d 2d 20 66 3a 74 72 75 65 20 29  ru ( -- f:true )
0510: 0a 20 20 74 72 75 65 20 66 6c 61 67 20 6c 69 74  .  true flag lit
0520: 65 72 61 6c 0a 2a 20 24 38 20 66 61 6c 73 20 28  eral.* $8 fals (
0530: 20 2d 2d 20 66 3a 66 61 6c 73 65 20 29 0a 20 20   -- f:false ).  
0540: 66 61 6c 73 65 20 66 6c 61 67 20 6c 69 74 65 72  false flag liter
0550: 61 6c 0a 2a 20 24 39 20 77 6f 72 64 73 20 28 20  al.* $9 words ( 
0560: 75 73 74 61 72 74 20 2d 2d 20 29 0a 20 20 72 65  ustart -- ).  re
0570: 66 6c 65 63 74 69 6f 6e 0a 2a 20 24 41 20 6e 65  flection.* $A ne
0580: 73 74 73 69 67 20 28 20 24 3a 63 6d 64 2b 73 69  stsig ( $:cmd+si
0590: 67 20 2d 2d 20 29 0a 20 20 63 68 65 63 6b 20 73  g -- ).  check s
05a0: 69 67 2b 6e 65 73 74 0a 2a 20 24 42 20 73 65 63  ig+nest.* $B sec
05b0: 73 74 72 69 6e 67 20 28 20 23 73 74 72 69 6e 67  string ( #string
05c0: 20 2d 2d 20 24 3a 73 74 72 69 6e 67 20 29 0a 20   -- $:string ). 
05d0: 20 73 65 63 72 65 74 20 73 74 72 69 6e 67 20 6c   secret string l
05e0: 69 74 65 72 61 6c 0a 2a 20 24 43 20 6e 6f 70 20  iteral.* $C nop 
05f0: 28 20 2d 2d 20 29 0a 20 20 64 6f 20 6e 6f 74 68  ( -- ).  do noth
0600: 69 6e 67 0a 2a 20 24 44 20 34 63 63 20 28 20 23  ing.* $D 4cc ( #
0610: 33 6c 65 74 74 65 72 20 2d 2d 20 29 0a 20 20 41  3letter -- ).  A
0620: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
0630: 6f 66 20 61 20 66 69 6c 65 2c 20 74 68 69 73 20  of a file, this 
0640: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 46  can be used as F
0650: 6f 75 72 43 43 20 63 6f 64 65 0a 2a 20 24 45 20  ourCC code.* $E 
0660: 70 61 64 64 69 6e 67 20 28 20 23 6c 65 6e 20 2d  padding ( #len -
0670: 2d 20 29 0a 20 20 61 64 64 20 70 61 64 64 69 6e  - ).  add paddin
0680: 67 20 74 6f 20 61 6c 69 67 6e 20 66 69 65 6c 64  g to align field
0690: 73 0a 2a 20 24 46 20 76 65 72 73 69 6f 6e 20 28  s.* $F version (
06a0: 20 24 3a 76 65 72 73 69 6f 6e 20 2d 2d 20 29 0a   $:version -- ).
06b0: 20 20 76 65 72 73 69 6f 6e 20 63 68 65 63 6b 0a    version check.
06c0: 0a 23 23 23 20 72 65 70 6c 79 20 63 6f 6d 6d 61  .### reply comma
06d0: 6e 64 73 20 23 23 23 0a 0a 2a 20 24 31 30 20 70  nds ###..* $10 p
06e0: 75 73 68 27 20 28 20 23 63 6d 64 20 2d 2d 20 29  ush' ( #cmd -- )
06f0: 0a 20 20 70 75 73 68 20 63 6f 6d 6d 61 6e 64 20  .  push command 
0700: 69 6e 74 6f 20 61 6e 73 77 65 72 20 70 61 63 6b  into answer pack
0710: 65 74 0a 2a 20 24 31 31 20 70 75 73 68 2d 6c 69  et.* $11 push-li
0720: 74 20 28 20 75 20 2d 2d 20 29 0a 20 20 70 75 73  t ( u -- ).  pus
0730: 68 20 75 6e 73 69 67 6e 65 64 20 6c 69 74 65 72  h unsigned liter
0740: 61 6c 20 69 6e 74 6f 20 61 6e 73 77 65 72 20 70  al into answer p
0750: 61 63 6b 65 74 0a 2a 20 24 31 33 20 70 75 73 68  acket.* $13 push
0760: 2d 24 20 28 20 24 3a 73 74 72 69 6e 67 20 2d 2d  -$ ( $:string --
0770: 20 29 0a 20 20 70 75 73 68 20 73 74 72 69 6e 67   ).  push string
0780: 20 69 6e 74 6f 20 61 6e 73 77 65 72 20 70 61 63   into answer pac
0790: 6b 65 74 0a 2a 20 24 31 34 20 70 75 73 68 2d 66  ket.* $14 push-f
07a0: 6c 6f 61 74 20 28 20 72 20 2d 2d 20 29 0a 20 20  loat ( r -- ).  
07b0: 70 75 73 68 20 66 6c 6f 61 74 69 6e 67 20 70 6f  push floating po
07c0: 69 6e 74 20 6e 75 6d 62 65 72 0a 2a 20 24 31 35  int number.* $15
07d0: 20 6f 6b 20 28 20 75 74 61 67 20 2d 2d 20 29 0a   ok ( utag -- ).
07e0: 20 20 74 61 67 67 65 64 20 72 65 73 70 6f 6e 73    tagged respons
07f0: 65 0a 2a 20 24 31 36 20 6f 6b 3f 20 28 20 75 74  e.* $16 ok? ( ut
0800: 61 67 20 2d 2d 20 29 0a 20 20 72 65 71 75 65 73  ag -- ).  reques
0810: 74 20 74 61 67 67 65 64 20 72 65 73 70 6f 6e 73  t tagged respons
0820: 65 0a 2a 20 24 31 37 20 6b 6f 20 28 20 75 65 72  e.* $17 ko ( uer
0830: 72 6f 72 20 2d 2d 20 29 0a 20 20 72 65 63 65 69  ror -- ).  recei
0840: 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ve error message
0850: 0a 2a 20 24 31 38 20 6e 65 73 74 20 28 20 24 3a  .* $18 nest ( $:
0860: 73 74 72 69 6e 67 20 2d 2d 20 29 0a 20 20 6e 65  string -- ).  ne
0870: 73 74 65 64 20 28 73 65 6c 66 2d 65 6e 63 72 79  sted (self-encry
0880: 70 74 65 64 29 20 63 6f 6d 6d 61 6e 64 0a 2a 20  pted) command.* 
0890: 24 31 39 20 74 6f 6b 65 6e 20 28 20 24 3a 74 6f  $19 token ( $:to
08a0: 6b 65 6e 20 6e 20 2d 2d 20 29 0a 20 20 67 65 6e  ken n -- ).  gen
08b0: 65 72 69 63 20 69 6e 73 70 65 63 74 69 6f 6e 20  eric inspection 
08c0: 74 6f 6b 65 6e 0a 2a 20 24 31 41 20 65 72 72 6f  token.* $1A erro
08d0: 72 2d 69 64 20 28 20 24 3a 65 72 72 6f 72 69 64  r-id ( $:errorid
08e0: 20 2d 2d 20 29 0a 20 20 65 72 72 6f 72 2d 69 64   -- ).  error-id
08f0: 20 73 74 72 69 6e 67 0a 2a 20 24 31 42 20 76 65   string.* $1B ve
0900: 72 73 69 6f 6e 3f 20 28 20 24 3a 76 65 72 73 69  rsion? ( $:versi
0910: 6f 6e 20 2d 2d 20 29 0a 20 20 76 65 72 73 69 6f  on -- ).  versio
0920: 6e 20 63 72 6f 73 73 2d 63 68 65 63 6b 0a 0a 23  n cross-check..#
0930: 23 23 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 67 65  ## connection ge
0940: 6e 65 72 69 63 20 63 6f 6d 6d 61 6e 64 73 20 23  neric commands #
0950: 23 23 0a 0a 2a 20 24 32 30 20 72 65 71 75 65 73  ##..* $20 reques
0960: 74 2d 64 6f 6e 65 20 28 20 75 72 65 71 20 2d 2d  t-done ( ureq --
0970: 20 29 0a 20 20 73 69 67 6e 61 6c 20 72 65 71 75   ).  signal requ
0980: 65 73 74 20 69 73 20 63 6f 6d 70 6c 65 74 65 64  est is completed
0990: 0a 2a 20 24 32 31 20 73 65 74 2d 63 6f 6f 6b 69  .* $21 set-cooki
09a0: 65 20 28 20 75 74 69 6d 65 73 74 61 6d 70 20 2d  e ( utimestamp -
09b0: 2d 20 29 0a 20 20 63 6f 6f 6b 69 65 73 20 61 6e  - ).  cookies an
09c0: 64 20 72 6f 75 6e 64 20 74 72 69 70 20 64 65 6c  d round trip del
09d0: 61 79 73 0a 2a 20 24 32 32 20 70 75 6e 63 68 2d  ays.* $22 punch-
09e0: 6c 6f 61 64 2c 20 28 20 24 3a 73 74 72 69 6e 67  load, ( $:string
09f0: 20 2d 2d 20 29 0a 20 20 75 73 65 20 66 6f 72 20   -- ).  use for 
0a00: 70 75 6e 63 68 20 70 61 79 6c 6f 61 64 3a 20 6e  punch payload: n
0a10: 65 73 74 20 69 74 0a 2a 20 24 32 33 20 70 75 6e  est it.* $23 pun
0a20: 63 68 20 28 20 24 3a 73 74 72 69 6e 67 20 2d 2d  ch ( $:string --
0a30: 20 29 0a 20 20 70 75 6e 63 68 20 4e 41 54 20 74   ).  punch NAT t
0a40: 72 61 76 65 72 73 61 6c 20 68 6f 6c 65 0a 2a 20  raversal hole.* 
0a50: 24 32 34 20 70 75 6e 63 68 2d 64 6f 6e 65 20 28  $24 punch-done (
0a60: 20 2d 2d 20 29 0a 20 20 70 75 6e 63 68 20 72 65   -- ).  punch re
0a70: 63 65 69 76 65 64 0a 0a 23 23 23 20 63 6f 6e 6e  ceived..### conn
0a80: 65 63 74 69 6f 6e 20 73 65 74 75 70 20 63 6f 6d  ection setup com
0a90: 6d 61 6e 64 73 20 23 23 23 0a 0a 2a 20 24 33 30  mands ###..* $30
0aa0: 20 74 6d 70 6e 65 73 74 20 28 20 24 3a 73 74 72   tmpnest ( $:str
0ab0: 69 6e 67 20 2d 2d 20 29 0a 20 20 6e 65 73 74 65  ing -- ).  neste
0ac0: 64 20 28 74 65 6d 70 6f 72 61 72 79 20 65 6e 63  d (temporary enc
0ad0: 72 79 70 74 65 64 29 20 63 6f 6d 6d 61 6e 64 0a  rypted) command.
0ae0: 2a 20 24 33 31 20 65 6e 63 6e 65 73 74 20 28 20  * $31 encnest ( 
0af0: 24 3a 73 74 72 69 6e 67 20 2d 2d 20 29 0a 20 20  $:string -- ).  
0b00: 6e 65 73 74 65 64 20 28 63 6f 6d 70 6c 65 74 65  nested (complete
0b10: 6c 79 20 65 6e 63 72 79 70 74 65 64 29 20 63 6f  ly encrypted) co
0b20: 6d 6d 61 6e 64 0a 2a 20 24 33 32 20 63 6c 6f 73  mmand.* $32 clos
0b30: 65 2d 74 6d 70 6e 65 73 74 20 28 20 2d 2d 20 29  e-tmpnest ( -- )
0b40: 0a 20 20 63 6f 73 65 20 61 20 6f 70 65 6e 65 64  .  cose a opened
0b50: 20 74 6d 70 6e 65 73 74 2c 20 61 6e 64 20 61 64   tmpnest, and ad
0b60: 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
0b70: 73 74 75 66 66 0a 2a 20 24 33 33 20 63 6c 6f 73  stuff.* $33 clos
0b80: 65 2d 65 6e 63 6e 65 73 74 20 28 20 2d 2d 20 29  e-encnest ( -- )
0b90: 0a 20 20 63 6f 73 65 20 61 20 6f 70 65 6e 65 64  .  cose a opened
0ba0: 20 65 6e 63 6e 65 73 74 2c 20 61 6e 64 20 61 64   encnest, and ad
0bb0: 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
0bc0: 73 74 75 66 66 0a 2a 20 24 33 34 20 6e 65 77 2d  stuff.* $34 new-
0bd0: 64 61 74 61 20 28 20 61 64 64 72 20 61 64 64 72  data ( addr addr
0be0: 20 75 20 2d 2d 20 29 0a 20 20 63 72 65 61 74 65   u -- ).  create
0bf0: 20 6e 65 77 20 64 61 74 61 20 6d 61 70 70 69 6e   new data mappin
0c00: 67 0a 2a 20 24 33 35 20 6e 65 77 2d 63 6f 64 65  g.* $35 new-code
0c10: 20 28 20 61 64 64 72 20 61 64 64 72 20 75 20 2d   ( addr addr u -
0c20: 2d 20 29 0a 20 20 63 72 61 74 65 20 6e 65 77 20  - ).  crate new 
0c30: 63 6f 64 65 20 6d 61 70 70 69 6e 67 0a 2a 20 24  code mapping.* $
0c40: 33 36 20 73 74 6f 72 65 2d 6b 65 79 20 28 20 24  36 store-key ( $
0c50: 3a 73 74 72 69 6e 67 20 2d 2d 20 29 0a 20 20 73  :string -- ).  s
0c60: 74 6f 72 65 20 6b 65 79 0a 2a 20 24 33 37 20 6d  tore key.* $37 m
0c70: 61 70 2d 72 65 71 75 65 73 74 20 28 20 61 64 64  ap-request ( add
0c80: 72 73 20 75 63 6f 64 65 20 75 64 61 74 61 20 2d  rs ucode udata -
0c90: 2d 20 29 0a 20 20 72 65 71 75 65 73 74 20 6d 61  - ).  request ma
0ca0: 70 70 69 6e 67 0a 2a 20 24 33 38 20 73 65 74 2d  pping.* $38 set-
0cb0: 74 69 63 6b 20 28 20 75 74 69 63 6b 73 20 2d 2d  tick ( uticks --
0cc0: 20 29 0a 20 20 61 64 6a 75 73 74 20 74 69 6d 65   ).  adjust time
0cd0: 0a 2a 20 24 33 39 20 67 65 74 2d 74 69 63 6b 20  .* $39 get-tick 
0ce0: 28 20 2d 2d 20 29 0a 20 20 72 65 71 75 65 73 74  ( -- ).  request
0cf0: 20 74 69 6d 65 20 61 64 6a 75 73 74 0a 2a 20 24   time adjust.* $
0d00: 33 41 20 72 65 63 65 69 76 65 2d 74 6d 70 6b 65  3A receive-tmpke
0d10: 79 20 28 20 24 3a 6b 65 79 20 2d 2d 20 29 0a 20  y ( $:key -- ). 
0d20: 20 72 65 63 65 69 76 65 20 65 6d 70 68 65 6d 65   receive empheme
0d30: 72 61 6c 20 6b 65 79 0a 2a 20 24 33 42 20 74 6d  ral key.* $3B tm
0d40: 70 6b 65 79 2d 72 65 71 75 65 73 74 20 28 20 2d  pkey-request ( -
0d50: 2d 20 29 0a 20 20 72 65 71 75 65 73 74 20 65 70  - ).  request ep
0d60: 68 65 6d 65 72 61 6c 20 6b 65 79 0a 2a 20 24 33  hemeral key.* $3
0d70: 43 20 6b 65 79 70 61 69 72 20 28 20 24 3a 79 6f  C keypair ( $:yo
0d80: 75 72 6b 65 79 20 24 3a 6d 79 6b 65 79 20 2d 2d  urkey $:mykey --
0d90: 20 29 0a 20 20 73 65 6c 65 63 74 20 61 20 70 75   ).  select a pu
0da0: 62 6b 65 79 0a 2a 20 24 33 44 20 75 70 64 61 74  bkey.* $3D updat
0db0: 65 2d 6b 65 79 20 28 20 2d 2d 20 29 0a 20 20 75  e-key ( -- ).  u
0dc0: 70 64 61 74 65 20 73 65 63 72 65 74 73 0a 2a 20  pdate secrets.* 
0dd0: 24 33 45 20 67 65 6e 2d 69 76 73 20 28 20 24 3a  $3E gen-ivs ( $:
0de0: 73 74 72 69 6e 67 20 2d 2d 20 29 0a 20 20 67 65  string -- ).  ge
0df0: 6e 65 72 61 74 65 20 49 56 73 0a 2a 20 24 33 46  nerate IVs.* $3F
0e00: 20 61 64 64 72 2d 6b 65 79 21 20 28 20 24 3a 73   addr-key! ( $:s
0e10: 74 72 69 6e 67 20 2d 2d 20 29 0a 20 20 73 65 74  tring -- ).  set
0e20: 20 6b 65 79 20 66 6f 72 20 72 65 70 6c 79 0a 2a   key for reply.*
0e30: 20 24 34 30 20 70 75 6e 63 68 3f 20 28 20 2d 2d   $40 punch? ( --
0e40: 20 29 0a 20 20 52 65 71 75 65 73 74 20 70 75 6e   ).  Request pun
0e50: 63 68 20 61 64 64 72 65 73 73 65 73 0a 2a 20 24  ch addresses.* $
0e60: 34 31 20 3e 74 69 6d 65 2d 6f 66 66 73 65 74 20  41 >time-offset 
0e70: 28 20 6e 20 2d 2d 20 29 0a 20 20 73 65 74 20 74  ( n -- ).  set t
0e80: 69 6d 65 20 6f 66 66 73 65 74 0a 2a 20 24 34 32  ime offset.* $42
0e90: 20 63 6f 6e 74 65 78 74 20 28 20 2d 2d 20 29 0a   context ( -- ).
0ea0: 20 20 6d 61 6b 65 20 63 6f 6e 74 65 78 74 20 61    make context a
0eb0: 63 74 69 76 65 0a 2a 20 24 34 33 20 67 65 6e 2d  ctive.* $43 gen-
0ec0: 72 65 70 6c 79 20 28 20 2d 2d 20 29 0a 20 20 67  reply ( -- ).  g
0ed0: 65 6e 65 72 61 74 65 20 61 20 6b 65 79 20 72 65  enerate a key re
0ee0: 71 75 65 73 74 20 72 65 70 6c 79 0a 2a 20 24 34  quest reply.* $4
0ef0: 34 20 67 65 6e 2d 70 75 6e 63 68 2d 72 65 70 6c  4 gen-punch-repl
0f00: 79 20 28 20 2d 2d 20 29 0a 2a 20 24 34 35 20 69  y ( -- ).* $45 i
0f10: 6e 76 69 74 65 20 28 20 24 3a 6e 69 63 6b 2b 73  nvite ( $:nick+s
0f20: 69 67 20 24 3a 70 6b 20 2d 2d 20 29 0a 20 20 69  ig $:pk -- ).  i
0f30: 6e 76 69 74 65 20 73 6f 6d 65 6f 6e 65 0a 2a 20  nvite someone.* 
0f40: 24 34 36 20 72 65 71 75 65 73 74 2d 69 6e 76 69  $46 request-invi
0f50: 74 61 74 69 6f 6e 20 28 20 2d 2d 20 29 0a 20 20  tation ( -- ).  
0f60: 61 73 6b 20 66 6f 72 20 61 6e 20 69 6e 76 69 74  ask for an invit
0f70: 61 74 69 6f 6e 20 61 73 20 73 65 63 6f 6e 64 20  ation as second 
0f80: 73 74 61 67 65 20 6f 66 20 69 6e 76 69 74 61 74  stage of invitat
0f90: 69 6f 6e 20 68 61 6e 64 73 68 61 6b 65 0a 2a 20  ion handshake.* 
0fa0: 24 34 37 20 73 69 67 6e 2d 69 6e 76 69 74 65 20  $47 sign-invite 
0fb0: 28 20 24 3a 73 69 67 6e 61 74 75 72 65 20 2d 2d  ( $:signature --
0fc0: 20 29 0a 20 20 73 65 6e 64 20 79 6f 75 20 61 20   ).  send you a 
0fd0: 73 69 67 6e 61 74 75 72 65 0a 2a 20 24 34 38 20  signature.* $48 
0fe0: 72 65 71 75 65 73 74 2d 71 72 2d 69 6e 76 69 74  request-qr-invit
0ff0: 61 74 69 6f 6e 20 28 20 2d 2d 20 29 0a 20 20 61  ation ( -- ).  a
1000: 73 6b 20 66 6f 72 20 61 6e 20 69 6e 76 69 74 61  sk for an invita
1010: 74 69 6f 6e 20 61 73 20 73 65 63 6f 6e 64 20 73  tion as second s
1020: 74 61 67 65 20 6f 66 20 69 6e 76 69 74 61 74 69  tage of invitati
1030: 6f 6e 20 68 61 6e 64 73 68 61 6b 65 0a 2a 20 24  on handshake.* $
1040: 34 39 20 74 6d 70 2d 73 65 63 72 65 74 2c 20 28  49 tmp-secret, (
1050: 20 2d 2d 20 29 0a 2a 20 24 34 41 20 71 72 2d 63   -- ).* $4A qr-c
1060: 68 61 6c 6c 65 6e 67 65 20 28 20 24 3a 63 68 61  hallenge ( $:cha
1070: 6c 6c 65 6e 67 65 20 24 3a 72 65 73 70 6f 73 65  llenge $:respose
1080: 20 2d 2d 20 29 0a 2a 20 24 34 42 20 69 6e 76 69   -- ).* $4B invi
1090: 74 65 2d 72 65 73 75 6c 74 20 28 20 66 6c 61 67  te-result ( flag
10a0: 20 2d 2d 20 29 0a 0a 23 23 23 20 63 6f 6e 6e 65   -- )..### conne
10b0: 63 74 69 6f 6e 20 63 6f 6d 6d 61 6e 64 73 20 23  ction commands #
10c0: 23 23 0a 0a 2a 20 24 32 35 20 64 69 73 63 6f 6e  ##..* $25 discon
10d0: 6e 65 63 74 20 28 20 2d 2d 20 29 0a 20 20 63 6c  nect ( -- ).  cl
10e0: 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ose connection.*
10f0: 20 24 32 36 20 73 65 74 2d 69 70 20 28 20 24 3a   $26 set-ip ( $:
1100: 73 74 72 69 6e 67 20 2d 2d 20 29 0a 20 20 73 65  string -- ).  se
1110: 74 20 61 64 64 72 65 73 73 20 69 6e 66 6f 72 6d  t address inform
1120: 61 74 69 6f 6e 0a 2a 20 24 32 37 20 67 65 74 2d  ation.* $27 get-
1130: 69 70 20 28 20 2d 2d 20 29 0a 20 20 72 65 71 75  ip ( -- ).  requ
1140: 65 73 74 20 61 64 64 72 65 73 73 20 69 6e 66 6f  est address info
1150: 72 6d 61 74 69 6f 6e 0a 2a 20 24 32 38 20 73 65  rmation.* $28 se
1160: 74 2d 62 6c 6f 63 6b 73 69 7a 65 20 28 20 6e 20  t-blocksize ( n 
1170: 2d 2d 20 29 0a 20 20 73 65 74 20 62 6c 6f 63 6b  -- ).  set block
1180: 73 69 7a 65 20 74 6f 20 32 5e 6e 0a 2a 20 24 32  size to 2^n.* $2
1190: 39 20 73 65 74 2d 62 6c 6f 63 6b 61 6c 69 67 6e  9 set-blockalign
11a0: 20 28 20 6e 20 2d 2d 20 29 0a 20 20 73 65 74 20   ( n -- ).  set 
11b0: 62 6c 6f 63 6b 20 61 6c 69 67 6e 6d 65 6e 74 20  block alignment 
11c0: 74 6f 20 32 5e 6e 0a 2a 20 24 32 41 20 63 6c 6f  to 2^n.* $2A clo
11d0: 73 65 2d 61 6c 6c 20 28 20 2d 2d 20 29 0a 20 20  se-all ( -- ).  
11e0: 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 0a  close all files.
11f0: 2a 20 24 32 42 20 73 65 74 2d 74 6f 70 20 28 20  * $2B set-top ( 
1200: 75 74 6f 70 20 66 6c 61 67 20 2d 2d 20 29 0a 20  utop flag -- ). 
1210: 20 73 65 74 20 74 6f 70 2c 20 66 6c 61 67 20 69   set top, flag i
1220: 73 20 74 72 75 65 20 77 68 65 6e 20 61 6c 6c 20  s true when all 
1230: 64 61 74 61 20 69 73 20 73 65 6e 74 0a 2a 20 24  data is sent.* $
1240: 32 43 20 73 6c 75 72 70 20 28 20 2d 2d 20 29 0a  2C slurp ( -- ).
1250: 20 20 73 6c 75 72 70 20 69 6e 20 74 72 61 63 6b    slurp in track
1260: 65 64 20 66 69 6c 65 73 0a 2a 20 24 32 44 20 61  ed files.* $2D a
1270: 63 6b 2d 72 65 73 65 74 20 28 20 2d 2d 20 29 0a  ck-reset ( -- ).
1280: 20 20 72 65 73 65 74 20 61 63 6b 20 73 74 61 74    reset ack stat
1290: 65 0a 0a 23 23 23 20 66 69 6c 65 20 63 6f 6d 6d  e..### file comm
12a0: 61 6e 64 73 20 23 23 23 0a 0a 2a 20 24 33 30 20  ands ###..* $30 
12b0: 66 69 6c 65 2d 69 64 20 28 20 75 69 64 20 2d 2d  file-id ( uid --
12c0: 20 6f 3a 66 69 6c 65 20 29 0a 20 20 63 68 6f 6f   o:file ).  choo
12d0: 73 65 20 61 20 66 69 6c 65 20 6f 62 6a 65 63 74  se a file object
12e0: 0a 2a 20 24 32 30 20 6f 70 65 6e 2d 66 69 6c 65  .* $20 open-file
12f0: 20 28 20 24 3a 73 74 72 69 6e 67 20 6d 6f 64 65   ( $:string mode
1300: 20 2d 2d 20 29 0a 20 20 6f 70 65 6e 20 66 69 6c   -- ).  open fil
1310: 65 20 77 69 74 68 20 6d 6f 64 65 0a 2a 20 24 32  e with mode.* $2
1320: 31 20 66 69 6c 65 2d 74 79 70 65 20 28 20 6e 20  1 file-type ( n 
1330: 2d 2d 20 29 0a 20 20 63 68 6f 6f 73 65 20 66 69  -- ).  choose fi
1340: 6c 65 20 74 79 70 65 0a 2a 20 24 32 32 20 63 6c  le type.* $22 cl
1350: 6f 73 65 2d 66 69 6c 65 20 28 20 2d 2d 20 29 0a  ose-file ( -- ).
1360: 20 20 63 6c 6f 73 65 20 66 69 6c 65 0a 2a 20 24    close file.* $
1370: 32 33 20 73 65 74 2d 73 69 7a 65 20 28 20 73 69  23 set-size ( si
1380: 7a 65 20 2d 2d 20 29 0a 20 20 73 65 74 20 73 69  ze -- ).  set si
1390: 7a 65 20 61 74 74 72 69 62 75 74 65 20 6f 66 20  ze attribute of 
13a0: 63 75 72 72 65 6e 74 20 66 69 6c 65 0a 2a 20 24  current file.* $
13b0: 32 34 20 73 65 74 2d 73 65 65 6b 20 28 20 75 73  24 set-seek ( us
13c0: 65 65 6b 20 2d 2d 20 29 0a 20 20 73 65 74 20 73  eek -- ).  set s
13d0: 65 65 6b 20 61 74 74 72 69 62 75 74 65 20 6f 66  eek attribute of
13e0: 20 63 75 72 72 65 6e 74 20 66 69 6c 65 0a 2a 20   current file.* 
13f0: 24 32 35 20 73 65 74 2d 6c 69 6d 69 74 20 28 20  $25 set-limit ( 
1400: 75 6c 69 6d 69 74 20 2d 2d 20 29 0a 20 20 73 65  ulimit -- ).  se
1410: 74 20 6c 69 6d 69 74 20 61 74 74 72 69 62 75 74  t limit attribut
1420: 65 20 6f 66 20 63 75 72 72 65 6e 74 20 66 69 6c  e of current fil
1430: 65 0a 2a 20 24 32 36 20 73 65 74 2d 73 74 61 74  e.* $26 set-stat
1440: 20 28 20 75 6d 74 69 6d 65 20 75 6d 6f 64 20 2d   ( umtime umod -
1450: 2d 20 29 0a 20 20 73 65 74 20 74 69 6d 65 20 61  - ).  set time a
1460: 6e 64 20 6d 6f 64 65 20 6f 66 20 63 75 72 72 65  nd mode of curre
1470: 6e 74 20 66 69 6c 65 0a 2a 20 24 32 37 20 67 65  nt file.* $27 ge
1480: 74 2d 73 69 7a 65 20 28 20 2d 2d 20 29 0a 20 20  t-size ( -- ).  
1490: 72 65 71 75 65 73 74 20 66 69 6c 65 20 73 69 7a  request file siz
14a0: 65 0a 2a 20 24 32 38 20 67 65 74 2d 73 74 61 74  e.* $28 get-stat
14b0: 20 28 20 2d 2d 20 29 0a 20 20 72 65 71 75 65 73   ( -- ).  reques
14c0: 74 20 73 74 61 74 20 6f 66 20 63 75 72 72 65 6e  t stat of curren
14d0: 74 20 66 69 6c 65 0a 2a 20 24 32 39 20 73 65 74  t file.* $29 set
14e0: 2d 66 6f 72 6d 20 28 20 77 20 68 20 2d 2d 20 29  -form ( w h -- )
14f0: 0a 20 20 69 66 20 66 69 6c 65 20 69 73 20 61 20  .  if file is a 
1500: 74 65 72 6d 69 6e 61 6c 2c 20 73 65 74 20 73 69  terminal, set si
1510: 7a 65 0a 2a 20 24 32 41 20 67 65 74 2d 66 6f 72  ze.* $2A get-for
1520: 6d 20 28 20 2d 2d 20 29 0a 20 20 69 66 20 66 69  m ( -- ).  if fi
1530: 6c 65 20 69 73 20 61 20 74 65 72 6d 69 6e 61 6c  le is a terminal
1540: 2c 20 72 65 71 75 65 73 74 20 73 69 7a 65 0a 2a  , request size.*
1550: 20 24 32 42 20 70 6f 6c 6c 2d 72 65 71 75 65 73   $2B poll-reques
1560: 74 20 28 20 75 6c 69 6d 69 74 20 2d 2d 20 29 0a  t ( ulimit -- ).
1570: 20 20 70 6f 6c 6c 20 61 20 66 69 6c 65 20 74 6f    poll a file to
1580: 20 63 68 65 63 6b 20 66 6f 72 20 73 69 7a 65 20   check for size 
1590: 63 68 61 6e 67 65 73 0a 0a 23 23 23 20 61 63 6b  changes..### ack
15a0: 20 63 6f 6d 6d 61 6e 64 73 20 23 23 23 0a 0a 2a   commands ###..*
15b0: 20 24 33 31 20 61 63 6b 20 28 20 2d 2d 20 6f 3a   $31 ack ( -- o:
15c0: 61 63 6b 6f 20 29 0a 20 20 61 63 6b 20 6f 62 6a  acko ).  ack obj
15d0: 65 63 74 0a 2a 20 24 32 30 20 61 63 6b 2d 61 64  ect.* $20 ack-ad
15e0: 64 72 74 69 6d 65 20 28 20 75 74 69 6d 65 20 61  drtime ( utime a
15f0: 64 64 72 20 2d 2d 20 29 0a 20 20 70 61 63 6b 65  ddr -- ).  packe
1600: 74 20 61 74 20 61 64 64 72 20 72 65 63 65 69 76  t at addr receiv
1610: 65 64 20 61 74 20 74 69 6d 65 0a 2a 20 24 32 31  ed at time.* $21
1620: 20 61 63 6b 2d 72 65 73 65 6e 64 20 28 20 66 6c   ack-resend ( fl
1630: 61 67 20 2d 2d 20 29 0a 20 20 73 65 74 20 72 65  ag -- ).  set re
1640: 73 65 6e 64 20 74 6f 67 67 6c 65 20 66 6c 61 67  send toggle flag
1650: 0a 2a 20 24 32 32 20 73 65 74 2d 72 61 74 65 20  .* $22 set-rate 
1660: 28 20 75 72 61 74 65 20 75 64 65 6c 74 61 2d 74  ( urate udelta-t
1670: 20 2d 2d 20 29 0a 20 20 73 65 74 20 72 61 74 65   -- ).  set rate
1680: 20 0a 2a 20 24 32 33 20 72 65 73 65 6e 64 2d 6d   .* $23 resend-m
1690: 61 73 6b 20 28 20 61 64 64 72 20 75 6d 61 73 6b  ask ( addr umask
16a0: 20 2d 2d 20 29 0a 20 20 72 65 73 65 6e 64 20 6d   -- ).  resend m
16b0: 61 73 6b 20 62 6c 6f 63 6b 73 20 73 74 61 72 74  ask blocks start
16c0: 69 6e 67 20 61 74 20 61 64 64 72 0a 2a 20 24 32  ing at addr.* $2
16d0: 34 20 74 72 61 63 6b 2d 74 69 6d 69 6e 67 20 28  4 track-timing (
16e0: 20 2d 2d 20 29 0a 20 20 74 72 61 63 6b 20 74 69   -- ).  track ti
16f0: 6d 69 6e 67 0a 2a 20 24 32 35 20 72 65 63 2d 74  ming.* $25 rec-t
1700: 69 6d 69 6e 67 20 28 20 24 3a 73 74 72 69 6e 67  iming ( $:string
1710: 20 2d 2d 20 29 0a 20 20 72 65 63 6f 72 64 65 64   -- ).  recorded
1720: 20 74 69 6d 69 6e 67 0a 2a 20 24 32 36 20 73 65   timing.* $26 se
1730: 6e 64 2d 74 69 6d 69 6e 67 20 28 20 2d 2d 20 29  nd-timing ( -- )
1740: 0a 20 20 72 65 71 75 65 73 74 20 72 65 63 6f 72  .  request recor
1750: 64 65 64 20 74 69 6d 69 6e 67 0a 2a 20 24 32 37  ded timing.* $27
1760: 20 61 63 6b 2d 62 32 62 74 69 6d 65 20 28 20 75   ack-b2btime ( u
1770: 74 69 6d 65 20 61 64 64 72 20 2d 2d 20 29 0a 20  time addr -- ). 
1780: 20 62 75 72 73 74 2d 74 6f 2d 62 75 72 73 74 20   burst-to-burst 
1790: 74 69 6d 65 20 61 74 20 70 61 63 6b 65 74 20 61  time at packet a
17a0: 64 64 72 0a 2a 20 24 32 38 20 61 63 6b 2d 72 65  ddr.* $28 ack-re
17b0: 73 65 6e 64 23 20 28 20 61 64 64 72 20 24 3a 73  send# ( addr $:s
17c0: 74 72 69 6e 67 20 2d 2d 20 29 0a 20 20 72 65 73  tring -- ).  res
17d0: 65 6e 64 20 6e 75 6d 62 65 72 73 0a 2a 20 24 32  end numbers.* $2
17e0: 39 20 61 63 6b 2d 66 6c 75 73 68 20 28 20 61 64  9 ack-flush ( ad
17f0: 64 72 20 2d 2d 20 29 0a 20 20 66 6c 75 73 68 65  dr -- ).  flushe
1800: 64 20 74 6f 20 61 64 64 72 0a 2a 20 24 32 43 20  d to addr.* $2C 
1810: 73 65 74 2d 72 74 64 65 6c 61 79 20 28 20 74 69  set-rtdelay ( ti
1820: 63 6b 73 20 2d 2d 20 29 0a 20 20 73 65 74 20 72  cks -- ).  set r
1830: 6f 75 6e 64 20 74 72 69 70 20 64 65 6c 61 79 20  ound trip delay 
1840: 6f 6e 6c 79 0a 2a 20 24 32 44 20 73 65 71 23 20  only.* $2D seq# 
1850: 28 20 6e 20 2d 2d 20 29 0a 20 20 73 65 74 20 74  ( n -- ).  set t
1860: 68 65 20 61 63 6b 20 6e 75 6d 62 65 72 20 61 6e  he ack number an
1870: 64 20 63 68 65 63 6b 20 66 6f 72 20 73 6d 61 6c  d check for smal
1880: 6c 65 72 0a 0a 23 23 23 20 6c 6f 67 20 63 6f 6d  ler..### log com
1890: 6d 61 6e 64 73 20 23 23 23 0a 0a 2a 20 24 31 39  mands ###..* $19
18a0: 20 6c 6f 67 2d 74 6f 6b 65 6e 20 28 20 24 3a 74   log-token ( $:t
18b0: 6f 6b 65 6e 20 6e 20 2d 2d 20 29 0a 2a 20 24 32  oken n -- ).* $2
18c0: 30 20 65 6d 69 74 20 28 20 75 74 66 38 20 2d 2d  0 emit ( utf8 --
18d0: 20 29 0a 20 20 65 6d 69 74 20 63 68 61 72 61 63   ).  emit charac
18e0: 74 65 72 20 6f 6e 20 73 65 72 76 65 72 20 6c 6f  ter on server lo
18f0: 67 0a 2a 20 24 32 31 20 74 79 70 65 20 28 20 24  g.* $21 type ( $
1900: 3a 73 74 72 69 6e 67 20 2d 2d 20 29 0a 20 20 74  :string -- ).  t
1910: 79 70 65 20 73 74 72 69 6e 67 20 6f 6e 20 73 65  ype string on se
1920: 72 76 65 72 20 6c 6f 67 0a 2a 20 24 32 32 20 63  rver log.* $22 c
1930: 72 20 28 20 2d 2d 20 29 0a 20 20 6e 65 77 6c 69  r ( -- ).  newli
1940: 6e 65 20 6f 6e 20 73 65 72 76 65 72 20 6c 6f 67  ne on server log
1950: 0a 2a 20 24 32 33 20 2e 20 28 20 6e 20 2d 2d 20  .* $23 . ( n -- 
1960: 29 0a 20 20 70 72 69 6e 74 20 6e 75 6d 62 65 72  ).  print number
1970: 20 6f 6e 20 73 65 72 76 65 72 20 6c 6f 67 0a 2a   on server log.*
1980: 20 24 32 34 20 66 2e 20 28 20 72 20 2d 2d 20 29   $24 f. ( r -- )
1990: 0a 20 20 70 72 69 6e 74 20 66 70 20 6e 75 6d 62  .  print fp numb
19a0: 65 72 20 6f 6e 20 73 65 72 76 65 72 20 6c 6f 67  er on server log
19b0: 0a 2a 20 24 32 35 20 2e 74 69 6d 65 20 28 20 2d  .* $25 .time ( -
19c0: 2d 20 29 0a 20 20 70 72 69 6e 74 20 74 69 6d 65  - ).  print time
19d0: 72 20 74 6f 20 73 65 72 76 65 72 20 6c 6f 67 0a  r to server log.
19e0: 2a 20 24 32 36 20 21 74 69 6d 65 20 28 20 2d 2d  * $26 !time ( --
19f0: 20 29 0a 20 20 73 74 61 72 74 20 74 69 6d 65 72   ).  start timer
1a00: 0a 2a 20 24 33 32 20 6c 6f 67 20 28 20 2d 2d 20  .* $32 log ( -- 
1a10: 6f 3a 6c 6f 67 20 29 0a 20 20 66 72 65 65 20 61  o:log ).  free a
1a20: 6c 6c 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  ll parts of the 
1a30: 73 75 62 6b 65 79 0a 0a 23 23 23 20 6b 65 79 20  subkey..### key 
1a40: 73 74 6f 72 61 67 65 20 63 6f 6d 6d 61 6e 64 73  storage commands
1a50: 20 23 23 23 0a 2a 20 24 32 20 73 6c 69 74 20 28   ###.* $2 slit (
1a60: 20 23 6c 69 74 20 2d 2d 20 29 0a 20 20 64 65 70   #lit -- ).  dep
1a70: 72 65 63 61 74 65 64 20 73 6c 69 74 20 76 65 72  recated slit ver
1a80: 73 69 6f 6e 0a 2a 20 24 46 20 6b 76 65 72 73 69  sion.* $F kversi
1a90: 6f 6e 20 28 20 24 3a 73 74 72 69 6e 67 20 2d 2d  on ( $:string --
1aa0: 20 29 0a 20 20 6b 65 79 20 76 65 72 73 69 6f 6e   ).  key version
1ab0: 0a 2a 20 24 31 31 20 70 72 69 76 6b 65 79 20 28  .* $11 privkey (
1ac0: 20 24 3a 73 74 72 69 6e 67 20 2d 2d 20 29 0a 20   $:string -- ). 
1ad0: 20 70 72 69 76 61 74 65 20 6b 65 79 0a 2a 20 24   private key.* $
1ae0: 31 32 20 6b 65 79 74 79 70 65 20 28 20 6e 20 2d  12 keytype ( n -
1af0: 2d 20 29 0a 20 20 6b 65 79 20 74 79 70 65 20 28  - ).  key type (
1b00: 30 3a 20 61 6e 6f 6e 2c 20 31 3a 20 75 73 65 72  0: anon, 1: user
1b10: 2c 20 32 3a 20 67 72 6f 75 70 29 0a 2a 20 24 31  , 2: group).* $1
1b20: 33 20 6b 65 79 6e 69 63 6b 20 28 20 24 3a 73 74  3 keynick ( $:st
1b30: 72 69 6e 67 20 2d 2d 20 29 0a 20 20 6b 65 79 20  ring -- ).  key 
1b40: 6e 69 63 6b 0a 2a 20 24 31 34 20 6b 65 79 70 72  nick.* $14 keypr
1b50: 6f 66 69 6c 65 20 28 20 24 3a 73 74 72 69 6e 67  ofile ( $:string
1b60: 20 2d 2d 20 29 0a 20 20 6b 65 79 20 70 72 6f 66   -- ).  key prof
1b70: 69 6c 65 20 28 68 61 73 68 20 6f 66 20 61 20 72  ile (hash of a r
1b80: 65 73 6f 75 72 63 65 29 0a 2a 20 24 31 35 20 6b  esource).* $15 k
1b90: 65 79 6d 61 73 6b 20 28 20 78 20 2d 2d 20 29 0a  eymask ( x -- ).
1ba0: 20 20 6b 65 79 20 61 63 63 65 73 73 20 72 69 67    key access rig
1bb0: 68 74 20 6d 61 73 6b 0a 2a 20 24 31 36 20 6b 65  ht mask.* $16 ke
1bc0: 79 67 72 6f 75 70 73 20 28 20 24 3a 67 72 6f 75  ygroups ( $:grou
1bd0: 70 73 20 2d 2d 20 29 0a 20 20 61 63 63 65 73 73  ps -- ).  access
1be0: 20 67 72 6f 75 70 73 0a 2a 20 24 31 37 20 2b 6b   groups.* $17 +k
1bf0: 65 79 73 69 67 20 28 20 24 3a 73 74 72 69 6e 67  eysig ( $:string
1c00: 20 2d 2d 20 29 0a 20 20 61 64 64 20 61 20 6b 65   -- ).  add a ke
1c10: 79 20 73 69 67 6e 61 74 75 72 65 0a 2a 20 24 31  y signature.* $1
1c20: 38 20 6b 65 79 69 6d 70 6f 72 74 20 28 20 6e 20  8 keyimport ( n 
1c30: 2d 2d 20 29 0a 2a 20 24 31 39 20 72 73 6b 6b 65  -- ).* $19 rskke
1c40: 79 20 28 20 24 3a 73 74 72 69 6e 67 20 2d 2d 2d  y ( $:string ---
1c50: 20 29 0a 20 20 72 65 76 6f 6b 65 20 6b 65 79 2c   ).  revoke key,
1c60: 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 73 74 6f   temporarily sto
1c70: 72 65 64 0a 2a 20 24 31 41 20 6b 65 79 70 65 74  red.* $1A keypet
1c80: 20 28 20 24 3a 73 74 72 69 6e 67 20 2d 2d 20 29   ( $:string -- )
1c90: 0a 2a 20 24 31 42 20 77 61 6c 6c 65 74 6b 65 79  .* $1B walletkey
1ca0: 20 28 20 24 3a 73 65 65 64 20 2d 2d 20 29 0a 2a   ( $:seed -- ).*
1cb0: 20 24 31 43 20 61 76 61 74 61 72 20 28 20 24 3a   $1C avatar ( $:
1cc0: 73 74 72 69 6e 67 20 2d 2d 20 29 0a 20 20 6b 65  string -- ).  ke
1cd0: 79 20 61 76 61 74 61 72 20 70 72 6f 66 69 6c 65  y avatar profile
1ce0: 20 28 68 61 73 68 20 6f 66 20 61 20 72 65 73 6f   (hash of a reso
1cf0: 75 72 63 65 29 0a 2a 20 24 31 44 20 6b 65 79 2d  urce).* $1D key-
1d00: 73 74 72 69 6e 67 31 20 28 20 24 3a 73 74 72 69  string1 ( $:stri
1d10: 6e 67 20 2d 2d 20 29 0a 2a 20 24 31 45 20 6b 65  ng -- ).* $1E ke
1d20: 79 2d 73 74 72 69 6e 67 32 20 28 20 24 3a 73 74  y-string2 ( $:st
1d30: 72 69 6e 67 20 2d 2d 20 29 0a 2a 20 24 31 46 20  ring -- ).* $1F 
1d40: 6b 65 79 2d 73 74 72 69 6e 67 33 20 28 20 24 3a  key-string3 ( $:
1d50: 73 74 72 69 6e 67 20 2d 2d 20 29 0a 2a 20 24 32  string -- ).* $2
1d60: 30 20 6b 65 79 2d 73 74 72 69 6e 67 34 20 28 20  0 key-string4 ( 
1d70: 24 3a 73 74 72 69 6e 67 20 2d 2d 20 29 0a 2a 20  $:string -- ).* 
1d80: 24 32 31 20 6b 65 79 2d 73 65 63 31 20 28 20 24  $21 key-sec1 ( $
1d90: 3a 73 74 72 69 6e 67 20 2d 2d 20 29 0a 2a 20 24  :string -- ).* $
1da0: 32 32 20 6b 65 79 2d 73 65 63 32 20 28 20 24 3a  22 key-sec2 ( $:
1db0: 73 74 72 69 6e 67 20 2d 2d 20 29 0a 2a 20 24 32  string -- ).* $2
1dc0: 33 20 6b 65 79 2d 6e 75 6d 31 20 28 20 36 34 6e  3 key-num1 ( 64n
1dd0: 20 2d 2d 20 29 0a 2a 20 24 32 34 20 6b 65 79 2d   -- ).* $24 key-
1de0: 6e 75 6d 32 20 28 20 36 34 6e 20 2d 2d 20 29 0a  num2 ( 64n -- ).
1df0: 2a 20 24 32 35 20 6b 65 79 2d 6e 75 6d 33 20 28  * $25 key-num3 (
1e00: 20 36 34 6e 20 2d 2d 20 29 0a 2a 20 24 32 36 20   64n -- ).* $26 
1e10: 6b 65 79 2d 6e 75 6d 34 20 28 20 36 34 6e 20 2d  key-num4 ( 64n -
1e20: 2d 20 29 0a 20 20 72 65 61 64 20 61 20 6e 65 73  - ).  read a nes
1e30: 74 65 64 20 6b 65 79 20 69 6e 74 6f 20 73 61 6d  ted key into sam
1e40: 70 6c 65 2d 6b 65 79 0a 0a 23 23 23 20 61 64 64  ple-key..### add
1e50: 72 65 73 73 20 63 6f 6d 6d 61 6e 64 73 20 23 23  ress commands ##
1e60: 23 0a 0a 2a 20 24 31 31 20 61 64 64 72 2d 70 72  #..* $11 addr-pr
1e70: 69 23 20 28 20 6e 20 2d 2d 20 29 0a 20 20 70 72  i# ( n -- ).  pr
1e80: 69 6f 72 69 74 79 0a 2a 20 24 31 32 20 61 64 64  iority.* $12 add
1e90: 72 2d 69 64 20 28 20 24 3a 69 64 20 2d 2d 20 29  r-id ( $:id -- )
1ea0: 0a 20 20 75 6e 69 71 75 65 20 68 6f 73 74 20 69  .  unique host i
1eb0: 64 20 73 74 72 69 6e 67 0a 2a 20 24 31 33 20 61  d string.* $13 a
1ec0: 64 64 72 2d 61 6e 63 68 6f 72 20 28 20 24 3a 70  ddr-anchor ( $:p
1ed0: 75 62 6b 65 79 20 2d 2d 20 29 0a 20 20 61 6e 63  ubkey -- ).  anc
1ee0: 68 6f 72 20 66 6f 72 20 72 6f 75 74 69 6e 67 20  hor for routing 
1ef0: 66 75 72 74 68 65 72 0a 2a 20 24 31 34 20 61 64  further.* $14 ad
1f00: 64 72 2d 69 70 76 34 20 28 20 6e 20 2d 2d 20 29  dr-ipv4 ( n -- )
1f10: 0a 20 20 69 70 20 61 64 64 72 65 73 73 0a 2a 20  .  ip address.* 
1f20: 24 31 35 20 61 64 64 72 2d 69 70 76 36 20 28 20  $15 addr-ipv6 ( 
1f30: 24 3a 69 70 76 36 20 2d 2d 20 29 0a 20 20 69 70  $:ipv6 -- ).  ip
1f40: 76 36 20 61 64 64 72 65 73 73 0a 2a 20 24 31 36  v6 address.* $16
1f50: 20 61 64 64 72 2d 70 6f 72 74 76 34 20 28 20 6e   addr-portv4 ( n
1f60: 20 2d 2d 20 29 0a 20 20 69 70 76 34 20 70 6f 72   -- ).  ipv4 por
1f70: 74 0a 2a 20 24 31 37 20 61 64 64 72 2d 70 6f 72  t.* $17 addr-por
1f80: 74 76 36 20 28 20 6e 20 2d 2d 20 29 0a 20 20 69  tv6 ( n -- ).  i
1f90: 70 76 36 20 70 6f 72 74 0a 2a 20 24 31 38 20 61  pv6 port.* $18 a
1fa0: 64 64 72 2d 70 6f 72 74 20 28 20 6e 20 2d 2d 20  ddr-port ( n -- 
1fb0: 29 0a 20 20 69 70 20 70 6f 72 74 2c 20 62 6f 74  ).  ip port, bot
1fc0: 68 20 70 72 6f 74 6f 63 6f 6c 73 0a 2a 20 24 31  h protocols.* $1
1fd0: 39 20 61 64 64 72 2d 72 6f 75 74 65 20 28 20 24  9 addr-route ( $
1fe0: 3a 6e 65 74 32 6f 20 2d 2d 20 29 0a 20 20 6e 65  :net2o -- ).  ne
1ff0: 74 32 6f 20 72 6f 75 74 69 6e 67 20 70 61 72 74  t2o routing part
2000: 0a 2a 20 24 31 41 20 61 64 64 72 2d 6b 65 79 20  .* $1A addr-key 
2010: 28 20 24 3a 61 64 64 72 20 2d 2d 20 29 0a 20 20  ( $:addr -- ).  
2020: 6b 65 79 20 66 6f 72 20 63 6f 6e 6e 65 63 74 69  key for connecti
2030: 6f 6e 20 73 65 74 75 70 0a 2a 20 24 31 42 20 61  on setup.* $1B a
2040: 64 64 72 2d 72 65 76 6f 6b 65 20 28 20 24 3a 72  ddr-revoke ( $:r
2050: 65 76 6f 6b 65 20 2d 2d 20 29 0a 20 20 72 65 76  evoke -- ).  rev
2060: 6f 63 61 74 69 6f 6e 20 69 6e 66 6f 0a 2a 20 24  ocation info.* $
2070: 31 43 20 61 64 64 72 2d 65 6b 65 79 20 28 20 24  1C addr-ekey ( $
2080: 3a 65 6b 65 79 20 2d 2d 20 29 0a 20 20 65 70 68  :ekey -- ).  eph
2090: 65 6d 65 72 61 6c 20 6b 65 79 0a 0a 23 23 23 20  emeral key..### 
20a0: 64 68 74 20 63 6f 6d 6d 61 6e 64 73 20 23 23 23  dht commands ###
20b0: 0a 0a 2a 20 24 33 33 20 64 68 74 2d 69 64 20 28  ..* $33 dht-id (
20c0: 20 24 3a 73 74 72 69 6e 67 20 2d 2d 20 6f 3a 6f   $:string -- o:o
20d0: 20 29 0a 20 20 73 65 74 20 44 48 54 20 69 64 20   ).  set DHT id 
20e0: 66 6f 72 20 66 75 72 74 68 65 72 20 6f 70 65 72  for further oper
20f0: 61 74 69 6f 6e 73 20 6f 6e 20 69 74 0a 2a 20 24  ations on it.* $
2100: 32 30 20 64 68 74 2d 68 6f 73 74 2b 20 28 20 24  20 dht-host+ ( $
2110: 3a 73 74 72 69 6e 67 20 2d 2d 20 29 0a 20 20 61  :string -- ).  a
2120: 64 64 20 68 6f 73 74 20 74 6f 20 44 48 54 0a 2a  dd host to DHT.*
2130: 20 24 32 31 20 64 68 74 2d 68 6f 73 74 2d 20 28   $21 dht-host- (
2140: 20 24 3a 73 74 72 69 6e 67 20 2d 2d 20 29 0a 20   $:string -- ). 
2150: 20 64 65 6c 65 74 65 20 68 6f 73 74 20 66 72 6f   delete host fro
2160: 6d 20 44 48 54 0a 2a 20 24 32 32 20 64 68 74 2d  m DHT.* $22 dht-
2170: 68 6f 73 74 3f 20 28 20 2d 2d 20 29 0a 20 20 71  host? ( -- ).  q
2180: 75 65 72 79 20 44 48 54 20 68 6f 73 74 0a 2a 20  uery DHT host.* 
2190: 24 32 33 20 64 68 74 2d 74 61 67 73 2b 20 28 20  $23 dht-tags+ ( 
21a0: 24 3a 73 74 72 69 6e 67 20 2d 2d 20 29 0a 20 20  $:string -- ).  
21b0: 61 64 64 20 74 61 67 73 20 74 6f 20 44 48 54 0a  add tags to DHT.
21c0: 2a 20 24 32 34 20 64 68 74 2d 74 61 67 73 2d 20  * $24 dht-tags- 
21d0: 28 20 24 3a 73 74 72 69 6e 67 20 2d 2d 20 29 0a  ( $:string -- ).
21e0: 20 20 64 65 6c 65 74 65 20 74 61 67 73 20 66 72    delete tags fr
21f0: 6f 6d 20 44 48 54 0a 2a 20 24 32 35 20 64 68 74  om DHT.* $25 dht
2200: 2d 74 61 67 73 3f 20 28 20 2d 2d 20 29 0a 20 20  -tags? ( -- ).  
2210: 71 75 65 72 79 20 44 48 54 20 74 61 67 73 0a 2a  query DHT tags.*
2220: 20 24 32 36 20 64 68 74 2d 6f 77 6e 65 72 2b 20   $26 dht-owner+ 
2230: 28 20 24 3a 73 74 72 69 6e 67 20 2d 2d 20 29 0a  ( $:string -- ).
2240: 20 20 61 64 64 20 6f 77 6e 65 72 20 74 6f 20 44    add owner to D
2250: 48 54 0a 2a 20 24 32 37 20 64 68 74 2d 6f 77 6e  HT.* $27 dht-own
2260: 65 72 2d 20 28 20 24 3a 73 74 72 69 6e 67 20 2d  er- ( $:string -
2270: 2d 20 29 0a 20 20 64 65 6c 65 74 65 20 6f 77 6e  - ).  delete own
2280: 65 72 20 66 72 6f 6d 20 44 48 54 0a 2a 20 24 32  er from DHT.* $2
2290: 38 20 64 68 74 2d 6f 77 6e 65 72 3f 20 28 20 2d  8 dht-owner? ( -
22a0: 2d 20 29 0a 20 20 71 75 65 72 79 20 44 48 54 20  - ).  query DHT 
22b0: 6f 77 6e 65 72 0a 2a 20 24 32 39 20 64 68 74 2d  owner.* $29 dht-
22c0: 68 61 76 65 2b 20 28 20 24 3a 73 74 72 69 6e 67  have+ ( $:string
22d0: 20 2d 2d 20 29 0a 20 20 61 64 64 20 68 61 76 65   -- ).  add have
22e0: 20 74 6f 20 44 48 54 0a 2a 20 24 32 41 20 64 68   to DHT.* $2A dh
22f0: 74 2d 68 61 76 65 2d 20 28 20 24 3a 73 74 72 69  t-have- ( $:stri
2300: 6e 67 20 2d 2d 20 29 0a 20 20 64 65 6c 65 74 65  ng -- ).  delete
2310: 20 68 61 76 65 20 66 72 6f 6d 20 44 48 54 0a 2a   have from DHT.*
2320: 20 24 32 42 20 64 68 74 2d 68 61 76 65 3f 20 28   $2B dht-have? (
2330: 20 2d 2d 20 29 0a 20 20 71 75 65 72 79 20 44 48   -- ).  query DH
2340: 54 20 68 61 76 65 0a 0a 23 23 23 20 76 61 75 6c  T have..### vaul
2350: 74 20 63 6f 6d 6d 61 6e 64 73 20 23 23 23 0a 0a  t commands ###..
2360: 2a 20 24 32 30 20 64 68 65 20 28 20 24 3a 70 75  * $20 dhe ( $:pu
2370: 62 6b 65 79 20 2d 2d 20 29 0a 20 20 73 74 61 72  bkey -- ).  star
2380: 74 20 64 69 66 66 69 65 20 68 65 6c 6c 6d 61 6e  t diffie hellman
2390: 20 65 78 63 68 61 6e 67 65 0a 2a 20 24 32 31 20   exchange.* $21 
23a0: 76 61 75 6c 74 2d 6b 65 79 73 20 28 20 24 3a 6b  vault-keys ( $:k
23b0: 65 79 73 20 2d 2d 20 29 0a 20 20 76 61 75 6c 74  eys -- ).  vault
23c0: 20 6b 65 79 73 20 63 61 6e 20 62 65 20 6f 70 65   keys can be ope
23d0: 6e 65 64 20 77 69 74 68 20 74 68 65 20 64 68 65  ned with the dhe
23e0: 20 73 65 63 72 65 74 3b 20 65 61 63 68 20 6b 65   secret; each ke
23f0: 79 20 69 73 20 49 56 2b 73 65 73 73 69 6f 6e 20  y is IV+session 
2400: 6b 65 79 2b 63 68 65 63 6b 73 75 6d 0a 2a 20 24  key+checksum.* $
2410: 32 32 20 76 61 75 6c 74 2d 66 69 6c 65 20 28 20  22 vault-file ( 
2420: 24 3a 63 6f 6e 74 65 6e 74 20 2d 2d 20 29 0a 20  $:content -- ). 
2430: 20 74 68 69 73 20 69 73 20 74 68 65 20 61 63 74   this is the act
2440: 75 61 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ual content of t
2450: 68 65 20 76 61 75 6c 74 0a 20 20 69 66 20 62 6c  he vault.  if bl
2460: 6f 63 6b 77 69 73 65 2c 20 74 68 65 72 65 20 6d  ockwise, there m
2470: 61 79 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 70  ay be multiple p
2480: 61 72 74 73 0a 2a 20 24 32 33 20 76 61 75 6c 74  arts.* $23 vault
2490: 2d 73 69 67 20 28 20 24 3a 73 69 67 20 2d 2d 20  -sig ( $:sig -- 
24a0: 29 0a 20 20 74 68 65 20 73 69 67 6e 61 74 75 72  ).  the signatur
24b0: 65 20 6f 66 20 74 68 65 20 76 61 75 6c 74 2c 20  e of the vault, 
24c0: 75 73 69 6e 67 20 74 68 65 20 6b 65 79 65 64 20  using the keyed 
24d0: 68 61 73 68 20 6f 76 65 72 20 74 68 65 20 66 69  hash over the fi
24e0: 6c 65 0a 2a 20 24 32 34 20 76 61 75 6c 74 2d 63  le.* $24 vault-c
24f0: 72 79 70 74 20 28 20 6e 20 2d 2d 20 29 0a 20 20  rypt ( n -- ).  
2500: 73 65 74 20 65 6e 63 72 79 70 74 69 6f 6e 20 6d  set encryption m
2510: 6f 64 65 20 61 6e 64 20 6b 65 79 20 77 72 61 70  ode and key wrap
2520: 20 73 69 7a 65 0a 2a 20 24 32 35 20 76 61 75 6c   size.* $25 vaul
2530: 74 2d 61 75 74 68 20 28 20 24 3a 61 75 74 68 20  t-auth ( $:auth 
2540: 2d 2d 20 29 0a 20 20 62 6c 6f 63 6b 20 61 75 74  -- ).  block aut
2550: 68 65 6e 74 69 63 61 74 69 6f 6e 2c 20 36 34 20  hentication, 64 
2560: 62 79 74 65 20 62 6c 6f 63 6b 0a 2a 20 24 32 36  byte block.* $26
2570: 20 76 61 75 6c 74 2d 64 68 65 2d 6b 65 79 73 20   vault-dhe-keys 
2580: 28 20 24 3a 64 68 65 2b 6b 65 79 73 20 2d 2d 20  ( $:dhe+keys -- 
2590: 29 0a 0a 23 23 23 20 6d 65 73 73 61 67 65 20 63  )..### message c
25a0: 6f 6d 6d 61 6e 64 73 20 23 23 23 0a 0a 2a 20 24  ommands ###..* $
25b0: 32 30 20 6d 73 67 2d 73 74 61 72 74 20 28 20 24  20 msg-start ( $
25c0: 3a 70 6b 73 69 67 20 2d 2d 20 29 0a 20 20 73 74  :pksig -- ).  st
25d0: 61 72 74 20 6d 65 73 73 61 67 65 0a 2a 20 24 32  art message.* $2
25e0: 31 20 6d 73 67 2d 74 61 67 20 28 20 24 3a 74 61  1 msg-tag ( $:ta
25f0: 67 20 2d 2d 20 29 0a 20 20 74 61 67 67 69 6e 67  g -- ).  tagging
2600: 20 28 63 61 6e 20 62 65 20 61 6e 79 77 68 65 72   (can be anywher
2610: 65 29 0a 2a 20 24 32 32 20 6d 73 67 2d 69 64 20  e).* $22 msg-id 
2620: 28 20 24 3a 69 64 20 2d 2d 20 29 0a 20 20 61 20  ( $:id -- ).  a 
2630: 68 61 73 68 20 69 64 0a 2a 20 24 32 33 20 6d 73  hash id.* $23 ms
2640: 67 2d 63 68 61 69 6e 20 28 20 24 3a 64 61 74 65  g-chain ( $:date
2650: 73 2c 73 69 67 68 61 73 68 20 2d 2d 20 29 0a 20  s,sighash -- ). 
2660: 20 63 68 61 69 6e 65 64 20 74 6f 20 6d 65 73 73   chained to mess
2670: 61 67 65 5b 73 5d 0a 2a 20 24 32 34 20 6d 73 67  age[s].* $24 msg
2680: 2d 73 69 67 6e 61 6c 20 28 20 24 3a 70 75 62 6b  -signal ( $:pubk
2690: 65 79 20 2d 2d 20 29 0a 20 20 73 69 67 6e 61 6c  ey -- ).  signal
26a0: 20 6d 65 73 73 61 67 65 20 74 6f 20 6f 6e 65 20   message to one 
26b0: 70 65 72 73 6f 6e 0a 2a 20 24 32 35 20 6d 73 67  person.* $25 msg
26c0: 2d 72 65 20 28 20 24 3a 68 61 73 68 20 29 0a 20  -re ( $:hash ). 
26d0: 20 72 65 6c 61 74 65 20 74 6f 20 73 6f 6d 65 20   relate to some 
26e0: 6f 62 6a 65 63 74 0a 2a 20 24 32 36 20 6d 73 67  object.* $26 msg
26f0: 2d 74 65 78 74 20 28 20 24 3a 6d 73 67 20 2d 2d  -text ( $:msg --
2700: 20 29 0a 20 20 73 70 65 63 69 66 79 20 6d 65 73   ).  specify mes
2710: 73 61 67 65 20 73 74 72 69 6e 67 0a 2a 20 24 32  sage string.* $2
2720: 37 20 6d 73 67 2d 6f 62 6a 65 63 74 20 28 20 24  7 msg-object ( $
2730: 3a 6f 62 6a 65 63 74 20 74 79 70 65 20 2d 2d 20  :object type -- 
2740: 29 0a 20 20 73 70 65 63 69 66 79 20 61 6e 20 6f  ).  specify an o
2750: 62 6a 65 63 74 2c 20 65 2e 67 2e 20 61 6e 20 69  bject, e.g. an i
2760: 6d 61 67 65 0a 2a 20 24 32 38 20 6d 73 67 2d 61  mage.* $28 msg-a
2770: 63 74 69 6f 6e 20 28 20 24 3a 6d 73 67 20 2d 2d  ction ( $:msg --
2780: 20 29 0a 20 20 73 70 65 63 69 66 79 20 61 63 74   ).  specify act
2790: 69 6f 6e 20 73 74 72 69 6e 67 0a 2a 20 24 32 39  ion string.* $29
27a0: 20 6d 73 67 2d 70 61 79 6d 65 6e 74 20 28 20 24   msg-payment ( $
27b0: 3a 63 6f 6e 74 72 61 63 74 20 2d 2d 20 29 0a 20  :contract -- ). 
27c0: 20 70 61 79 6d 65 6e 74 20 74 72 61 6e 73 61 63   payment transac
27d0: 74 69 6f 6e 0a 2a 20 24 32 41 20 6d 73 67 2d 6f  tion.* $2A msg-o
27e0: 74 72 69 66 79 20 28 20 24 3a 64 61 74 65 2b 73  trify ( $:date+s
27f0: 69 67 20 24 3a 6e 65 77 64 61 74 65 2b 73 69 67  ig $:newdate+sig
2800: 20 2d 2d 20 29 0a 20 20 74 75 72 6e 20 61 20 70   -- ).  turn a p
2810: 61 73 74 20 6d 65 73 73 61 67 65 20 69 6e 74 6f  ast message into
2820: 20 4f 54 52 0a 2a 20 24 32 42 20 6d 73 67 2d 63   OTR.* $2B msg-c
2830: 6f 6f 72 64 20 28 20 24 3a 67 70 73 20 2d 2d 20  oord ( $:gps -- 
2840: 29 0a 20 20 47 50 53 20 63 6f 6f 72 64 69 6e 61  ).  GPS coordina
2850: 74 65 73 0a 2a 20 24 32 43 20 6d 73 67 2d 75 72  tes.* $2C msg-ur
2860: 6c 20 28 20 24 3a 75 72 6c 20 2d 2d 20 29 0a 20  l ( $:url -- ). 
2870: 20 73 70 65 63 69 66 79 20 6d 65 73 73 61 67 65   specify message
2880: 20 55 52 4c 0a 2a 20 24 32 44 20 6d 73 67 2d 6c   URL.* $2D msg-l
2890: 69 6b 65 20 28 20 78 63 68 61 72 20 2d 2d 20 29  ike ( xchar -- )
28a0: 0a 20 20 61 64 64 20 61 20 6c 69 6b 65 0a 2a 20  .  add a like.* 
28b0: 24 32 45 20 6d 73 67 2d 6c 6f 63 6b 20 28 20 24  $2E msg-lock ( $
28c0: 3a 6b 65 79 20 2d 2d 20 29 0a 20 20 6c 6f 63 6b  :key -- ).  lock
28d0: 20 64 6f 77 6e 20 63 6f 6d 6d 75 6e 63 69 61 74   down communciat
28e0: 69 6f 6e 0a 2a 20 24 32 46 20 6d 73 67 2d 75 6e  ion.* $2F msg-un
28f0: 6c 6f 63 6b 20 28 20 2d 2d 20 29 0a 20 20 75 6e  lock ( -- ).  un
2900: 6c 6f 63 6b 20 63 6f 6d 6d 75 6e 69 63 61 74 69  lock communicati
2910: 6f 6e 0a 2a 20 24 33 30 20 6d 73 67 2d 70 65 72  on.* $30 msg-per
2920: 6d 73 20 28 20 24 3a 70 6b 20 70 65 72 6d 20 2d  ms ( $:pk perm -
2930: 2d 20 29 0a 20 20 70 65 72 6d 69 73 73 69 6f 6e  - ).  permission
2940: 73 0a 0a 23 23 23 20 67 72 6f 75 70 20 64 65 73  s..### group des
2950: 63 72 69 70 74 69 6f 6e 20 63 6f 6d 6d 61 6e 64  cription command
2960: 73 20 23 23 23 0a 0a 2a 20 24 32 30 20 67 72 6f  s ###..* $20 gro
2970: 75 70 2d 6e 61 6d 65 20 28 20 24 3a 6e 61 6d 65  up-name ( $:name
2980: 20 2d 2d 20 29 0a 20 20 67 72 6f 75 70 20 73 79   -- ).  group sy
2990: 6d 62 6f 6c 69 63 20 6e 61 6d 65 0a 2a 20 24 32  mbolic name.* $2
29a0: 31 20 67 72 6f 75 70 2d 69 64 20 28 20 24 3a 67  1 group-id ( $:g
29b0: 72 6f 75 70 20 2d 2d 20 29 0a 20 20 67 72 6f 75  roup -- ).  grou
29c0: 70 20 69 64 2c 20 69 73 20 61 20 70 75 62 6b 65  p id, is a pubke
29d0: 79 0a 2a 20 24 32 32 20 67 72 6f 75 70 2d 6d 65  y.* $22 group-me
29e0: 6d 62 65 72 20 28 20 24 3a 6d 65 6d 62 65 72 6b  mber ( $:memberk
29f0: 65 79 20 2d 2d 20 29 0a 20 20 61 64 64 20 6d 65  ey -- ).  add me
2a00: 6d 62 65 72 20 6b 65 79 0a 2a 20 24 32 33 20 67  mber key.* $23 g
2a10: 72 6f 75 70 2d 61 64 6d 69 6e 20 28 20 24 3a 61  roup-admin ( $:a
2a20: 64 6d 69 6e 6b 65 79 20 2d 2d 20 29 0a 20 20 73  dminkey -- ).  s
2a30: 65 74 20 61 64 6d 69 6e 20 6b 65 79 0a 2a 20 24  et admin key.* $
2a40: 32 34 20 67 72 6f 75 70 2d 70 65 72 6d 73 20 28  24 group-perms (
2a50: 20 36 34 75 20 2d 2d 20 29 0a 20 20 70 65 72 6d   64u -- ).  perm
2a60: 69 73 73 69 6f 6e 2f 6d 6f 64 65 73 20 62 69 74  ission/modes bit
2a70: 6d 61 73 6b 0a 0a 23 23 23 20 6d 65 73 73 61 67  mask..### messag
2a80: 69 6e 67 20 63 6f 6d 6d 61 6e 64 73 20 23 23 23  ing commands ###
2a90: 0a 0a 2a 20 24 33 34 20 6d 65 73 73 61 67 65 20  ..* $34 message 
2aa0: 28 20 2d 2d 20 6f 3a 6d 73 67 20 29 0a 20 20 70  ( -- o:msg ).  p
2ab0: 75 73 68 20 61 20 6d 65 73 73 61 67 65 20 6f 62  ush a message ob
2ac0: 6a 65 63 74 0a 2a 20 24 32 31 20 6d 73 67 2d 67  ject.* $21 msg-g
2ad0: 72 6f 75 70 20 28 20 24 3a 67 72 6f 75 70 20 2d  roup ( $:group -
2ae0: 2d 20 29 0a 20 20 73 65 74 20 67 72 6f 75 70 0a  - ).  set group.
2af0: 2a 20 24 32 32 20 6d 73 67 2d 6a 6f 69 6e 20 28  * $22 msg-join (
2b00: 20 24 3a 67 72 6f 75 70 20 2d 2d 20 29 0a 20 20   $:group -- ).  
2b10: 6a 6f 69 6e 20 61 20 63 68 61 74 20 67 72 6f 75  join a chat grou
2b20: 70 0a 2a 20 24 32 33 20 6d 73 67 2d 6c 65 61 76  p.* $23 msg-leav
2b30: 65 20 28 20 24 3a 67 72 6f 75 70 20 2d 2d 20 29  e ( $:group -- )
2b40: 0a 20 20 6c 65 61 76 65 20 61 20 63 68 61 74 20  .  leave a chat 
2b50: 67 72 6f 75 70 0a 2a 20 24 32 34 20 6d 73 67 2d  group.* $24 msg-
2b60: 72 65 63 6f 6e 6e 65 63 74 20 28 20 24 3a 70 75  reconnect ( $:pu
2b70: 62 6b 65 79 2b 61 64 64 72 20 2d 2d 20 29 0a 20  bkey+addr -- ). 
2b80: 20 72 65 77 69 72 65 20 64 69 73 74 72 69 62 75   rewire distribu
2b90: 74 69 6f 6e 20 74 72 65 65 0a 2a 20 24 32 35 20  tion tree.* $25 
2ba0: 6d 73 67 2d 6c 61 73 74 3f 20 28 20 73 74 61 72  msg-last? ( star
2bb0: 74 20 65 6e 64 20 6e 20 2d 2d 20 29 0a 2a 20 24  t end n -- ).* $
2bc0: 32 36 20 6d 73 67 2d 6c 61 73 74 20 28 20 24 3a  26 msg-last ( $:
2bd0: 5b 74 69 63 6b 30 2c 6d 73 67 73 2c 2e 2e 74 69  [tick0,msgs,..ti
2be0: 63 6b 6e 5d 20 6e 20 2d 2d 20 29 0a 2a 20 24 41  ckn] n -- ).* $A
2bf0: 20 6d 73 67 2d 6e 65 73 74 73 69 67 20 28 20 24   msg-nestsig ( $
2c00: 3a 63 6d 64 2b 73 69 67 20 2d 2d 20 29 0a 20 20  :cmd+sig -- ).  
2c10: 63 68 65 63 6b 20 73 69 67 2b 6e 65 73 74 0a 0a  check sig+nest..
2c20: 23 23 23 20 44 56 43 53 20 70 61 74 63 68 20 63  ### DVCS patch c
2c30: 6f 6d 6d 61 6e 64 73 20 23 23 23 0a 0a 44 56 43  ommands ###..DVC
2c40: 53 20 6d 65 74 61 64 61 74 61 20 69 73 20 73 74  S metadata is st
2c50: 6f 72 65 64 20 69 6e 20 6d 65 73 73 61 67 65 73  ored in messages
2c60: 2c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6d 65 73  , containing mes
2c70: 73 61 67 65 20 74 65 78 74 2c 20 72 65 66 73 0a  sage text, refs.
2c80: 61 6e 64 20 70 61 74 63 68 73 65 74 20 6f 62 6a  and patchset obj
2c90: 65 63 74 73 2e 20 50 61 74 63 68 73 65 74 20 6f  ects. Patchset o
2ca0: 62 6a 65 63 74 73 20 61 72 65 20 63 6f 6e 73 74  bjects are const
2cb0: 72 75 63 74 65 64 20 69 6e 20 61 20 77 61 79 0a  ructed in a way.
2cc0: 74 68 61 74 20 6d 61 6b 65 73 20 69 64 65 6e 74  that makes ident
2cd0: 69 63 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  ical transaction
2ce0: 73 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  s have the same 
2cf0: 68 61 73 68 2e 0a 0a 2a 20 24 32 30 20 64 76 63  hash...* $20 dvc
2d00: 73 2d 72 65 61 64 20 28 20 24 3a 68 61 73 68 20  s-read ( $:hash 
2d10: 2d 2d 20 29 0a 20 20 72 65 61 64 20 69 6e 20 61  -- ).  read in a
2d20: 6e 20 6f 62 6a 65 63 74 0a 2a 20 24 32 31 20 64  n object.* $21 d
2d30: 76 63 73 2d 72 6d 20 28 20 24 3a 68 61 73 68 2b  vcs-rm ( $:hash+
2d40: 6e 61 6d 65 20 2d 2d 20 29 0a 20 20 64 65 6c 65  name -- ).  dele
2d50: 74 65 20 66 69 6c 65 0a 2a 20 24 32 32 20 64 76  te file.* $22 dv
2d60: 63 73 2d 72 6d 64 69 72 20 28 20 24 3a 6e 61 6d  cs-rmdir ( $:nam
2d70: 65 20 2d 2d 20 29 0a 20 20 64 65 6c 65 74 65 20  e -- ).  delete 
2d80: 64 69 72 65 63 74 6f 72 79 0a 2a 20 24 32 33 20  directory.* $23 
2d90: 64 76 63 73 2d 70 61 74 63 68 20 28 20 24 3a 64  dvcs-patch ( $:d
2da0: 69 66 66 20 6c 65 6e 20 2d 2d 20 29 0a 20 20 61  iff len -- ).  a
2db0: 70 70 6c 79 20 70 61 74 63 68 2c 20 6c 65 6e 20  pply patch, len 
2dc0: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
2dd0: 68 65 20 72 65 73 75 6c 74 0a 2a 20 24 32 34 20  he result.* $24 
2de0: 64 76 63 73 2d 77 72 69 74 65 20 28 20 24 3a 70  dvcs-write ( $:p
2df0: 65 72 6d 2b 6e 61 6d 65 20 73 69 7a 65 20 2d 2d  erm+name size --
2e00: 20 29 0a 20 20 77 72 69 74 65 20 6f 75 74 20 66   ).  write out f
2e10: 69 6c 65 0a 2a 20 24 32 35 20 64 76 63 73 2d 75  ile.* $25 dvcs-u
2e20: 6e 7a 69 70 20 28 20 24 3a 64 69 66 66 67 7a 20  nzip ( $:diffgz 
2e30: 73 69 7a 65 20 61 6c 67 6f 20 2d 2d 20 24 3a 64  size algo -- $:d
2e40: 69 66 66 20 29 0a 20 20 75 6e 7a 69 70 20 61 6e  iff ).  unzip an
2e50: 20 6f 62 6a 65 63 74 0a 2a 20 24 32 36 20 64 76   object.* $26 dv
2e60: 63 73 2d 72 65 66 20 28 20 24 3a 68 61 73 68 2b  cs-ref ( $:hash+
2e70: 70 65 72 6d 2b 6e 61 6d 65 20 2d 2d 20 29 0a 20  perm+name -- ). 
2e80: 20 65 78 74 65 72 6e 61 6c 20 68 61 73 68 20 72   external hash r
2e90: 65 66 65 72 65 6e 63 65 0a 0a 23 23 23 20 70 61  eference..### pa
2ea0: 79 6d 65 6e 74 20 63 6f 6d 6d 61 6e 64 73 20 23  yment commands #
2eb0: 23 23 0a 0a 2a 20 24 32 30 20 70 61 79 2d 73 6f  ##..* $20 pay-so
2ec0: 75 72 63 65 20 28 20 24 3a 73 6f 75 72 63 65 20  urce ( $:source 
2ed0: 2d 2d 20 29 0a 20 20 73 6f 75 72 63 65 2c 20 70  -- ).  source, p
2ee0: 6b 5b 2b 68 61 73 68 5d 20 66 6f 72 20 6c 6f 6f  k[+hash] for loo
2ef0: 6b 75 70 0a 2a 20 24 32 31 20 70 61 79 2d 73 69  kup.* $21 pay-si
2f00: 6e 6b 20 28 20 6e 20 24 3a 73 69 67 20 2d 2d 20  nk ( n $:sig -- 
2f10: 29 0a 20 20 73 69 6e 6b 2c 20 73 69 67 6e 61 74  ).  sink, signat
2f20: 75 72 65 0a 2a 20 24 32 32 20 70 61 79 2d 61 73  ure.* $22 pay-as
2f30: 73 65 74 20 28 20 61 73 73 65 74 20 2d 2d 20 29  set ( asset -- )
2f40: 0a 20 20 73 65 6c 65 63 74 20 67 6c 6f 62 61 6c  .  select global
2f50: 20 61 73 73 65 74 20 74 79 70 65 0a 2a 20 24 32   asset type.* $2
2f60: 33 20 70 61 79 2d 6f 62 6c 69 67 61 74 69 6f 6e  3 pay-obligation
2f70: 20 28 20 24 3a 65 6e 63 2d 61 73 73 65 74 20 2d   ( $:enc-asset -
2f80: 2d 20 29 0a 20 20 73 65 6c 65 63 74 20 70 65 72  - ).  select per
2f90: 2d 63 6f 6e 74 72 61 63 74 20 6f 62 6c 69 67 61  -contract obliga
2fa0: 74 69 6f 6e 0a 2a 20 24 32 34 20 70 61 79 2d 61  tion.* $24 pay-a
2fb0: 6d 6f 75 6e 74 20 28 20 36 34 61 6d 6f 75 6e 74  mount ( 64amount
2fc0: 20 2d 2d 20 29 0a 20 20 61 64 64 2f 73 75 62 74   -- ).  add/subt
2fd0: 72 61 63 74 20 61 6d 6f 75 6e 74 20 74 6f 20 63  ract amount to c
2fe0: 75 72 72 65 6e 74 20 61 73 73 65 74 0a 2a 20 24  urrent asset.* $
2ff0: 32 35 20 70 61 79 2d 64 61 6d 6f 75 6e 74 20 28  25 pay-damount (
3000: 20 31 32 38 61 6d 6f 75 6e 74 20 2d 2d 20 29 0a   128amount -- ).
3010: 20 20 61 64 64 2f 73 75 62 74 72 61 63 74 20 31    add/subtract 1
3020: 32 38 20 62 69 74 20 61 6d 6f 75 6e 74 0a 2a 20  28 bit amount.* 
3030: 24 32 36 20 70 61 79 2d 63 6f 6d 6d 65 6e 74 20  $26 pay-comment 
3040: 28 20 24 3a 65 6e 63 2d 63 6f 6d 6d 65 6e 74 20  ( $:enc-comment 
3050: 2d 2d 20 29 0a 20 20 63 6f 6d 6d 65 6e 74 2c 20  -- ).  comment, 
3060: 65 6e 63 72 79 70 74 65 64 20 66 6f 72 20 73 65  encrypted for se
3070: 6c 65 63 74 65 64 20 6b 65 79 0a 2a 20 24 32 37  lected key.* $27
3080: 20 70 61 79 2d 62 61 6c 61 6e 63 65 20 28 20 75   pay-balance ( u
3090: 20 2d 2d 20 29 0a 20 20 73 65 6c 65 63 74 26 62   -- ).  select&b
30a0: 61 6c 61 6e 63 65 20 61 73 73 65 74 0a 2a 20 24  alance asset.* $
30b0: 32 38 20 70 61 79 2d 23 73 6f 75 72 63 65 20 28  28 pay-#source (
30c0: 20 75 20 2d 2d 20 29 0a 20 20 73 65 6c 65 63 74   u -- ).  select
30d0: 20 73 6f 75 72 63 65 0a 0a 23 23 23 20 43 6f 6e   source..### Con
30e0: 74 72 61 63 74 73 20 23 23 23 0a 0a 43 6f 6e 74  tracts ###..Cont
30f0: 72 61 63 74 73 20 61 72 65 20 73 74 61 74 65 20  racts are state 
3100: 63 68 61 6e 67 65 73 20 74 6f 20 77 61 6c 6c 65  changes to walle
3110: 74 73 2e 20 20 41 20 73 65 72 69 61 6c 69 7a 65  ts.  A serialize
3120: 64 20 77 61 6c 6c 65 74 20 69 73 20 61 20 63 6f  d wallet is a co
3130: 6e 74 72 61 63 74 0a 74 68 61 74 20 63 6f 6e 74  ntract.that cont
3140: 61 69 6e 73 20 61 6c 6c 20 74 68 65 20 63 68 61  ains all the cha
3150: 6e 67 65 73 20 66 72 6f 6d 20 61 6e 20 65 6d 70  nges from an emp
3160: 74 79 20 77 61 6c 6c 65 74 20 74 6f 20 66 69 6c  ty wallet to fil
3170: 6c 20 69 74 3b 20 69 74 20 69 73 20 6e 6f 74 0a  l it; it is not.
3180: 63 68 65 63 6b 65 64 20 66 6f 72 20 62 61 6c 61  checked for bala
3190: 6e 63 65 2e 0a 0a 41 20 64 75 6d 62 20 63 6f 6e  nce...A dumb con
31a0: 74 72 61 63 74 20 69 73 20 63 68 65 63 6b 65 64  tract is checked
31b0: 20 66 6f 72 20 62 61 6c 61 6e 63 65 2e 20 20 49   for balance.  I
31c0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 73 65  t consists of se
31d0: 76 65 72 61 6c 20 73 65 6c 65 63 74 6f 72 73 0a  veral selectors.
31e0: 28 73 6f 75 72 63 65 2f 61 63 63 6f 75 6e 74 2c  (source/account,
31f0: 20 61 73 73 65 74 29 2c 20 74 72 61 6e 73 61 63   asset), transac
3200: 74 69 6f 6e 73 20 28 61 6d 6f 75 6e 74 73 20 61  tions (amounts a
3210: 64 64 65 64 20 6f 72 20 73 75 62 74 72 61 63 74  dded or subtract
3220: 65 64 20 66 72 6f 6d 20 61 6e 0a 61 73 73 65 74  ed from an.asset
3230: 29 2c 20 63 6f 6d 6d 65 6e 74 73 20 28 65 6e 63  ), comments (enc
3240: 6f 64 65 64 20 66 6f 72 20 74 68 65 20 72 65 63  oded for the rec
3250: 65 69 76 65 72 2c 20 77 69 74 68 20 61 20 65 70  eiver, with a ep
3260: 68 65 72 6d 65 72 61 6c 20 70 75 62 6b 65 79 20  hermeral pubkey 
3270: 61 73 0a 73 74 61 72 74 20 61 6e 64 20 61 20 48  as.start and a H
3280: 4d 41 43 20 61 73 20 65 6e 64 29 2e 20 43 6f 6d  MAC as end). Com
3290: 6d 65 6e 74 73 20 61 72 65 20 66 69 78 65 64 20  ments are fixed 
32a0: 36 34 20 62 79 74 65 73 2c 20 65 69 74 68 65 72  64 bytes, either
32b0: 20 70 6c 61 69 6e 20 74 65 78 74 20 6f 72 0a 68   plain text or.h
32c0: 61 73 68 65 73 20 74 6f 20 66 69 6c 65 73 2e 20  ashes to files. 
32d0: 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 68 61   Transactions ha
32e0: 76 65 20 74 6f 20 62 61 6c 61 6e 63 65 2c 20 77  ve to balance, w
32f0: 68 69 63 68 20 69 73 20 66 61 63 69 6c 69 74 61  hich is facilita
3300: 74 65 64 20 77 69 74 68 0a 74 68 65 20 62 61 6c  ted with.the bal
3310: 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 2c 20 77 68  ance command, wh
3320: 69 63 68 20 62 61 6c 61 6e 63 65 73 20 74 68 65  ich balances the
3330: 20 73 65 6c 65 63 74 65 64 20 61 73 73 65 74 2e   selected asset.
3340: 0a 0a 54 68 65 20 73 69 67 6e 61 74 75 72 65 20  ..The signature 
3350: 6f 66 20 61 20 63 6f 6e 74 72 61 63 74 20 73 69  of a contract si
3360: 67 6e 73 20 74 68 65 20 77 61 6c 6c 65 74 27 73  gns the wallet's
3370: 20 73 74 61 74 65 20 28 73 65 72 69 61 6c 69 7a   state (serializ
3380: 65 64 20 69 6e 0a 6e 6f 72 6d 61 6c 69 7a 65 64  ed in.normalized
3390: 20 66 6f 72 6d 29 20 61 66 74 65 72 20 74 68 65   form) after the
33a0: 20 63 6f 6e 74 72 61 63 74 20 68 61 73 20 62 65   contract has be
33b0: 65 6e 20 65 78 65 63 75 74 65 64 2e 20 20 54 68  en executed.  Th
33c0: 65 20 63 75 72 72 65 6e 74 0a 63 6f 6e 74 72 61  e current.contra
33d0: 63 74 27 73 20 68 61 73 68 20 69 73 20 70 61 72  ct's hash is par
33e0: 74 20 6f 66 20 74 68 65 20 73 65 72 69 61 6c 69  t of the seriali
33f0: 7a 61 74 69 6f 6e 2e 0a                          zation..