canonical.mx raw

   1  package event
   2  
   3  import (
   4  	"crypto/sha256"
   5  
   6  	"smesh.lol/pkg/nostr/hex"
   7  	"smesh.lol/pkg/nostr/ints"
   8  	"smesh.lol/pkg/nostr/text"
   9  )
  10  
  11  func (ev *E) ToCanonical(dst []byte) (b []byte) {
  12  	b = dst
  13  	if b == nil {
  14  		size := 5 + 2*len(ev.Pubkey) + 20 + 10 + 100
  15  		if ev.Tags != nil {
  16  			for _, t := range *ev.Tags {
  17  				for _, elem := range t.T {
  18  					size += len(elem)*2 + 10
  19  				}
  20  			}
  21  		}
  22  		size += len(ev.Content)*2 + 10
  23  		b = []byte{:0:size}
  24  	}
  25  	b = append(b, "[0,\""...)
  26  	b = hex.EncAppend(b, ev.Pubkey)
  27  	b = append(b, "\","...)
  28  	b = ints.New(ev.CreatedAt).Marshal(b)
  29  	b = append(b, ',')
  30  	b = ints.New(ev.Kind).Marshal(b)
  31  	b = append(b, ',')
  32  	if ev.Tags != nil {
  33  		b = ev.Tags.Marshal(b)
  34  	} else {
  35  		b = append(b, '[', ']')
  36  	}
  37  	b = append(b, ',')
  38  	b = text.AppendQuote(b, ev.Content, text.NostrEscape)
  39  	b = append(b, ']')
  40  	return
  41  }
  42  
  43  func (ev *E) GetIDBytes() []byte { return Hash(ev.ToCanonical(nil)) }
  44  
  45  func Hash(in []byte) (out []byte) {
  46  	h := sha256.Sum256(in)
  47  	return h[:]
  48  }
  49