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