forked from iov-one/weave
/
handler.go
75 lines (63 loc) · 2.26 KB
/
handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package validators
import (
"github.com/iov-one/weave"
"github.com/iov-one/weave/errors"
"github.com/iov-one/weave/x"
abci "github.com/tendermint/tendermint/abci/types"
)
type AuthCheckAddress = func(auth x.Authenticator, ctx weave.Context) CheckAddress
var authCheckAddress = func(auth x.Authenticator, ctx weave.Context) CheckAddress {
return func(addr weave.Address) bool {
return auth.HasAddress(ctx, addr)
}
}
// RegisterRoutes will instantiate and register
// all handlers in this package.
func RegisterRoutes(r weave.Registry, auth x.Authenticator,
control Controller) {
r.Handle(pathUpdate, NewUpdateHandler(auth, control, authCheckAddress))
}
// RegisterQuery will register this bucket as "/validators".
func RegisterQuery(qr weave.QueryRouter) {
NewBucket().Register("validators", qr)
}
// UpdateHandler will handle sending coins.
type UpdateHandler struct {
auth x.Authenticator
control Controller
authCheckAddress AuthCheckAddress
}
var _ weave.Handler = UpdateHandler{}
// NewUpdateHandler creates a handler for SendMsg.
func NewUpdateHandler(auth x.Authenticator, control Controller, checkAddr AuthCheckAddress) UpdateHandler {
return UpdateHandler{
auth: auth,
control: control,
authCheckAddress: checkAddr,
}
}
// Check verifies all the preconditions.
func (h UpdateHandler) Check(ctx weave.Context, store weave.KVStore, tx weave.Tx) (weave.CheckResult, error) {
var res weave.CheckResult
_, err := h.validate(ctx, store, tx)
return res, err
}
// Deliver provides the diff given everything is okay with permissions and such
// Check did the same job already, so we can assume stuff goes okay.
func (h UpdateHandler) Deliver(ctx weave.Context, store weave.KVStore, tx weave.Tx) (weave.DeliverResult, error) {
// ensure type and validate...
var res weave.DeliverResult
diff, err := h.validate(ctx, store, tx)
if err != nil {
return res, err
}
res.Diff = diff
return res, nil
}
func (h UpdateHandler) validate(ctx weave.Context, store weave.KVStore, tx weave.Tx) ([]abci.ValidatorUpdate, error) {
var msg SetValidatorsMsg
if err := weave.LoadMsg(tx, &msg); err != nil {
return nil, errors.Wrap(err, "load msg")
}
return h.control.CanUpdateValidators(store, h.authCheckAddress(h.auth, ctx), msg.AsABCI())
}