diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e57b8a32..1cadfc352 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -109,6 +109,7 @@ FEATURES - Auth has its invariants checked within the framework * [tests] Add WaitForNextNBlocksTM helper method * [keys] New keys now have 24 word recovery keys, for heightened security +- [keys] Add a temporary method for exporting the private key IMPROVEMENTS * [x/bank] Now uses go-wire codec instead of 'encoding/json' diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 645a6c276..e37e4d521 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -49,7 +49,7 @@ func TestGaiaCLISend(t *testing.T) { defer proc.Stop(false) tests.WaitForTMStart(port) - tests.WaitForNextHeightTM(port) + tests.WaitForNextNBlocksTM(2, port) fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) barAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome)) @@ -58,7 +58,7 @@ func TestGaiaCLISend(t *testing.T) { require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak").Int64()) executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%s --from=foo", flags, barAddr), pass) - tests.WaitForNextHeightTM(port) + tests.WaitForNextNBlocksTM(2, port) barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", barAddr, flags)) require.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak").Int64()) @@ -67,7 +67,7 @@ func TestGaiaCLISend(t *testing.T) { // test autosequencing executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%s --from=foo", flags, barAddr), pass) - tests.WaitForNextHeightTM(port) + tests.WaitForNextNBlocksTM(2, port) barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", barAddr, flags)) require.Equal(t, int64(20), barAcc.GetCoins().AmountOf("steak").Int64()) @@ -76,7 +76,7 @@ func TestGaiaCLISend(t *testing.T) { // test memo executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%s --from=foo --memo 'testmemo'", flags, barAddr), pass) - tests.WaitForNextHeightTM(port) + tests.WaitForNextNBlocksTM(2, port) barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", barAddr, flags)) require.Equal(t, int64(30), barAcc.GetCoins().AmountOf("steak").Int64()) @@ -101,14 +101,14 @@ func TestGaiaCLICreateValidator(t *testing.T) { defer proc.Stop(false) tests.WaitForTMStart(port) - tests.WaitForNextHeightTM(port) + tests.WaitForNextNBlocksTM(2, port) fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) barAddr, barPubKey := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome)) barCeshPubKey := sdk.MustBech32ifyValPub(barPubKey) executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%s --from=foo", flags, barAddr), pass) - tests.WaitForNextHeightTM(port) + tests.WaitForNextNBlocksTM(2, port) barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", barAddr, flags)) require.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak").Int64()) @@ -124,7 +124,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { cvStr += fmt.Sprintf(" --moniker=%v", "bar-vally") executeWrite(t, cvStr, pass) - tests.WaitForNextHeightTM(port) + tests.WaitForNextNBlocksTM(2, port) barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", barAddr, flags)) require.Equal(t, int64(8), barAcc.GetCoins().AmountOf("steak").Int64(), "%v", barAcc) @@ -142,7 +142,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { success := executeWrite(t, unbondStr, pass) require.True(t, success) - tests.WaitForNextHeightTM(port) + tests.WaitForNextNBlocksTM(2, port) /* // this won't be what we expect because we've only started unbonding, haven't completed barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) @@ -169,7 +169,7 @@ func TestGaiaCLISubmitProposal(t *testing.T) { defer proc.Stop(false) tests.WaitForTMStart(port) - tests.WaitForNextHeightTM(port) + tests.WaitForNextNBlocksTM(2, port) fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) @@ -177,7 +177,7 @@ func TestGaiaCLISubmitProposal(t *testing.T) { require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak").Int64()) executeWrite(t, fmt.Sprintf("gaiacli gov submit-proposal %v --proposer=%s --deposit=5steak --type=Text --title=Test --description=test --from=foo", flags, fooAddr), pass) - tests.WaitForNextHeightTM(port) + tests.WaitForNextNBlocksTM(2, port) fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", fooAddr, flags)) require.Equal(t, int64(45), fooAcc.GetCoins().AmountOf("steak").Int64()) @@ -187,7 +187,7 @@ func TestGaiaCLISubmitProposal(t *testing.T) { require.Equal(t, gov.StatusDepositPeriod, proposal1.GetStatus()) executeWrite(t, fmt.Sprintf("gaiacli gov deposit %v --depositer=%s --deposit=10steak --proposalID=1 --from=foo", flags, fooAddr), pass) - tests.WaitForNextHeightTM(port) + tests.WaitForNextNBlocksTM(2, port) fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", fooAddr, flags)) require.Equal(t, int64(35), fooAcc.GetCoins().AmountOf("steak").Int64()) @@ -196,7 +196,7 @@ func TestGaiaCLISubmitProposal(t *testing.T) { require.Equal(t, gov.StatusVotingPeriod, proposal1.GetStatus()) executeWrite(t, fmt.Sprintf("gaiacli gov vote %v --proposalID=1 --voter=%s --option=Yes --from=foo", flags, fooAddr), pass) - tests.WaitForNextHeightTM(port) + tests.WaitForNextNBlocksTM(2, port) vote := executeGetVote(t, fmt.Sprintf("gaiacli gov query-vote --proposalID=1 --voter=%s --output=json %v", fooAddr, flags)) require.Equal(t, int64(1), vote.ProposalID) diff --git a/crypto/keys/keybase.go b/crypto/keys/keybase.go index 80de47d3d..ef2c6243a 100644 --- a/crypto/keys/keybase.go +++ b/crypto/keys/keybase.go @@ -240,6 +240,31 @@ func (kb dbKeybase) Sign(name, passphrase string, msg []byte) (sig tcrypto.Signa return sig, pub, nil } +func (kb dbKeybase) ExportPrivateKeyObject(name string, passphrase string) (tcrypto.PrivKey, error) { + info, err := kb.Get(name) + if err != nil { + return nil, err + } + var priv tcrypto.PrivKey + switch info.(type) { + case localInfo: + linfo := info.(localInfo) + if linfo.PrivKeyArmor == "" { + err = fmt.Errorf("private key not available") + return nil, err + } + priv, err = unarmorDecryptPrivKey(linfo.PrivKeyArmor, passphrase) + if err != nil { + return nil, err + } + case ledgerInfo: + return nil, errors.New("Only works on local private keys") + case offlineInfo: + return nil, errors.New("Only works on local private keys") + } + return priv, nil +} + func (kb dbKeybase) Export(name string) (armor string, err error) { bz := kb.db.Get(infoKey(name)) if bz == nil { diff --git a/crypto/keys/types.go b/crypto/keys/types.go index 74cedf919..c3f5d7834 100644 --- a/crypto/keys/types.go +++ b/crypto/keys/types.go @@ -39,6 +39,9 @@ type Keybase interface { ImportPubKey(name string, armor string) (err error) Export(name string) (armor string, err error) ExportPubKey(name string) (armor string, err error) + + // *only* works on locally-stored keys. Temporary method until we redo the exporting API + ExportPrivateKeyObject(name string, passphrase string) (crypto.PrivKey, error) } // Info is the publicly exposed information about a keypair