cosmos-sdk/modules/nonce/tx.go

86 lines
1.7 KiB
Go
Raw Normal View History

2017-07-11 17:00:39 -07:00
/*
Package nonce XXX
*/
package nonce
import (
2017-07-12 02:02:16 -07:00
"sort"
2017-07-11 17:00:39 -07:00
"github.com/tendermint/basecoin"
2017-07-12 02:02:16 -07:00
"github.com/tendermint/basecoin/errors"
"github.com/tendermint/basecoin/state"
"github.com/tendermint/tmlibs/merkle"
2017-07-11 17:00:39 -07:00
)
// nolint
const (
2017-07-12 02:02:16 -07:00
ByteNonce = 0x69 //TODO overhaul byte assign system don't make no sense!
TypeNonce = "nonce"
2017-07-11 17:00:39 -07:00
)
2017-07-12 02:02:16 -07:00
func init() {
basecoin.TxMapper.RegisterImplementation(&Tx{}, TypeNonce, ByteNonce)
}
2017-07-11 17:00:39 -07:00
// Tx - XXX fill in
type Tx struct {
Tx basecoin.Tx `json:p"tx"`
Sequence uint32
Signers []basecoin.Actor // or simple []data.Bytes (they are only pubkeys...)
2017-07-12 02:02:16 -07:00
seqKey []byte //key to store the sequence number
2017-07-11 17:00:39 -07:00
}
var _ basecoin.TxInner = &Tx{}
// NewTx wraps the tx with a signable nonce
2017-07-12 02:02:16 -07:00
func NewTx(tx basecoin.Tx, sequence uint32, signers []basecoin.Actor) basecoin.Tx {
//Generate the sequence key as the hash of the list of signers, sorted by address
sort.Sort(basecoin.ByAddress(signers))
seqKey := merkle.SimpleHashFromBinary(signers)
return (Tx{
2017-07-11 17:00:39 -07:00
Tx: tx,
Sequence: sequence,
Signers: signers,
2017-07-12 02:02:16 -07:00
seqKey: seqKey,
}).Wrap()
2017-07-11 17:00:39 -07:00
}
//nolint
2017-07-12 02:02:16 -07:00
func (n Tx) Wrap() basecoin.Tx {
return basecoin.Tx{n}
2017-07-11 17:00:39 -07:00
}
2017-07-12 02:02:16 -07:00
func (n Tx) ValidateBasic() error {
return n.Tx.ValidateBasic()
2017-07-11 17:00:39 -07:00
}
2017-07-12 02:02:16 -07:00
// CheckIncrementSeq - XXX fill in
func (n Tx) CheckIncrementSeq(ctx basecoin.Context, store state.KVStore) error {
2017-07-11 17:00:39 -07:00
// check the current state
2017-07-12 02:02:16 -07:00
cur, err := getSeq(store, n.seqKey)
if err != nil {
return err
}
2017-07-11 17:00:39 -07:00
if n.Sequence != cur+1 {
2017-07-12 02:02:16 -07:00
return errors.ErrBadNonce()
2017-07-11 17:00:39 -07:00
}
// make sure they all signed
for _, s := range n.Signers {
if !ctx.HasPermission(s) {
2017-07-12 02:02:16 -07:00
return errors.ErrNotMember()
2017-07-11 17:00:39 -07:00
}
}
2017-07-12 02:02:16 -07:00
//finally increment the sequence by 1
err = setSeq(store, n.seqKey, cur+1)
if err != nil {
return err
}
2017-07-11 17:00:39 -07:00
return nil
}