@@ -23,6 +23,7 @@ import (
23
23
"time"
24
24
25
25
"github.com/mailchain/mailchain/cmd/internal/http/params"
26
+ "github.com/mailchain/mailchain/crypto/cipher"
26
27
"github.com/mailchain/mailchain/encoding"
27
28
"github.com/mailchain/mailchain/errs"
28
29
"github.com/mailchain/mailchain/internal/addressing"
@@ -72,6 +73,7 @@ func GetMessages(receivers map[string]mailbox.Receiver, inbox stores.State, cach
72
73
return
73
74
}
74
75
76
+ decrypters := map [byte ]cipher.Decrypter {}
75
77
messages := make ([]getMessage , len (txs ))
76
78
77
79
for i , tx := range txs {
@@ -94,14 +96,14 @@ func GetMessages(receivers map[string]mailbox.Receiver, inbox stores.State, cach
94
96
continue
95
97
}
96
98
97
- decrypter , err := ks . GetDecrypter ( req .addressBytes , req .Protocol , req .Network , decrypterKind , deriveKeyOptions )
99
+ decrypter , err := getDecrypter ( decrypters , decrypterKind , ks , req .addressBytes , req .Protocol , req .Network , deriveKeyOptions )
98
100
if err != nil {
99
101
messages [i ] = getMessage {Status : errors .WithMessage (err , "could not get `decrypter`" ).Error (), BlockID : blockID , BlockIDEncoding : blockIDEncoding }
100
102
101
103
continue
102
104
}
103
105
104
- message , err := mailbox .ReadMessage (tx .EnvelopeData , decrypter , cache )
106
+ message , err := mailbox .ReadMessage (tx .EnvelopeData , decrypter [ decrypterKind ] , cache )
105
107
if err != nil {
106
108
messages [i ] = getMessage {Status : errors .WithMessage (err , "could not read message" ).Error (), BlockID : blockID , BlockIDEncoding : blockIDEncoding }
107
109
@@ -145,6 +147,22 @@ func GetMessages(receivers map[string]mailbox.Receiver, inbox stores.State, cach
145
147
}
146
148
}
147
149
150
+ // getting a decrypted from key store can take ~800ms, this reduces the number of times it's fetched
151
+ func getDecrypter (decrypters map [byte ]cipher.Decrypter , kind byte , ks keystore.Store , address []byte , protocol , network string , deriveKeyOptions multi.OptionsBuilders ) (map [byte ]cipher.Decrypter , error ) {
152
+ if _ , ok := decrypters [kind ]; ok {
153
+ return decrypters , nil
154
+ }
155
+
156
+ decrypter , err := ks .GetDecrypter (address , protocol , network , kind , deriveKeyOptions )
157
+ if err != nil {
158
+ return nil , errors .WithMessage (err , "could not get `decrypter`" )
159
+ }
160
+
161
+ decrypters [kind ] = decrypter
162
+
163
+ return decrypters , nil
164
+ }
165
+
148
166
func fetchMessages (ctx context.Context , protocol , network string , address []byte , receivers map [string ]mailbox.Receiver , inbox stores.State ) error {
149
167
receiver , ok := receivers [fmt .Sprintf ("%s/%s" , protocol , network )]
150
168
if ! ok {
0 commit comments