Merge pull request #621 from cosmos/bucky/fix-cli-for-sign-doc

fix cli to sign StdSignDoc. fixes #620
This commit is contained in:
Ethan Buchman 2018-03-14 14:14:06 +01:00 committed by GitHub
commit 8c2dce7c3b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 50 additions and 8 deletions

View File

@ -88,7 +88,7 @@ func GetFromAddress() (from sdk.Address, err error) {
}
// sign and build the transaction from the msg
func SignAndBuild(msg sdk.Msg, cdc *wire.Codec) ([]byte, error) {
func SignAndBuild(signMsg sdk.StdSignMsg, cdc *wire.Codec) ([]byte, error) {
keybase, err := keys.GetKeyBase()
if err != nil {
@ -97,7 +97,7 @@ func SignAndBuild(msg sdk.Msg, cdc *wire.Codec) ([]byte, error) {
name := viper.GetString(client.FlagName)
// sign and build
bz := msg.GetSignBytes()
bz := signMsg.Bytes()
buf := client.BufferStdin()
prompt := fmt.Sprintf("Password to sign with '%s':", name)
passphrase, err := client.GetPassword(prompt, buf)
@ -115,14 +115,14 @@ func SignAndBuild(msg sdk.Msg, cdc *wire.Codec) ([]byte, error) {
}}
// marshal bytes
tx := sdk.NewStdTx(msg, sigs)
tx := sdk.NewStdTx(signMsg.Msg, sigs)
return cdc.MarshalBinary(tx)
}
// sign and build the transaction from the msg
func SignBuildBroadcast(msg sdk.Msg, cdc *wire.Codec) (*ctypes.ResultBroadcastTxCommit, error) {
txBytes, err := SignAndBuild(msg, cdc)
func SignBuildBroadcast(signMsg sdk.StdSignMsg, cdc *wire.Codec) (*ctypes.ResultBroadcastTxCommit, error) {
txBytes, err := SignAndBuild(signMsg, cdc)
if err != nil {
return nil, err
}

View File

@ -5,8 +5,11 @@ import (
"github.com/pkg/errors"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/builder"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/wire"
"github.com/cosmos/cosmos-sdk/examples/basecoin/x/cool"
@ -30,9 +33,17 @@ func QuizTxCmd(cdc *wire.Codec) *cobra.Command {
// create the message
msg := cool.NewQuizMsg(from, args[0])
chainID := viper.GetString(client.FlagChainID)
sequence := int64(viper.GetInt(client.FlagSequence))
signMsg := sdk.StdSignMsg{
ChainID: chainID,
Sequences: []int64{sequence},
Msg: msg,
}
// build and sign the transaction, then broadcast to Tendermint
res, err := builder.SignBuildBroadcast(msg, cdc)
res, err := builder.SignBuildBroadcast(signMsg, cdc)
if err != nil {
return err
}
@ -61,9 +72,17 @@ func SetTrendTxCmd(cdc *wire.Codec) *cobra.Command {
// create the message
msg := cool.NewSetTrendMsg(from, args[0])
chainID := viper.GetString(client.FlagChainID)
sequence := int64(viper.GetInt(client.FlagSequence))
signMsg := sdk.StdSignMsg{
ChainID: chainID,
Sequences: []int64{sequence},
Msg: msg,
}
// build and sign the transaction, then broadcast to Tendermint
res, err := builder.SignBuildBroadcast(msg, cdc)
res, err := builder.SignBuildBroadcast(signMsg, cdc)
if err != nil {
return err
}

View File

@ -80,6 +80,19 @@ type StdSignDoc struct {
AltBytes []byte `json:"alt_bytes"` // TODO: do we really want this ?
}
// StdSignMsg is a convenience structure for passing along
// a Msg with the other requirements for a StdSignDoc before
// it is signed. For use in the CLI
type StdSignMsg struct {
ChainID string
Sequences []int64
Msg Msg
}
func (msg StdSignMsg) Bytes() []byte {
return StdSignBytes(msg.ChainID, msg.Sequences, msg.Msg)
}
func StdSignBytes(chainID string, sequences []int64, msg Msg) []byte {
bz, err := json.Marshal(StdSignDoc{
ChainID: chainID,

View File

@ -7,6 +7,7 @@ import (
"github.com/spf13/cobra"
"github.com/spf13/viper"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/builder"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/wire"
@ -50,8 +51,17 @@ func (c commander) sendTxCmd(cmd *cobra.Command, args []string) error {
return err
}
chainID := viper.GetString(client.FlagChainID)
sequence := int64(viper.GetInt(client.FlagSequence))
signMsg := sdk.StdSignMsg{
ChainID: chainID,
Sequences: []int64{sequence},
Msg: msg,
}
// build and sign the transaction, then broadcast to Tendermint
res, err := builder.SignBuildBroadcast(msg, c.cdc)
res, err := builder.SignBuildBroadcast(signMsg, c.cdc)
if err != nil {
return err
}