cosmos-sdk/handlers/sigs.go

67 lines
1.6 KiB
Go
Raw Normal View History

package handlers
import (
crypto "github.com/tendermint/go-crypto"
"github.com/tendermint/basecoin"
"github.com/tendermint/basecoin/errors"
"github.com/tendermint/basecoin/types"
)
// app name for auth
const (
NameSigs = "sigs"
)
type SignedHandler struct {
AllowMultiSig bool
}
func (_ SignedHandler) Name() string {
return NameSigs
}
2017-06-27 10:40:48 -07:00
var _ basecoin.Middleware = SignedHandler{}
2017-06-27 10:40:48 -07:00
// Signed allows us to use txs.OneSig and txs.MultiSig (and others??)
type Signed interface {
basecoin.TxLayer
Signers() ([]crypto.PubKey, error)
}
2017-06-27 10:40:48 -07:00
func (h SignedHandler) CheckTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx, next basecoin.Checker) (res basecoin.Result, err error) {
sigs, tnext, err := getSigners(tx)
if err != nil {
return res, err
}
ctx2 := addSigners(ctx, sigs)
2017-06-27 10:40:48 -07:00
return next.CheckTx(ctx2, store, tnext)
}
2017-06-27 10:40:48 -07:00
func (h SignedHandler) DeliverTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx, next basecoin.Deliver) (res basecoin.Result, err error) {
sigs, tnext, err := getSigners(tx)
if err != nil {
return res, err
}
ctx2 := addSigners(ctx, sigs)
2017-06-27 10:40:48 -07:00
return next.DeliverTx(ctx2, store, tnext)
}
func addSigners(ctx basecoin.Context, sigs []crypto.PubKey) basecoin.Context {
perms := make([]basecoin.Permission, len(sigs))
for i, s := range sigs {
perms[i] = basecoin.Permission{App: NameSigs, Address: s.Address()}
}
// add the signers to the context and continue
return ctx.AddPermissions(perms...)
}
2017-06-27 10:40:48 -07:00
func getSigners(tx basecoin.Tx) ([]crypto.PubKey, basecoin.Tx, error) {
stx, ok := tx.Unwrap().(Signed)
if !ok {
return nil, basecoin.Tx{}, errors.Unauthorized()
}
sig, err := stx.Signers()
return sig, stx.Next(), err
}