diff --git a/client/commands/init.go b/client/commands/init.go index fe0109372..a54dbb699 100644 --- a/client/commands/init.go +++ b/client/commands/init.go @@ -29,9 +29,10 @@ var ( //nolint const ( - SeedFlag = "seed" - HashFlag = "valhash" - GenesisFlag = "genesis" + SeedFlag = "seed" + HashFlag = "valhash" + GenesisFlag = "genesis" + FlagTrustNode = "trust-node" ConfigFile = "config.toml" ) @@ -125,6 +126,11 @@ type Runable func(cmd *cobra.Command, args []string) error // and the root command sets up viper, which is needed to find the home dir. func RequireInit(run Runable) Runable { return func(cmd *cobra.Command, args []string) error { + // otherwise, run the wrappped command + if viper.GetBool(FlagTrustNode) { + return run(cmd, args) + } + // first check if we were Init'ed and if not, return an error root := viper.GetString(cli.HomeFlag) init, err := WasInited(root) diff --git a/client/commands/proofs/get.go b/client/commands/proofs/get.go index 34638698c..c3e510b3b 100644 --- a/client/commands/proofs/get.go +++ b/client/commands/proofs/get.go @@ -26,6 +26,7 @@ import ( func GetAndParseAppProof(key []byte, data interface{}) (lc.Proof, error) { height := GetHeight() node := commands.GetNode() + prover := proofs.NewAppProver(node) proof, err := GetProof(node, prover, key, height) @@ -43,7 +44,12 @@ func GetProof(node client.Client, prover lc.Prover, key []byte, height int) (pro if err != nil { return } - ph := int(proof.BlockHeight()) + + // short-circuit with no proofs + if viper.GetBool(commands.FlagTrustNode) { + return proof, err + } + // here is the certifier, root of all knowledge cert, err := commands.GetCertifier() if err != nil { @@ -55,6 +61,7 @@ func GetProof(node client.Client, prover lc.Prover, key []byte, height int) (pro // FIXME: cannot use cert.GetByHeight for now, as it also requires // Validators and will fail on querying tendermint for non-current height. // When this is supported, we should use it instead... + ph := int(proof.BlockHeight()) client.WaitForHeight(node, ph, nil) commit, err := node.Commit(ph) if err != nil { @@ -96,7 +103,7 @@ func ParseHexKey(args []string, argname string) ([]byte, error) { } func GetHeight() int { - return viper.GetInt(heightFlag) + return viper.GetInt(FlagHeight) } type proof struct { diff --git a/client/commands/proofs/root.go b/client/commands/proofs/root.go index 15b49b8c9..b833f3da4 100644 --- a/client/commands/proofs/root.go +++ b/client/commands/proofs/root.go @@ -1,9 +1,13 @@ package proofs -import "github.com/spf13/cobra" +import ( + "github.com/spf13/cobra" + "github.com/tendermint/basecoin/client/commands" +) +// nolint const ( - heightFlag = "height" + FlagHeight = "height" ) // RootCmd represents the base command when called without any subcommands @@ -19,5 +23,8 @@ data to other peers as needed. } func init() { - RootCmd.Flags().Int(heightFlag, 0, "Height to query (skip to use latest block)") + RootCmd.PersistentFlags().Int(FlagHeight, 0, "Height to query (skip to use latest block)") + RootCmd.PersistentFlags().Bool(commands.FlagTrustNode, false, + "DANGEROUS: blindly trust all results from the server") + RootCmd.PersistentFlags().MarkHidden(commands.FlagTrustNode) } diff --git a/tests/cli/basictx.sh b/tests/cli/basictx.sh index dadc833c7..1831f76f7 100755 --- a/tests/cli/basictx.sh +++ b/tests/cli/basictx.sh @@ -69,6 +69,8 @@ test02SendTxWithFee() { # assert replay protection TX=$(echo qwertyuiop | ${CLIENT_EXE} tx send --amount=90mycoin --fee=10mycoin --sequence=2 --to=$RECV --name=$RICH 2>/dev/null) assertFalse "line=${LINENO}, replay: $TX" $? + + # checking normally checkAccount $SENDER "9007199254739900" checkAccount $RECV "1082" @@ -80,6 +82,18 @@ test02SendTxWithFee() { if assertTrue "line=${LINENO}, no nonce query" $?; then assertEquals "line=${LINENO}, proper nonce" "2" $(echo $NONCE | jq .data) fi + + # make sure this works without trust also + OLD_BC_HOME=$BC_HOME + export BC_HOME=/foo + export BC_TRUST_NODE=1 + export BC_NODE=localhost:46657 + checkSendFeeTx $HASH $TX_HEIGHT $SENDER "90" "10" + checkAccount $SENDER "9007199254739900" + checkAccount $RECV "1082" + unset BC_TRUST_NODE + unset BC_NODE + export BC_HOME=$OLD_BC_HOME }