From 0ec599d634d955d95f54ba0143c2457c48c3eb2c Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 25 Jun 2018 16:03:17 -0400 Subject: [PATCH 01/16] update to tendermint v0.21.0 --- CHANGELOG.md | 11 +++++++++++ Gopkg.lock | 21 +++++++++++---------- Gopkg.toml | 6 +++--- version/version.go | 4 ++-- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4428f7a4c..e3de08a74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## 0.19.1 + +*June 25, 2018* + +* Update to Tendermint v0.21.0 (fixes websocket memory leak and a few other + things) + +BREAKING CHANGES: +* Changes the default ports from `4665X` to `2665X` + + ## 0.19.0 *June 13, 2018* diff --git a/Gopkg.lock b/Gopkg.lock index 07a3c6d5b..7a04f9c09 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -256,7 +256,7 @@ "leveldb/table", "leveldb/util" ] - revision = "e2150783cd35f5b607daca48afd8c57ec54cc995" + revision = "0d5a0ceb10cf9ab89fdd744cc8c50a83134f6697" [[projects]] name = "github.com/tendermint/abci" @@ -267,8 +267,8 @@ "server", "types" ] - revision = "ebee2fe114020aa49c70bbbae50b7079fc7e7b90" - version = "v0.11.0" + revision = "198dccf0ddfd1bb176f87657e3286a05a6ed9540" + version = "v0.12.0" [[projects]] branch = "master" @@ -347,8 +347,8 @@ "types", "version" ] - revision = "27bd1deabe4ba6a2d9b463b8f3e3f1e31b993e61" - version = "v0.20.0" + revision = "46369a1ab76f274ab47179c4176221842b8207b4" + version = "v0.21.0" [[projects]] branch = "develop" @@ -366,7 +366,7 @@ "merkle", "merkle/tmhash" ] - revision = "0c98d10b4ffbd87978d79c160e835b3d3df241ec" + revision = "56f44670ebd5a4e99e55f3f7d6f4d360ef5f1973" [[projects]] branch = "master" @@ -374,6 +374,7 @@ packages = [ "blowfish", "curve25519", + "internal/subtle", "nacl/box", "nacl/secretbox", "openpgp/armor", @@ -382,7 +383,7 @@ "ripemd160", "salsa20/salsa" ] - revision = "8ac0e0d97ce45cd83d1d7243c060cb8461dda5e9" + revision = "a49355c7e3f8fe157a85be2f77e6e269a0f89602" [[projects]] branch = "master" @@ -396,13 +397,13 @@ "internal/timeseries", "trace" ] - revision = "db08ff08e8622530d9ed3a0e8ac279f6d4c02196" + revision = "afe8f62b1d6bbd81f31868121a50b06d8188e1f9" [[projects]] branch = "master" name = "golang.org/x/sys" packages = ["unix"] - revision = "bff228c7b664c5fce602223a05fb708fd8654986" + revision = "a200a19cb90b19de298170992778b1fda7217bd6" [[projects]] name = "golang.org/x/text" @@ -463,6 +464,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "31f69b235b2d8f879a215c9e8ca0919adc62d21f6830b17931a3a0efb058721f" + inputs-digest = "1b1b1e09e57cf232477c26f253890f97a94fab95bcfcd26c834db7b4fbbab45a" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 77de1b78d..2c0d378ed 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -54,7 +54,7 @@ [[constraint]] name = "github.com/tendermint/abci" - version = "=0.11.0" + version = "=0.12.0" [[constraint]] name = "github.com/tendermint/go-crypto" @@ -68,9 +68,9 @@ name = "github.com/tendermint/iavl" version = "0.8.0-rc0" -[[constraint]] +[[override]] name = "github.com/tendermint/tendermint" - version = "=0.20.0" + version = "=0.21.0" [[override]] name = "github.com/tendermint/tmlibs" diff --git a/version/version.go b/version/version.go index e24ef62f1..cb866a001 100644 --- a/version/version.go +++ b/version/version.go @@ -7,9 +7,9 @@ package version const Maj = "0" const Min = "19" -const Fix = "0" +const Fix = "1" -const Version = "0.19.0" +const Version = "0.19.1" // GitCommit set by build flags var GitCommit = "" From 12f71876e845f2e81238a4287578949a2bf1ca24 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 25 Jun 2018 16:42:29 -0400 Subject: [PATCH 02/16] update dep --- Gopkg.lock | 6 +++--- Gopkg.toml | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 7a04f9c09..21e9c44bb 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -351,7 +351,6 @@ version = "v0.21.0" [[projects]] - branch = "develop" name = "github.com/tendermint/tmlibs" packages = [ "autofile", @@ -366,7 +365,8 @@ "merkle", "merkle/tmhash" ] - revision = "56f44670ebd5a4e99e55f3f7d6f4d360ef5f1973" + revision = "49596e0a1f48866603813df843c9409fc19805c6" + version = "v0.9.0" [[projects]] branch = "master" @@ -464,6 +464,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "1b1b1e09e57cf232477c26f253890f97a94fab95bcfcd26c834db7b4fbbab45a" + inputs-digest = "3a437ed2c22314c3762584ff52c76a58916fd9e9fef00035aa01ae65bce08637" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 2c0d378ed..ff7f2bbd4 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -52,21 +52,21 @@ name = "github.com/stretchr/testify" version = "~1.2.1" -[[constraint]] +[[override]] name = "github.com/tendermint/abci" version = "=0.12.0" -[[constraint]] +[[override]] name = "github.com/tendermint/go-crypto" - version = "~0.6.2" + version = "=0.6.2" -[[constraint]] +[[override]] name = "github.com/tendermint/go-amino" version = "=0.9.9" -[[constraint]] +[[override]] name = "github.com/tendermint/iavl" - version = "0.8.0-rc0" + version = "=0.8.0-rc0" [[override]] name = "github.com/tendermint/tendermint" @@ -74,7 +74,7 @@ [[override]] name = "github.com/tendermint/tmlibs" - branch = "develop" + version = "=v0.9.0" # this got updated and broke, so locked to an old working commit ... [[override]] From 7487f67346d64295907c020df5cac967389e1daa Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Thu, 7 Jun 2018 03:24:09 -0700 Subject: [PATCH 03/16] Use new tmlibs/common.Error for sdk.Error --- baseapp/baseapp.go | 4 +- examples/democoin/x/cool/types.go | 8 ++-- types/errors.go | 78 +++++++++++++------------------ x/bank/msgs.go | 14 +++--- x/ibc/types.go | 2 +- 5 files changed, 45 insertions(+), 61 deletions(-) diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index 4d32b92f5..e2159aa29 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -87,7 +87,6 @@ func NewBaseApp(name string, cdc *wire.Codec, logger log.Logger, db dbm.DB) *Bas txDecoder: defaultTxDecoder(cdc), } // Register the undefined & root codespaces, which should not be used by any modules - app.codespacer.RegisterOrPanic(sdk.CodespaceUndefined) app.codespacer.RegisterOrPanic(sdk.CodespaceRoot) return app } @@ -137,7 +136,7 @@ func defaultTxDecoder(cdc *wire.Codec) sdk.TxDecoder { // are registered by MakeTxCodec err := cdc.UnmarshalBinary(txBytes, &tx) if err != nil { - return nil, sdk.ErrTxDecode("").Trace(err.Error()) + return nil, sdk.ErrTxDecode("").TraceSDK(err.Error()) } return tx, nil } @@ -486,7 +485,6 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte, tx sdk.Tx) (result sdk // Validate the Msg. err := msg.ValidateBasic() if err != nil { - err = err.WithDefaultCodespace(sdk.CodespaceRoot) return err.Result() } diff --git a/examples/democoin/x/cool/types.go b/examples/democoin/x/cool/types.go index b8640b211..77f49a0ba 100644 --- a/examples/democoin/x/cool/types.go +++ b/examples/democoin/x/cool/types.go @@ -41,13 +41,13 @@ func (msg MsgSetTrend) String() string { // Validate Basic is used to quickly disqualify obviously invalid messages quickly func (msg MsgSetTrend) ValidateBasic() sdk.Error { if len(msg.Sender) == 0 { - return sdk.ErrUnknownAddress(msg.Sender.String()).Trace("") + return sdk.ErrUnknownAddress(msg.Sender.String()).TraceSDK("") } if strings.Contains(msg.Cool, "hot") { - return sdk.ErrUnauthorized("").Trace("hot is not cool") + return sdk.ErrUnauthorized("").TraceSDK("hot is not cool") } if strings.Contains(msg.Cool, "warm") { - return sdk.ErrUnauthorized("").Trace("warm is not very cool") + return sdk.ErrUnauthorized("").TraceSDK("warm is not very cool") } return nil } @@ -91,7 +91,7 @@ func (msg MsgQuiz) String() string { // Validate Basic is used to quickly disqualify obviously invalid messages quickly func (msg MsgQuiz) ValidateBasic() sdk.Error { if len(msg.Sender) == 0 { - return sdk.ErrUnknownAddress(msg.Sender.String()).Trace("") + return sdk.ErrUnknownAddress(msg.Sender.String()).TraceSDK("") } return nil } diff --git a/types/errors.go b/types/errors.go index 20d452464..65c258b0c 100644 --- a/types/errors.go +++ b/types/errors.go @@ -55,10 +55,7 @@ const ( CodeOutOfGas CodeType = 12 // CodespaceRoot is a codespace for error codes in this file only. - // Notice that 0 is an "unset" codespace, which can be overridden with - // Error.WithDefaultCodespace(). - CodespaceUndefined CodespaceType = 0 - CodespaceRoot CodespaceType = 1 + CodespaceRoot CodespaceType = 1 // Maximum reservable codespace (2^16 - 1) MaximumCodespace CodespaceType = 65535 @@ -141,49 +138,64 @@ func ErrOutOfGas(msg string) Error { //---------------------------------------- // Error & sdkError +type cmnError = cmn.Error + // sdk Error type type Error interface { - Error() string + // Implements cmn.Error + // Error() string + // Stacktrace() cmn.Error + // Trace(offset int, format string, args ...interface{}) cmn.Error + // Data() interface{} + cmnError + + // convenience + TraceSDK(format string, args ...interface{}) Error + Code() CodeType Codespace() CodespaceType ABCILog() string ABCICode() ABCICodeType - WithDefaultCodespace(codespace CodespaceType) Error - Trace(msg string) Error - T() interface{} Result() Result QueryResult() abci.ResponseQuery } -// NewError - create an error -func NewError(codespace CodespaceType, code CodeType, msg string) Error { - return newError(codespace, code, msg) +// NewError - create an error. +func NewError(codespace CodespaceType, code CodeType, format string, args ...interface{}) Error { + return newError(codespace, code, format, args...) } -func newErrorWithRootCodespace(code CodeType, msg string) *sdkError { - return newError(CodespaceRoot, code, msg) +func newErrorWithRootCodespace(code CodeType, format string, args ...interface{}) *sdkError { + return newError(CodespaceRoot, code, format, args...) } -func newError(codespace CodespaceType, code CodeType, msg string) *sdkError { - if msg == "" { - msg = CodeToDefaultMsg(code) +func newError(codespace CodespaceType, code CodeType, format string, args ...interface{}) *sdkError { + if format == "" { + format = CodeToDefaultMsg(code) } return &sdkError{ codespace: codespace, code: code, - err: cmn.NewErrorWithT(code, msg), + cmnError: cmn.NewError(format, args...), } } type sdkError struct { codespace CodespaceType code CodeType - err cmn.Error + cmnError } // Implements ABCIError. +func (err *sdkError) TraceSDK(format string, args ...interface{}) Error { + err.Trace(1, format, args...) + return err +} + +// Implements ABCIError. +// Overrides err.Error.Error(). func (err *sdkError) Error() string { - return fmt.Sprintf("Error{%d:%d,%#v}", err.codespace, err.code, err.err) + return fmt.Sprintf("Error{%d:%d,%#v}", err.codespace, err.code, err.cmnError) } // Implements ABCIError. @@ -209,33 +221,7 @@ Code: %v ABCICode: %v Error: %#v === /ABCI Log === -`, err.codespace, err.code, err.ABCICode(), err.err) -} - -// Add tracing information with msg. -func (err *sdkError) Trace(msg string) Error { - return &sdkError{ - codespace: err.codespace, - code: err.code, - err: err.err.Trace(msg), - } -} - -// Implements Error. -func (err *sdkError) WithDefaultCodespace(cs CodespaceType) Error { - codespace := err.codespace - if codespace == CodespaceUndefined { - codespace = cs - } - return &sdkError{ - codespace: codespace, - code: err.code, - err: err.err, - } -} - -func (err *sdkError) T() interface{} { - return err.err.T() +`, err.codespace, err.code, err.ABCICode(), err.cmnError) } func (err *sdkError) Result() Result { diff --git a/x/bank/msgs.go b/x/bank/msgs.go index 48e62d835..1a871979e 100644 --- a/x/bank/msgs.go +++ b/x/bank/msgs.go @@ -27,28 +27,28 @@ func (msg MsgSend) ValidateBasic() sdk.Error { // this just makes sure all the inputs and outputs are properly formatted, // not that they actually have the money inside if len(msg.Inputs) == 0 { - return ErrNoInputs(DefaultCodespace).Trace("") + return ErrNoInputs(DefaultCodespace).TraceSDK("") } if len(msg.Outputs) == 0 { - return ErrNoOutputs(DefaultCodespace).Trace("") + return ErrNoOutputs(DefaultCodespace).TraceSDK("") } // make sure all inputs and outputs are individually valid var totalIn, totalOut sdk.Coins for _, in := range msg.Inputs { if err := in.ValidateBasic(); err != nil { - return err.Trace("") + return err.TraceSDK("") } totalIn = totalIn.Plus(in.Coins) } for _, out := range msg.Outputs { if err := out.ValidateBasic(); err != nil { - return err.Trace("") + return err.TraceSDK("") } totalOut = totalOut.Plus(out.Coins) } // make sure inputs and outputs match if !totalIn.IsEqual(totalOut) { - return sdk.ErrInvalidCoins(totalIn.String()).Trace("inputs and outputs don't match") + return sdk.ErrInvalidCoins(totalIn.String()).TraceSDK("inputs and outputs don't match") } return nil } @@ -107,11 +107,11 @@ func (msg MsgIssue) Type() string { return "bank" } // TODO: "bank/issue" func (msg MsgIssue) ValidateBasic() sdk.Error { // XXX if len(msg.Outputs) == 0 { - return ErrNoOutputs(DefaultCodespace).Trace("") + return ErrNoOutputs(DefaultCodespace).TraceSDK("") } for _, out := range msg.Outputs { if err := out.ValidateBasic(); err != nil { - return err.Trace("") + return err.TraceSDK("") } } return nil diff --git a/x/ibc/types.go b/x/ibc/types.go index 4924aec4b..a311b9869 100644 --- a/x/ibc/types.go +++ b/x/ibc/types.go @@ -65,7 +65,7 @@ func (p IBCPacket) GetSignBytes() []byte { // validator the ibc packey func (p IBCPacket) ValidateBasic() sdk.Error { if p.SrcChain == p.DestChain { - return ErrIdenticalChains(DefaultCodespace).Trace("") + return ErrIdenticalChains(DefaultCodespace).TraceSDK("") } if !p.Coins.IsValid() { return sdk.ErrInvalidCoins("") From 300a360714ffc5aff5864431076a43ec0e78d812 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 25 Jun 2018 16:45:27 -0400 Subject: [PATCH 04/16] fix tmcmd.ResetAll --- server/tm_cmds.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/tm_cmds.go b/server/tm_cmds.go index 7dccaf531..724af98bc 100644 --- a/server/tm_cmds.go +++ b/server/tm_cmds.go @@ -72,7 +72,7 @@ func UnsafeResetAllCmd(ctx *Context) *cobra.Command { Short: "Reset blockchain database, priv_validator.json file, and the logger", RunE: func(cmd *cobra.Command, args []string) error { cfg := ctx.Config - tcmd.ResetAll(cfg.DBDir(), cfg.PrivValidatorFile(), ctx.Logger) + tcmd.ResetAll(cfg.DBDir(), cfg.PrivValidatorFile(), cfg.P2P.AddrBookFile(), ctx.Logger) return nil }, } From 11e929ac0f302e5f1b3592f594fc11b7540ff84e Mon Sep 17 00:00:00 2001 From: Zach Ramsay Date: Fri, 29 Jun 2018 09:42:50 -0400 Subject: [PATCH 05/16] add link to new docs location --- docs/index.rst | 53 +++----------------------------------------------- 1 file changed, 3 insertions(+), 50 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 66e3f7cb8..1bbe94952 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -6,54 +6,7 @@ Welcome to the Cosmos SDK! ========================== -.. image:: graphics/cosmos-sdk-image.png - :height: 250px - :width: 500px - :align: center +This location for our documentation has been deprecated, please see: -SDK ---- - -.. toctree:: - :maxdepth: 1 - - sdk/install.rst - sdk/key-management.rst -.. sdk/overview.rst # needs to be updated -.. old/glossary.rst # not completely up to date but has good content - -.. Basecoin -.. -------- - -.. .. toctree:: - :maxdepth: 2 - -.. old/basecoin/basics.rst # has a decent getting-start tutorial that's relatively up to date, should be consolidated with the other getting started doc - -.. Extensions -.. ---------- - -.. old/basecoin/extensions.rst # probably not worth salvaging - -.. Replay Protection -.. ~~~~~~~~~~~~~~~~~ - -.. old/replay-protection.rst # not sure if worth salvaging - - -Staking -~~~~~~~ - -.. toctree:: - :maxdepth: 1 - - staking/testnet.rst -.. staking/intro.rst -.. staking/key-management.rst -.. staking/local-testnet.rst -.. staking/public-testnet.rst - -.. IBC -.. --- - -.. old/ibc.rst # needs to be updated +- https://cosmos.network/docs/ +- From 1e6d26ad3dce18fd1dde9bbee7d2aa192c196310 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Fri, 29 Jun 2018 17:52:00 -0400 Subject: [PATCH 06/16] fix tmcmd.ResetAll properly --- server/tm_cmds.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/tm_cmds.go b/server/tm_cmds.go index 724af98bc..25d417a66 100644 --- a/server/tm_cmds.go +++ b/server/tm_cmds.go @@ -72,7 +72,7 @@ func UnsafeResetAllCmd(ctx *Context) *cobra.Command { Short: "Reset blockchain database, priv_validator.json file, and the logger", RunE: func(cmd *cobra.Command, args []string) error { cfg := ctx.Config - tcmd.ResetAll(cfg.DBDir(), cfg.PrivValidatorFile(), cfg.P2P.AddrBookFile(), ctx.Logger) + tcmd.ResetAll(cfg.DBDir(), cfg.P2P.AddrBookFile(), cfg.PrivValidatorFile(), ctx.Logger) return nil }, } From 46b9f52daa74f4291cc3e794aaa2b6eb07a75b47 Mon Sep 17 00:00:00 2001 From: Faraaz Nishtar Date: Mon, 2 Jul 2018 10:26:54 -0700 Subject: [PATCH 07/16] Update Status.md --- cmd/gaia/testnets/STATUS.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/gaia/testnets/STATUS.md b/cmd/gaia/testnets/STATUS.md index 0848f27ef..00f7a5860 100644 --- a/cmd/gaia/testnets/STATUS.md +++ b/cmd/gaia/testnets/STATUS.md @@ -1,5 +1,10 @@ # TESTNET STATUS +## *July 2, 2018, 1:00 EST* - Gaia-6002 slashing failure + +- Gaia-6002 has been halted due to a slashing issue. +- The team is taking its time to look into this Gaia-7000 will be introduced this week. + ## *June 13, 2018, 17:00 EST* - Gaia-6002 is making blocks! - Gaia-6002 is live and making blocks From bc1288039400030267e97dc87f3910a15fc908b6 Mon Sep 17 00:00:00 2001 From: mossid Date: Mon, 25 Jun 2018 19:05:47 -0700 Subject: [PATCH 08/16] Merge pull request #1379: Account constructor in AccountMaper fix fix democoin fix tests pass lint last fix apply requests fix build failing fix docs --- cmd/gaia/app/app.go | 4 +-- cmd/gaia/cmd/gaiadebug/hack.go | 4 +-- docs/core/app3.md | 4 +-- docs/core/examples/app3.go | 2 +- docs/core/examples/app4.go | 2 +- examples/basecoin/app/app.go | 4 +-- examples/democoin/app/app.go | 2 +- examples/democoin/types/account.go | 5 +++ examples/democoin/x/cool/keeper_test.go | 2 +- examples/democoin/x/pow/handler_test.go | 2 +- examples/democoin/x/pow/keeper_test.go | 2 +- .../democoin/x/simplestake/keeper_test.go | 4 +-- x/auth/account.go | 5 +++ x/auth/ante_test.go | 16 ++++----- x/auth/mapper.go | 35 +++---------------- x/auth/mapper_test.go | 2 +- x/bank/keeper_test.go | 6 ++-- x/ibc/ibc_test.go | 2 +- x/mock/app.go | 2 +- x/slashing/test_common.go | 2 +- x/stake/keeper/test_common.go | 6 ++-- 21 files changed, 48 insertions(+), 65 deletions(-) diff --git a/cmd/gaia/app/app.go b/cmd/gaia/app/app.go index b355c4ed5..b8de60670 100644 --- a/cmd/gaia/app/app.go +++ b/cmd/gaia/app/app.go @@ -74,8 +74,8 @@ func NewGaiaApp(logger log.Logger, db dbm.DB) *GaiaApp { // define the accountMapper app.accountMapper = auth.NewAccountMapper( app.cdc, - app.keyAccount, // target store - &auth.BaseAccount{}, // prototype + app.keyAccount, // target store + auth.ProtoBaseAccount, // prototype ) // add handlers diff --git a/cmd/gaia/cmd/gaiadebug/hack.go b/cmd/gaia/cmd/gaiadebug/hack.go index ddc8466c7..e3b601337 100644 --- a/cmd/gaia/cmd/gaiadebug/hack.go +++ b/cmd/gaia/cmd/gaiadebug/hack.go @@ -157,8 +157,8 @@ func NewGaiaApp(logger log.Logger, db dbm.DB) *GaiaApp { // define the accountMapper app.accountMapper = auth.NewAccountMapper( app.cdc, - app.keyAccount, // target store - &auth.BaseAccount{}, // prototype + app.keyAccount, // target store + auth.ProtoBaseAccount, // prototype ) // add handlers diff --git a/docs/core/app3.md b/docs/core/app3.md index 450b1a59e..459f48c83 100644 --- a/docs/core/app3.md +++ b/docs/core/app3.md @@ -105,7 +105,7 @@ Creating an AccountMapper is easy - we just need to specify a codec, a capability key, and a prototype of the object being encoded ```go -accountMapper := auth.NewAccountMapper(cdc, keyAccount, &auth.BaseAccount{}) +accountMapper := auth.NewAccountMapper(cdc, keyAccount, auth.ProtoBaseAccount) ``` Then we can get, modify, and set accounts. For instance, we could double the @@ -335,7 +335,7 @@ func NewApp3(logger log.Logger, db dbm.DB) *bapp.BaseApp { keyFees := sdk.NewKVStoreKey("fee") // TODO // Set various mappers/keepers to interact easily with underlying stores - accountMapper := auth.NewAccountMapper(cdc, keyAccount, &auth.BaseAccount{}) + accountMapper := auth.NewAccountMapper(cdc, keyAccount, auth.ProtoBaseAccount) coinKeeper := bank.NewKeeper(accountMapper) feeKeeper := auth.NewFeeCollectionKeeper(cdc, keyFees) diff --git a/docs/core/examples/app3.go b/docs/core/examples/app3.go index f99e34b8b..853ad687e 100644 --- a/docs/core/examples/app3.go +++ b/docs/core/examples/app3.go @@ -28,7 +28,7 @@ func NewApp3(logger log.Logger, db dbm.DB) *bapp.BaseApp { keyFees := sdk.NewKVStoreKey("fee") // TODO // Set various mappers/keepers to interact easily with underlying stores - accountMapper := auth.NewAccountMapper(cdc, keyAccount, &auth.BaseAccount{}) + accountMapper := auth.NewAccountMapper(cdc, keyAccount, auth.ProtoBaseAccount) coinKeeper := bank.NewKeeper(accountMapper) feeKeeper := auth.NewFeeCollectionKeeper(cdc, keyFees) diff --git a/docs/core/examples/app4.go b/docs/core/examples/app4.go index daabe1561..a8ef37cee 100644 --- a/docs/core/examples/app4.go +++ b/docs/core/examples/app4.go @@ -28,7 +28,7 @@ func NewApp4(logger log.Logger, db dbm.DB) *bapp.BaseApp { keyAccount := sdk.NewKVStoreKey("acc") // Set various mappers/keepers to interact easily with underlying stores - accountMapper := auth.NewAccountMapper(cdc, keyAccount, &auth.BaseAccount{}) + accountMapper := auth.NewAccountMapper(cdc, keyAccount, auth.ProtoBaseAccount) coinKeeper := bank.NewKeeper(accountMapper) // TODO diff --git a/examples/basecoin/app/app.go b/examples/basecoin/app/app.go index 6df74ef28..7b2c7af3a 100644 --- a/examples/basecoin/app/app.go +++ b/examples/basecoin/app/app.go @@ -62,8 +62,8 @@ func NewBasecoinApp(logger log.Logger, db dbm.DB) *BasecoinApp { // define and attach the mappers and keepers app.accountMapper = auth.NewAccountMapper( cdc, - app.keyAccount, // target store - &types.AppAccount{}, // prototype + app.keyAccount, // target store + auth.ProtoBaseAccount, // prototype ) app.coinKeeper = bank.NewKeeper(app.accountMapper) app.ibcMapper = ibc.NewMapper(app.cdc, app.keyIBC, app.RegisterCodespace(ibc.DefaultCodespace)) diff --git a/examples/democoin/app/app.go b/examples/democoin/app/app.go index 6ea7d5247..51d10002a 100644 --- a/examples/democoin/app/app.go +++ b/examples/democoin/app/app.go @@ -71,7 +71,7 @@ func NewDemocoinApp(logger log.Logger, db dbm.DB) *DemocoinApp { app.accountMapper = auth.NewAccountMapper( cdc, app.capKeyAccountStore, // target store - &types.AppAccount{}, // prototype + types.ProtoAppAccount, // prototype ) // Add handlers. diff --git a/examples/democoin/types/account.go b/examples/democoin/types/account.go index e49191257..8eb9b0ae4 100644 --- a/examples/democoin/types/account.go +++ b/examples/democoin/types/account.go @@ -21,6 +21,11 @@ type AppAccount struct { Name string `json:"name"` } +// Constructor for AppAccount +func ProtoAppAccount() auth.Account { + return &AppAccount{} +} + // nolint func (acc AppAccount) GetName() string { return acc.Name } func (acc *AppAccount) SetName(name string) { acc.Name = name } diff --git a/examples/democoin/x/cool/keeper_test.go b/examples/democoin/x/cool/keeper_test.go index f0d65a545..ab59ea610 100644 --- a/examples/democoin/x/cool/keeper_test.go +++ b/examples/democoin/x/cool/keeper_test.go @@ -29,7 +29,7 @@ func TestCoolKeeper(t *testing.T) { cdc := wire.NewCodec() auth.RegisterBaseAccount(cdc) - am := auth.NewAccountMapper(cdc, capKey, &auth.BaseAccount{}) + am := auth.NewAccountMapper(cdc, capKey, auth.ProtoBaseAccount) ctx := sdk.NewContext(ms, abci.Header{}, false, nil) ck := bank.NewKeeper(am) keeper := NewKeeper(capKey, ck, DefaultCodespace) diff --git a/examples/democoin/x/pow/handler_test.go b/examples/democoin/x/pow/handler_test.go index 863a0dc6c..a203d2776 100644 --- a/examples/democoin/x/pow/handler_test.go +++ b/examples/democoin/x/pow/handler_test.go @@ -19,7 +19,7 @@ func TestPowHandler(t *testing.T) { cdc := wire.NewCodec() auth.RegisterBaseAccount(cdc) - am := auth.NewAccountMapper(cdc, capKey, &auth.BaseAccount{}) + am := auth.NewAccountMapper(cdc, capKey, auth.ProtoBaseAccount) ctx := sdk.NewContext(ms, abci.Header{}, false, log.NewNopLogger()) config := NewConfig("pow", int64(1)) ck := bank.NewKeeper(am) diff --git a/examples/democoin/x/pow/keeper_test.go b/examples/democoin/x/pow/keeper_test.go index 7a9b86984..a6802cb21 100644 --- a/examples/democoin/x/pow/keeper_test.go +++ b/examples/democoin/x/pow/keeper_test.go @@ -32,7 +32,7 @@ func TestPowKeeperGetSet(t *testing.T) { cdc := wire.NewCodec() auth.RegisterBaseAccount(cdc) - am := auth.NewAccountMapper(cdc, capKey, &auth.BaseAccount{}) + am := auth.NewAccountMapper(cdc, capKey, auth.ProtoBaseAccount) ctx := sdk.NewContext(ms, abci.Header{}, false, log.NewNopLogger()) config := NewConfig("pow", int64(1)) ck := bank.NewKeeper(am) diff --git a/examples/democoin/x/simplestake/keeper_test.go b/examples/democoin/x/simplestake/keeper_test.go index 35910b921..026f34346 100644 --- a/examples/democoin/x/simplestake/keeper_test.go +++ b/examples/democoin/x/simplestake/keeper_test.go @@ -35,7 +35,7 @@ func TestKeeperGetSet(t *testing.T) { cdc := wire.NewCodec() auth.RegisterBaseAccount(cdc) - accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) + accountMapper := auth.NewAccountMapper(cdc, authKey, auth.ProtoBaseAccount) stakeKeeper := NewKeeper(capKey, bank.NewKeeper(accountMapper), DefaultCodespace) ctx := sdk.NewContext(ms, abci.Header{}, false, log.NewNopLogger()) addr := sdk.AccAddress([]byte("some-address")) @@ -65,7 +65,7 @@ func TestBonding(t *testing.T) { ctx := sdk.NewContext(ms, abci.Header{}, false, log.NewNopLogger()) - accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) + accountMapper := auth.NewAccountMapper(cdc, authKey, auth.ProtoBaseAccount) coinKeeper := bank.NewKeeper(accountMapper) stakeKeeper := NewKeeper(capKey, coinKeeper, DefaultCodespace) addr := sdk.AccAddress([]byte("some-address")) diff --git a/x/auth/account.go b/x/auth/account.go index 0e9e3075c..3340c8bd5 100644 --- a/x/auth/account.go +++ b/x/auth/account.go @@ -46,6 +46,11 @@ type BaseAccount struct { Sequence int64 `json:"sequence"` } +// Prototype function for BaseAccount +func ProtoBaseAccount() Account { + return &BaseAccount{} +} + func NewBaseAccountWithAddress(addr sdk.AccAddress) BaseAccount { return BaseAccount{ Address: addr, diff --git a/x/auth/ante_test.go b/x/auth/ante_test.go index 8147edb2c..c30013d32 100644 --- a/x/auth/ante_test.go +++ b/x/auth/ante_test.go @@ -112,7 +112,7 @@ func TestAnteHandlerSigErrors(t *testing.T) { ms, capKey, capKey2 := setupMultiStore() cdc := wire.NewCodec() RegisterBaseAccount(cdc) - mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) + mapper := NewAccountMapper(cdc, capKey, ProtoBaseAccount) feeCollector := NewFeeCollectionKeeper(cdc, capKey2) anteHandler := NewAnteHandler(mapper, feeCollector) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, log.NewNopLogger()) @@ -165,7 +165,7 @@ func TestAnteHandlerAccountNumbers(t *testing.T) { ms, capKey, capKey2 := setupMultiStore() cdc := wire.NewCodec() RegisterBaseAccount(cdc) - mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) + mapper := NewAccountMapper(cdc, capKey, ProtoBaseAccount) feeCollector := NewFeeCollectionKeeper(cdc, capKey2) anteHandler := NewAnteHandler(mapper, feeCollector) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, log.NewNopLogger()) @@ -224,7 +224,7 @@ func TestAnteHandlerSequences(t *testing.T) { ms, capKey, capKey2 := setupMultiStore() cdc := wire.NewCodec() RegisterBaseAccount(cdc) - mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) + mapper := NewAccountMapper(cdc, capKey, ProtoBaseAccount) feeCollector := NewFeeCollectionKeeper(cdc, capKey2) anteHandler := NewAnteHandler(mapper, feeCollector) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, log.NewNopLogger()) @@ -302,7 +302,7 @@ func TestAnteHandlerFees(t *testing.T) { ms, capKey, capKey2 := setupMultiStore() cdc := wire.NewCodec() RegisterBaseAccount(cdc) - mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) + mapper := NewAccountMapper(cdc, capKey, ProtoBaseAccount) feeCollector := NewFeeCollectionKeeper(cdc, capKey2) anteHandler := NewAnteHandler(mapper, feeCollector) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, log.NewNopLogger()) @@ -344,7 +344,7 @@ func TestAnteHandlerMemoGas(t *testing.T) { ms, capKey, capKey2 := setupMultiStore() cdc := wire.NewCodec() RegisterBaseAccount(cdc) - mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) + mapper := NewAccountMapper(cdc, capKey, ProtoBaseAccount) feeCollector := NewFeeCollectionKeeper(cdc, capKey2) anteHandler := NewAnteHandler(mapper, feeCollector) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, log.NewNopLogger()) @@ -387,7 +387,7 @@ func TestAnteHandlerMultiSigner(t *testing.T) { ms, capKey, capKey2 := setupMultiStore() cdc := wire.NewCodec() RegisterBaseAccount(cdc) - mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) + mapper := NewAccountMapper(cdc, capKey, ProtoBaseAccount) feeCollector := NewFeeCollectionKeeper(cdc, capKey2) anteHandler := NewAnteHandler(mapper, feeCollector) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, log.NewNopLogger()) @@ -438,7 +438,7 @@ func TestAnteHandlerBadSignBytes(t *testing.T) { ms, capKey, capKey2 := setupMultiStore() cdc := wire.NewCodec() RegisterBaseAccount(cdc) - mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) + mapper := NewAccountMapper(cdc, capKey, ProtoBaseAccount) feeCollector := NewFeeCollectionKeeper(cdc, capKey2) anteHandler := NewAnteHandler(mapper, feeCollector) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, log.NewNopLogger()) @@ -519,7 +519,7 @@ func TestAnteHandlerSetPubKey(t *testing.T) { ms, capKey, capKey2 := setupMultiStore() cdc := wire.NewCodec() RegisterBaseAccount(cdc) - mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) + mapper := NewAccountMapper(cdc, capKey, ProtoBaseAccount) feeCollector := NewFeeCollectionKeeper(cdc, capKey2) anteHandler := NewAnteHandler(mapper, feeCollector) ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, log.NewNopLogger()) diff --git a/x/auth/mapper.go b/x/auth/mapper.go index 88cedcb15..244527af3 100644 --- a/x/auth/mapper.go +++ b/x/auth/mapper.go @@ -1,9 +1,6 @@ package auth import ( - "fmt" - "reflect" - sdk "github.com/cosmos/cosmos-sdk/types" wire "github.com/cosmos/cosmos-sdk/wire" "github.com/tendermint/tendermint/crypto" @@ -18,8 +15,8 @@ type AccountMapper struct { // The (unexposed) key used to access the store from the Context. key sdk.StoreKey - // The prototypical Account concrete type. - proto Account + // The prototypical Account constructor. + proto func() Account // The wire codec for binary encoding/decoding of accounts. cdc *wire.Codec @@ -28,7 +25,7 @@ type AccountMapper struct { // NewAccountMapper returns a new sdk.AccountMapper that // uses go-amino to (binary) encode and decode concrete sdk.Accounts. // nolint -func NewAccountMapper(cdc *wire.Codec, key sdk.StoreKey, proto Account) AccountMapper { +func NewAccountMapper(cdc *wire.Codec, key sdk.StoreKey, proto func() Account) AccountMapper { return AccountMapper{ key: key, proto: proto, @@ -38,7 +35,7 @@ func NewAccountMapper(cdc *wire.Codec, key sdk.StoreKey, proto Account) AccountM // Implaements sdk.AccountMapper. func (am AccountMapper) NewAccountWithAddress(ctx sdk.Context, addr sdk.AccAddress) Account { - acc := am.clonePrototype() + acc := am.proto() err := acc.SetAddress(addr) if err != nil { // Handle w/ #870 @@ -158,30 +155,6 @@ func (am AccountMapper) GetNextAccountNumber(ctx sdk.Context) int64 { //---------------------------------------- // misc. -// Creates a new struct (or pointer to struct) from am.proto. -func (am AccountMapper) clonePrototype() Account { - protoRt := reflect.TypeOf(am.proto) - if protoRt.Kind() == reflect.Ptr { - protoCrt := protoRt.Elem() - if protoCrt.Kind() != reflect.Struct { - panic("accountMapper requires a struct proto sdk.Account, or a pointer to one") - } - protoRv := reflect.New(protoCrt) - clone, ok := protoRv.Interface().(Account) - if !ok { - panic(fmt.Sprintf("accountMapper requires a proto sdk.Account, but %v doesn't implement sdk.Account", protoRt)) - } - return clone - } - - protoRv := reflect.New(protoRt).Elem() - clone, ok := protoRv.Interface().(Account) - if !ok { - panic(fmt.Sprintf("accountMapper requires a proto sdk.Account, but %v doesn't implement sdk.Account", protoRt)) - } - return clone -} - func (am AccountMapper) encodeAccount(acc Account) []byte { bz, err := am.cdc.MarshalBinaryBare(acc) if err != nil { diff --git a/x/auth/mapper_test.go b/x/auth/mapper_test.go index e7271a2ae..679ee12cd 100644 --- a/x/auth/mapper_test.go +++ b/x/auth/mapper_test.go @@ -32,7 +32,7 @@ func TestAccountMapperGetSet(t *testing.T) { // make context and mapper ctx := sdk.NewContext(ms, abci.Header{}, false, log.NewNopLogger()) - mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) + mapper := NewAccountMapper(cdc, capKey, ProtoBaseAccount) addr := sdk.AccAddress([]byte("some-address")) diff --git a/x/bank/keeper_test.go b/x/bank/keeper_test.go index 7b27d45fa..c9d7c4119 100644 --- a/x/bank/keeper_test.go +++ b/x/bank/keeper_test.go @@ -33,7 +33,7 @@ func TestKeeper(t *testing.T) { auth.RegisterBaseAccount(cdc) ctx := sdk.NewContext(ms, abci.Header{}, false, log.NewNopLogger()) - accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) + accountMapper := auth.NewAccountMapper(cdc, authKey, auth.ProtoBaseAccount) coinKeeper := NewKeeper(accountMapper) addr := sdk.AccAddress([]byte("addr1")) @@ -118,7 +118,7 @@ func TestSendKeeper(t *testing.T) { auth.RegisterBaseAccount(cdc) ctx := sdk.NewContext(ms, abci.Header{}, false, log.NewNopLogger()) - accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) + accountMapper := auth.NewAccountMapper(cdc, authKey, auth.ProtoBaseAccount) coinKeeper := NewKeeper(accountMapper) sendKeeper := NewSendKeeper(accountMapper) @@ -187,7 +187,7 @@ func TestViewKeeper(t *testing.T) { auth.RegisterBaseAccount(cdc) ctx := sdk.NewContext(ms, abci.Header{}, false, log.NewNopLogger()) - accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) + accountMapper := auth.NewAccountMapper(cdc, authKey, auth.ProtoBaseAccount) coinKeeper := NewKeeper(accountMapper) viewKeeper := NewViewKeeper(accountMapper) diff --git a/x/ibc/ibc_test.go b/x/ibc/ibc_test.go index 8c91921bd..06e2bd167 100644 --- a/x/ibc/ibc_test.go +++ b/x/ibc/ibc_test.go @@ -64,7 +64,7 @@ func TestIBC(t *testing.T) { key := sdk.NewKVStoreKey("ibc") ctx := defaultContext(key) - am := auth.NewAccountMapper(cdc, key, &auth.BaseAccount{}) + am := auth.NewAccountMapper(cdc, key, auth.ProtoBaseAccount) ck := bank.NewKeeper(am) src := newAddress() diff --git a/x/mock/app.go b/x/mock/app.go index 83d17ba68..27f3b9d46 100644 --- a/x/mock/app.go +++ b/x/mock/app.go @@ -58,7 +58,7 @@ func NewApp() *App { app.AccountMapper = auth.NewAccountMapper( app.Cdc, app.KeyAccount, - &auth.BaseAccount{}, + auth.ProtoBaseAccount, ) // Initialize the app. The chainers and blockers can be overwritten before diff --git a/x/slashing/test_common.go b/x/slashing/test_common.go index c5320cb24..e2058f09f 100644 --- a/x/slashing/test_common.go +++ b/x/slashing/test_common.go @@ -59,7 +59,7 @@ func createTestInput(t *testing.T) (sdk.Context, bank.Keeper, stake.Keeper, Keep require.Nil(t, err) ctx := sdk.NewContext(ms, abci.Header{}, false, log.NewTMLogger(os.Stdout)) cdc := createTestCodec() - accountMapper := auth.NewAccountMapper(cdc, keyAcc, &auth.BaseAccount{}) + accountMapper := auth.NewAccountMapper(cdc, keyAcc, auth.ProtoBaseAccount) ck := bank.NewKeeper(accountMapper) sk := stake.NewKeeper(cdc, keyStake, ck, stake.DefaultCodespace) genesis := stake.DefaultGenesisState() diff --git a/x/stake/keeper/test_common.go b/x/stake/keeper/test_common.go index 983933123..21073a1ff 100644 --- a/x/stake/keeper/test_common.go +++ b/x/stake/keeper/test_common.go @@ -101,9 +101,9 @@ func CreateTestInput(t *testing.T, isCheckTx bool, initCoins int64) (sdk.Context ctx := sdk.NewContext(ms, abci.Header{ChainID: "foochainid"}, isCheckTx, log.NewNopLogger()) cdc := MakeTestCodec() accountMapper := auth.NewAccountMapper( - cdc, // amino codec - keyAcc, // target store - &auth.BaseAccount{}, // prototype + cdc, // amino codec + keyAcc, // target store + auth.ProtoBaseAccount, // prototype ) ck := bank.NewKeeper(accountMapper) keeper := NewKeeper(cdc, keyStake, ck, types.DefaultCodespace) From aed1ca89aa8793628dfaa1102e7cd90c7fb59896 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 10 Jul 2018 12:20:22 -0400 Subject: [PATCH 09/16] update dep --- Gopkg.lock | 25 ++++++++++++------------- Gopkg.toml | 6 +++--- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 879453988..cfb830b64 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -29,13 +29,13 @@ branch = "master" name = "github.com/btcsuite/btcd" packages = ["btcec"] - revision = "86fed781132ac890ee03e906e4ecd5d6fa180c64" + revision = "fdfc19097e7ac6b57035062056f5b7b4638b8898" [[projects]] branch = "master" name = "github.com/btcsuite/btcutil" packages = ["bech32"] - revision = "d4cc87b860166d00d6b5b9e0d3b3d71d6088d4d4" + revision = "ab6388e0c60ae4834a1f57511e20c17b5f78be4b" [[projects]] name = "github.com/davecgh/go-spew" @@ -137,7 +137,6 @@ ".", "hcl/ast", "hcl/parser", - "hcl/printer", "hcl/scanner", "hcl/strconv", "hcl/token", @@ -208,13 +207,13 @@ version = "v1.0.0" [[projects]] + branch = "master" name = "github.com/prometheus/client_golang" packages = [ "prometheus", "prometheus/promhttp" ] - revision = "c5b7fccd204277076155f10851dad72b76a49317" - version = "v0.8.0" + revision = "ae27198cdd90bf12cd134ad79d1366a6cf49f632" [[projects]] branch = "master" @@ -314,7 +313,7 @@ "leveldb/table", "leveldb/util" ] - revision = "0d5a0ceb10cf9ab89fdd744cc8c50a83134f6697" + revision = "c4c61651e9e37fa117f53c5a906d3b63090d8445" [[projects]] branch = "master" @@ -335,8 +334,8 @@ [[projects]] name = "github.com/tendermint/iavl" packages = ["."] - revision = "9e5dc3e61f70b285bb25414452d47aca1ff34c1d" - version = "v0.8.2-rc0" + revision = "35f66e53d9b01e83b30de68b931f54b2477a94c9" + version = "v0.9.2" [[projects]] name = "github.com/tendermint/tendermint" @@ -395,8 +394,8 @@ "types", "version" ] - revision = "5923b6288fe8ce9581936ee97c2bf9cf9c02c2f4" - version = "v0.22.0-rc2" + revision = "5ff65274b84ea905787a48512cc3124385bddf2f" + version = "v0.22.2" [[projects]] name = "github.com/zondax/ledger-goclient" @@ -434,13 +433,13 @@ "netutil", "trace" ] - revision = "ed29d75add3d7c4bf7ca65aac0c6df3d1420216f" + revision = "292b43bbf7cb8d35ddf40f8d5100ef3837cced3f" [[projects]] branch = "master" name = "golang.org/x/sys" packages = ["unix"] - revision = "151529c776cdc58ddbe7963ba9af779f3577b419" + revision = "1b2967e3c290b7c545b3db0deeda16e9be4f98a2" [[projects]] name = "golang.org/x/text" @@ -507,6 +506,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "13ad2a57b6942729e2d08b5c37810d62108aa64a335a4822fcff1ad992c0662b" + inputs-digest = "25f7ff2ef90e336bf69362a555ef21fb575dc808e892309a9e6b583e7b61fb2f" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 0a4d3b2f1..7ece2301a 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -58,11 +58,11 @@ [[constraint]] name = "github.com/tendermint/iavl" - version = "=v0.8.2-rc0" + version = "=v0.9.2" -[[constraint]] +[[override]] name = "github.com/tendermint/tendermint" - version = "=0.22.0-rc2" + version = "=0.22.2" [[constraint]] name = "github.com/bartekn/go-bip39" From d226f1d62ef517183c405cd15c138a9ba5759325 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 10 Jul 2018 12:20:29 -0400 Subject: [PATCH 10/16] changelog, version --- CHANGELOG.md | 4 ++-- version/version.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 879eaacb0..cb372e1fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,14 +2,14 @@ ## 0.20.0 -*TBD* +*July 10th, 2018* BREAKING CHANGES * msg.GetSignBytes() returns sorted JSON (by key) * msg.GetSignBytes() field changes * `msg_bytes` -> `msgs` * `fee_bytes` -> `fee` -* Update Tendermint to v0.22.0 +* Update Tendermint to v0.22.2 * Default ports changed from 466xx to 266xx * Amino JSON uses type names instead of prefix bytes * ED25519 addresses are the first 20-bytes of the SHA256 of the raw 32-byte diff --git a/version/version.go b/version/version.go index 496645568..b9de4f991 100644 --- a/version/version.go +++ b/version/version.go @@ -5,7 +5,7 @@ const Maj = "0" const Min = "20" const Fix = "0" -const Version = "0.20.0-dev" +const Version = "0.20.0" // GitCommit set by build flags var GitCommit = "" From 080dd5b97a90005cac0c730a81fd1d6864b9fd3e Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 10 Jul 2018 15:00:00 -0400 Subject: [PATCH 11/16] update protobuf to 1.1.0 --- Gopkg.lock | 10 ++++++---- Gopkg.toml | 9 ++------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index cfb830b64..a98a7c86a 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -103,8 +103,8 @@ "ptypes/duration", "ptypes/timestamp" ] - revision = "925541529c1fa6821df4e44ce2723319eb2be768" - version = "v1.0.0" + revision = "b4deda0973fb4c70b50d226b1af49f3da59f5265" + version = "v1.1.0" [[projects]] branch = "master" @@ -137,6 +137,7 @@ ".", "hcl/ast", "hcl/parser", + "hcl/printer", "hcl/scanner", "hcl/strconv", "hcl/token", @@ -463,9 +464,10 @@ version = "v0.3.0" [[projects]] + branch = "master" name = "google.golang.org/genproto" packages = ["googleapis/rpc/status"] - revision = "7fd901a49ba6a7f87732eb344f6e3c5b19d1b200" + revision = "e92b116572682a5b432ddd840aeaba2a559eeff1" [[projects]] name = "google.golang.org/grpc" @@ -506,6 +508,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "25f7ff2ef90e336bf69362a555ef21fb575dc808e892309a9e6b583e7b61fb2f" + inputs-digest = "33d51b55781a1579d2fde1bba70077b49c5804862ea56c72136f013c8498e0c6" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 7ece2301a..bdc0faa34 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -28,9 +28,9 @@ name = "github.com/bgentry/speakeasy" version = "~0.1.0" -[[constraint]] +[[override]] name = "github.com/golang/protobuf" - version = "~1.0.0" + version = "=1.1.0" [[constraint]] name = "github.com/mattn/go-isatty" @@ -72,11 +72,6 @@ name = "github.com/zondax/ledger-goclient" revision = "065cbf938a16f20335c40cfe180f9cd4955c6a5a" -# this got updated and broke, so locked to an old working commit ... -[[override]] - name = "google.golang.org/genproto" - revision = "7fd901a49ba6a7f87732eb344f6e3c5b19d1b200" - [prune] go-tests = true unused-packages = true From b195c556e2507838bdde30c98c8500c8c315fd9d Mon Sep 17 00:00:00 2001 From: Aditya Date: Tue, 10 Jul 2018 17:16:37 -0700 Subject: [PATCH 12/16] Merge pull request #1600: Friend can create validator and delegate on behalf of genesis validator * Added msg and handling for surrogate create validator * changelog and error fix * fix changelog * Remove unnecessary msg by combining into CreateValidator * Refactor * Appease linter * Added onbehalfof functionality in client * fmt * Added gaia onbehalfof test * Update test for onbehalfof validator creation * fix test * Fix flag error * Add app test * fmt * Fixed signer for onbehalfof createvalidator * Fix error msg * Simplify test * fmt --- CHANGELOG.md | 1 + client/lcd/lcd_test.go | 2 +- x/slashing/test_common.go | 9 +++--- x/stake/app_test.go | 20 ++++++++++--- x/stake/client/cli/tx.go | 13 +++++++- x/stake/client/rest/tx.go | 4 +-- x/stake/handler.go | 8 ++--- x/stake/handler_test.go | 62 +++++++++++++++++++++++++++++---------- x/stake/stake.go | 15 +++++----- x/stake/types/msg.go | 59 +++++++++++++++++++++++++++---------- x/stake/types/msg_test.go | 40 +++++++++++++++++++++++++ 11 files changed, 180 insertions(+), 53 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65269f2c4..44fa7290e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -89,6 +89,7 @@ FEATURES * [tests] created a randomized testing framework. - Currently bank has limited functionality in the framework - Auth has its invariants checked within the framework +* [x/stake] Allow validator to be created with starting delegation by a third-party delegator on behalf of validator. * [tests] Add WaitForNextNBlocksTM helper method * [keys] New keys now have 24 word recovery keys, for heightened security diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index b5800ca29..0979a568f 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -729,7 +729,7 @@ func doDelegate(t *testing.T, port, seed, name, password string, delegatorAddr, { "delegator_addr": "%s", "validator_addr": "%s", - "bond": { "denom": "%s", "amount": "60" } + "delegation": { "denom": "%s", "amount": "60" } } ], "begin_unbondings": [], diff --git a/x/slashing/test_common.go b/x/slashing/test_common.go index b167da24b..823a6b96b 100644 --- a/x/slashing/test_common.go +++ b/x/slashing/test_common.go @@ -94,9 +94,10 @@ func testAddr(addr string) sdk.AccAddress { func newTestMsgCreateValidator(address sdk.AccAddress, pubKey crypto.PubKey, amt sdk.Int) stake.MsgCreateValidator { return stake.MsgCreateValidator{ - Description: stake.Description{}, - ValidatorAddr: address, - PubKey: pubKey, - SelfDelegation: sdk.Coin{"steak", amt}, + Description: stake.Description{}, + DelegatorAddr: address, + ValidatorAddr: address, + PubKey: pubKey, + Delegation: sdk.Coin{"steak", amt}, } } diff --git a/x/stake/app_test.go b/x/stake/app_test.go index d1224230d..d73ef9f01 100644 --- a/x/stake/app_test.go +++ b/x/stake/app_test.go @@ -80,7 +80,7 @@ func checkValidator(t *testing.T, mapp *mock.App, keeper Keeper, addr sdk.AccAddress, expFound bool) Validator { ctxCheck := mapp.BaseApp.NewContext(true, abci.Header{}) - validator, found := keeper.GetValidator(ctxCheck, addr1) + validator, found := keeper.GetValidator(ctxCheck, addr) require.Equal(t, expFound, found) return validator @@ -138,6 +138,18 @@ func TestStakeMsgs(t *testing.T) { require.Equal(t, sdk.Bonded, validator.Status()) require.True(sdk.RatEq(t, sdk.NewRat(10), validator.PoolShares.Bonded())) + // addr1 create validator on behalf of addr2 + createValidatorMsgOnBehalfOf := NewMsgCreateValidatorOnBehalfOf(addr1, addr2, priv2.PubKey(), bondCoin, description) + + mock.SignCheckDeliver(t, mApp.BaseApp, []sdk.Msg{createValidatorMsgOnBehalfOf}, []int64{0, 1}, []int64{1, 0}, true, priv1, priv2) + mock.CheckBalance(t, mApp, addr1, sdk.Coins{genCoin.Minus(bondCoin).Minus(bondCoin)}) + mApp.BeginBlock(abci.RequestBeginBlock{}) + + validator = checkValidator(t, mApp, keeper, addr2, true) + require.Equal(t, addr2, validator.Owner) + require.Equal(t, sdk.Bonded, validator.Status()) + require.True(sdk.RatEq(t, sdk.NewRat(10), validator.PoolShares.Bonded())) + // check the bond that should have been created as well checkDelegation(t, mApp, keeper, addr1, addr1, true, sdk.NewRat(10)) @@ -145,7 +157,7 @@ func TestStakeMsgs(t *testing.T) { description = NewDescription("bar_moniker", "", "", "") editValidatorMsg := NewMsgEditValidator(addr1, description) - mock.SignCheckDeliver(t, mApp.BaseApp, []sdk.Msg{editValidatorMsg}, []int64{0}, []int64{1}, true, priv1) + mock.SignCheckDeliver(t, mApp.BaseApp, []sdk.Msg{editValidatorMsg}, []int64{0}, []int64{2}, true, priv1) validator = checkValidator(t, mApp, keeper, addr1, true) require.Equal(t, description, validator.Description) @@ -153,13 +165,13 @@ func TestStakeMsgs(t *testing.T) { mock.CheckBalance(t, mApp, addr2, sdk.Coins{genCoin}) delegateMsg := NewMsgDelegate(addr2, addr1, bondCoin) - mock.SignCheckDeliver(t, mApp.BaseApp, []sdk.Msg{delegateMsg}, []int64{1}, []int64{0}, true, priv2) + mock.SignCheckDeliver(t, mApp.BaseApp, []sdk.Msg{delegateMsg}, []int64{1}, []int64{1}, true, priv2) mock.CheckBalance(t, mApp, addr2, sdk.Coins{genCoin.Minus(bondCoin)}) checkDelegation(t, mApp, keeper, addr2, addr1, true, sdk.NewRat(10)) // begin unbonding beginUnbondingMsg := NewMsgBeginUnbonding(addr2, addr1, sdk.NewRat(10)) - mock.SignCheckDeliver(t, mApp.BaseApp, []sdk.Msg{beginUnbondingMsg}, []int64{1}, []int64{1}, true, priv2) + mock.SignCheckDeliver(t, mApp.BaseApp, []sdk.Msg{beginUnbondingMsg}, []int64{1}, []int64{2}, true, priv2) // delegation should exist anymore checkDelegation(t, mApp, keeper, addr2, addr1, false, sdk.Rat{}) diff --git a/x/stake/client/cli/tx.go b/x/stake/client/cli/tx.go index e4c4a9dcb..72317c82c 100644 --- a/x/stake/client/cli/tx.go +++ b/x/stake/client/cli/tx.go @@ -50,7 +50,17 @@ func GetCmdCreateValidator(cdc *wire.Codec) *cobra.Command { Website: viper.GetString(FlagWebsite), Details: viper.GetString(FlagDetails), } - msg := stake.NewMsgCreateValidator(validatorAddr, pk, amount, description) + + var msg sdk.Msg + if viper.GetString(FlagAddressDelegator) != "" { + delegatorAddr, err := sdk.AccAddressFromBech32(viper.GetString(FlagAddressDelegator)) + if err != nil { + return err + } + msg = stake.NewMsgCreateValidatorOnBehalfOf(delegatorAddr, validatorAddr, pk, amount, description) + } else { + msg = stake.NewMsgCreateValidator(validatorAddr, pk, amount, description) + } // build and sign the transaction, then broadcast to Tendermint err = ctx.EnsureSignBuildBroadcast(ctx.FromAddressName, []sdk.Msg{msg}, cdc) @@ -65,6 +75,7 @@ func GetCmdCreateValidator(cdc *wire.Codec) *cobra.Command { cmd.Flags().AddFlagSet(fsAmount) cmd.Flags().AddFlagSet(fsDescription) cmd.Flags().AddFlagSet(fsValidator) + cmd.Flags().AddFlagSet(fsDelegator) return cmd } diff --git a/x/stake/client/rest/tx.go b/x/stake/client/rest/tx.go index b53b43aa5..a0f041654 100644 --- a/x/stake/client/rest/tx.go +++ b/x/stake/client/rest/tx.go @@ -27,7 +27,7 @@ func registerTxRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec, k type msgDelegationsInput struct { DelegatorAddr string `json:"delegator_addr"` // in bech32 ValidatorAddr string `json:"validator_addr"` // in bech32 - Bond sdk.Coin `json:"bond"` + Delegation sdk.Coin `json:"delegation"` } type msgBeginRedelegateInput struct { DelegatorAddr string `json:"delegator_addr"` // in bech32 @@ -119,7 +119,7 @@ func editDelegationsRequestHandlerFn(cdc *wire.Codec, kb keys.Keybase, ctx conte messages[i] = stake.MsgDelegate{ DelegatorAddr: delegatorAddr, ValidatorAddr: validatorAddr, - Bond: msg.Bond, + Delegation: msg.Delegation, } i++ } diff --git a/x/stake/handler.go b/x/stake/handler.go index 265bb4e91..c355179cf 100644 --- a/x/stake/handler.go +++ b/x/stake/handler.go @@ -71,7 +71,7 @@ func handleMsgCreateValidator(ctx sdk.Context, msg types.MsgCreateValidator, k k if found { return ErrValidatorPubKeyExists(k.Codespace()).Result() } - if msg.SelfDelegation.Denom != k.GetParams(ctx).BondDenom { + if msg.Delegation.Denom != k.GetParams(ctx).BondDenom { return ErrBadDenom(k.Codespace()).Result() } @@ -81,7 +81,7 @@ func handleMsgCreateValidator(ctx sdk.Context, msg types.MsgCreateValidator, k k // move coins from the msg.Address account to a (self-delegation) delegator account // the validator account and global shares are updated within here - _, err := k.Delegate(ctx, msg.ValidatorAddr, msg.SelfDelegation, validator) + _, err := k.Delegate(ctx, msg.DelegatorAddr, msg.Delegation, validator) if err != nil { return err.Result() } @@ -130,13 +130,13 @@ func handleMsgDelegate(ctx sdk.Context, msg types.MsgDelegate, k keeper.Keeper) if !found { return ErrNoValidatorFound(k.Codespace()).Result() } - if msg.Bond.Denom != k.GetParams(ctx).BondDenom { + if msg.Delegation.Denom != k.GetParams(ctx).BondDenom { return ErrBadDenom(k.Codespace()).Result() } if validator.Revoked == true { return ErrValidatorRevoked(k.Codespace()).Result() } - _, err := k.Delegate(ctx, msg.DelegatorAddr, msg.Bond, validator) + _, err := k.Delegate(ctx, msg.DelegatorAddr, msg.Delegation, validator) if err != nil { return err.Result() } diff --git a/x/stake/handler_test.go b/x/stake/handler_test.go index ec0ef35f5..95a078802 100644 --- a/x/stake/handler_test.go +++ b/x/stake/handler_test.go @@ -16,19 +16,24 @@ import ( //______________________________________________________________________ func newTestMsgCreateValidator(address sdk.AccAddress, pubKey crypto.PubKey, amt int64) MsgCreateValidator { - return MsgCreateValidator{ - Description: Description{}, - ValidatorAddr: address, - PubKey: pubKey, - SelfDelegation: sdk.Coin{"steak", sdk.NewInt(amt)}, - } + return types.NewMsgCreateValidator(address, pubKey, sdk.Coin{"steak", sdk.NewInt(amt)}, Description{}) } func newTestMsgDelegate(delegatorAddr, validatorAddr sdk.AccAddress, amt int64) MsgDelegate { return MsgDelegate{ DelegatorAddr: delegatorAddr, ValidatorAddr: validatorAddr, - Bond: sdk.Coin{"steak", sdk.NewInt(amt)}, + Delegation: sdk.Coin{"steak", sdk.NewInt(amt)}, + } +} + +func newTestMsgCreateValidatorOnBehalfOf(delegatorAddr, validatorAddr sdk.AccAddress, valPubKey crypto.PubKey, amt int64) MsgCreateValidator { + return MsgCreateValidator{ + Description: Description{}, + DelegatorAddr: delegatorAddr, + ValidatorAddr: validatorAddr, + PubKey: valPubKey, + Delegation: sdk.Coin{"steak", sdk.NewInt(amt)}, } } @@ -160,6 +165,32 @@ func TestDuplicatesMsgCreateValidator(t *testing.T) { assert.Equal(t, Description{}, validator.Description) } +func TestDuplicatesMsgCreateValidatorOnBehalfOf(t *testing.T) { + ctx, _, keeper := keep.CreateTestInput(t, false, 1000) + + validatorAddr := keep.Addrs[0] + delegatorAddr := keep.Addrs[1] + pk := keep.PKs[0] + msgCreateValidatorOnBehalfOf := newTestMsgCreateValidatorOnBehalfOf(delegatorAddr, validatorAddr, pk, 10) + got := handleMsgCreateValidator(ctx, msgCreateValidatorOnBehalfOf, keeper) + require.True(t, got.IsOK(), "%v", got) + validator, found := keeper.GetValidator(ctx, validatorAddr) + + require.True(t, found) + require.Equal(t, sdk.Bonded, validator.Status()) + require.Equal(t, validatorAddr, validator.Owner) + require.Equal(t, pk, validator.PubKey) + require.Equal(t, sdk.NewRat(10), validator.PoolShares.Bonded()) + require.Equal(t, sdk.NewRat(10), validator.DelegatorShares) + require.Equal(t, Description{}, validator.Description) + + // one validator cannot be created twice even from different delegator + msgCreateValidatorOnBehalfOf.DelegatorAddr = keep.Addrs[2] + msgCreateValidatorOnBehalfOf.PubKey = keep.PKs[1] + got = handleMsgCreateValidator(ctx, msgCreateValidatorOnBehalfOf, keeper) + require.False(t, got.IsOK(), "%v", got) +} + func TestIncrementsMsgDelegate(t *testing.T) { initBond := int64(1000) ctx, accMapper, keeper := keep.CreateTestInput(t, false, initBond) @@ -329,11 +360,12 @@ func TestMultipleMsgCreateValidator(t *testing.T) { params := setInstantUnbondPeriod(keeper, ctx) validatorAddrs := []sdk.AccAddress{keep.Addrs[0], keep.Addrs[1], keep.Addrs[2]} + delegatorAddrs := []sdk.AccAddress{keep.Addrs[3], keep.Addrs[4], keep.Addrs[5]} // bond them all for i, validatorAddr := range validatorAddrs { - msgCreateValidator := newTestMsgCreateValidator(validatorAddr, keep.PKs[i], 10) - got := handleMsgCreateValidator(ctx, msgCreateValidator, keeper) + msgCreateValidatorOnBehalfOf := newTestMsgCreateValidatorOnBehalfOf(delegatorAddrs[i], validatorAddr, keep.PKs[i], 10) + got := handleMsgCreateValidator(ctx, msgCreateValidatorOnBehalfOf, keeper) require.True(t, got.IsOK(), "expected msg %d to be ok, got %v", i, got) //Check that the account is bonded @@ -341,18 +373,18 @@ func TestMultipleMsgCreateValidator(t *testing.T) { require.Equal(t, (i + 1), len(validators)) val := validators[i] balanceExpd := sdk.NewInt(initBond - 10) - balanceGot := accMapper.GetAccount(ctx, val.Owner).GetCoins().AmountOf(params.BondDenom) + balanceGot := accMapper.GetAccount(ctx, delegatorAddrs[i]).GetCoins().AmountOf(params.BondDenom) require.Equal(t, i+1, len(validators), "expected %d validators got %d, validators: %v", i+1, len(validators), validators) require.Equal(t, 10, int(val.DelegatorShares.RoundInt64()), "expected %d shares, got %d", 10, val.DelegatorShares) require.Equal(t, balanceExpd, balanceGot, "expected account to have %d, got %d", balanceExpd, balanceGot) } - // unbond them all + // unbond them all by revoking delegation for i, validatorAddr := range validatorAddrs { - validatorPre, found := keeper.GetValidator(ctx, validatorAddr) + _, found := keeper.GetValidator(ctx, validatorAddr) require.True(t, found) - msgBeginUnbonding := NewMsgBeginUnbonding(validatorAddr, validatorAddr, sdk.NewRat(10)) // self-delegation - msgCompleteUnbonding := NewMsgCompleteUnbonding(validatorAddr, validatorAddr) + msgBeginUnbonding := NewMsgBeginUnbonding(delegatorAddrs[i], validatorAddr, sdk.NewRat(10)) // remove delegation + msgCompleteUnbonding := NewMsgCompleteUnbonding(delegatorAddrs[i], validatorAddr) got := handleMsgBeginUnbonding(ctx, msgBeginUnbonding, keeper) require.True(t, got.IsOK(), "expected msg %d to be ok, got %v", i, got) got = handleMsgCompleteUnbonding(ctx, msgCompleteUnbonding, keeper) @@ -367,7 +399,7 @@ func TestMultipleMsgCreateValidator(t *testing.T) { require.False(t, found) expBalance := sdk.NewInt(initBond) - gotBalance := accMapper.GetAccount(ctx, validatorPre.Owner).GetCoins().AmountOf(params.BondDenom) + gotBalance := accMapper.GetAccount(ctx, delegatorAddrs[i]).GetCoins().AmountOf(params.BondDenom) require.Equal(t, expBalance, gotBalance, "expected account to have %d, got %d", expBalance, gotBalance) } } diff --git a/x/stake/stake.go b/x/stake/stake.go index c582fb635..410856489 100644 --- a/x/stake/stake.go +++ b/x/stake/stake.go @@ -71,13 +71,14 @@ var ( DefaultGenesisState = types.DefaultGenesisState RegisterWire = types.RegisterWire - NewMsgCreateValidator = types.NewMsgCreateValidator - NewMsgEditValidator = types.NewMsgEditValidator - NewMsgDelegate = types.NewMsgDelegate - NewMsgBeginUnbonding = types.NewMsgBeginUnbonding - NewMsgCompleteUnbonding = types.NewMsgCompleteUnbonding - NewMsgBeginRedelegate = types.NewMsgBeginRedelegate - NewMsgCompleteRedelegate = types.NewMsgCompleteRedelegate + NewMsgCreateValidator = types.NewMsgCreateValidator + NewMsgCreateValidatorOnBehalfOf = types.NewMsgCreateValidatorOnBehalfOf + NewMsgEditValidator = types.NewMsgEditValidator + NewMsgDelegate = types.NewMsgDelegate + NewMsgBeginUnbonding = types.NewMsgBeginUnbonding + NewMsgCompleteUnbonding = types.NewMsgCompleteUnbonding + NewMsgBeginRedelegate = types.NewMsgBeginRedelegate + NewMsgCompleteRedelegate = types.NewMsgCompleteRedelegate ) const ( diff --git a/x/stake/types/msg.go b/x/stake/types/msg.go index 5c00002fc..08fd80128 100644 --- a/x/stake/types/msg.go +++ b/x/stake/types/msg.go @@ -2,6 +2,7 @@ package types import ( "math" + "reflect" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/tendermint/tendermint/crypto" @@ -27,38 +28,63 @@ var maximumBondingRationalDenominator sdk.Int = sdk.NewInt(int64(math.Pow10(MaxB // MsgCreateValidator - struct for unbonding transactions type MsgCreateValidator struct { Description - ValidatorAddr sdk.AccAddress `json:"address"` - PubKey crypto.PubKey `json:"pubkey"` - SelfDelegation sdk.Coin `json:"self_delegation"` + DelegatorAddr sdk.AccAddress `json:"delegator_address"` + ValidatorAddr sdk.AccAddress `json:"validator_address"` + PubKey crypto.PubKey `json:"pubkey"` + Delegation sdk.Coin `json:"delegation"` } +// Default way to create validator. Delegator address and validator address are the same func NewMsgCreateValidator(validatorAddr sdk.AccAddress, pubkey crypto.PubKey, selfDelegation sdk.Coin, description Description) MsgCreateValidator { return MsgCreateValidator{ - Description: description, - ValidatorAddr: validatorAddr, - PubKey: pubkey, - SelfDelegation: selfDelegation, + Description: description, + DelegatorAddr: validatorAddr, + ValidatorAddr: validatorAddr, + PubKey: pubkey, + Delegation: selfDelegation, + } +} + +// Creates validator msg by delegator address on behalf of validator address +func NewMsgCreateValidatorOnBehalfOf(delegatorAddr, validatorAddr sdk.AccAddress, pubkey crypto.PubKey, + delegation sdk.Coin, description Description) MsgCreateValidator { + return MsgCreateValidator{ + Description: description, + DelegatorAddr: delegatorAddr, + ValidatorAddr: validatorAddr, + PubKey: pubkey, + Delegation: delegation, } } //nolint func (msg MsgCreateValidator) Type() string { return MsgType } + +// Return address(es) that must sign over msg.GetSignBytes() func (msg MsgCreateValidator) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.ValidatorAddr} + // delegator is first signer so delegator pays fees + addrs := []sdk.AccAddress{msg.DelegatorAddr} + if !reflect.DeepEqual(msg.DelegatorAddr, msg.ValidatorAddr) { + // if validator addr is not same as delegator addr, validator must sign msg as well + addrs = append(addrs, msg.ValidatorAddr) + } + return addrs } // get the bytes for the message signer to sign on func (msg MsgCreateValidator) GetSignBytes() []byte { b, err := MsgCdc.MarshalJSON(struct { Description - ValidatorAddr sdk.AccAddress `json:"address"` + DelegatorAddr sdk.AccAddress `json:"delegator_address"` + ValidatorAddr sdk.AccAddress `json:"validator_address"` PubKey string `json:"pubkey"` - Bond sdk.Coin `json:"bond"` + Delegation sdk.Coin `json:"delegation"` }{ Description: msg.Description, ValidatorAddr: msg.ValidatorAddr, PubKey: sdk.MustBech32ifyValPub(msg.PubKey), + Delegation: msg.Delegation, }) if err != nil { panic(err) @@ -68,10 +94,13 @@ func (msg MsgCreateValidator) GetSignBytes() []byte { // quick validity check func (msg MsgCreateValidator) ValidateBasic() sdk.Error { + if msg.DelegatorAddr == nil { + return ErrNilDelegatorAddr(DefaultCodespace) + } if msg.ValidatorAddr == nil { return ErrNilValidatorAddr(DefaultCodespace) } - if !(msg.SelfDelegation.Amount.GT(sdk.ZeroInt())) { + if !(msg.Delegation.Amount.GT(sdk.ZeroInt())) { return ErrBadDelegationAmount(DefaultCodespace) } empty := Description{} @@ -135,14 +164,14 @@ func (msg MsgEditValidator) ValidateBasic() sdk.Error { type MsgDelegate struct { DelegatorAddr sdk.AccAddress `json:"delegator_addr"` ValidatorAddr sdk.AccAddress `json:"validator_addr"` - Bond sdk.Coin `json:"bond"` + Delegation sdk.Coin `json:"delegation"` } -func NewMsgDelegate(delegatorAddr, validatorAddr sdk.AccAddress, bond sdk.Coin) MsgDelegate { +func NewMsgDelegate(delegatorAddr, validatorAddr sdk.AccAddress, delegation sdk.Coin) MsgDelegate { return MsgDelegate{ DelegatorAddr: delegatorAddr, ValidatorAddr: validatorAddr, - Bond: bond, + Delegation: delegation, } } @@ -169,7 +198,7 @@ func (msg MsgDelegate) ValidateBasic() sdk.Error { if msg.ValidatorAddr == nil { return ErrNilValidatorAddr(DefaultCodespace) } - if !(msg.Bond.Amount.GT(sdk.ZeroInt())) { + if !(msg.Delegation.Amount.GT(sdk.ZeroInt())) { return ErrBadDelegationAmount(DefaultCodespace) } return nil diff --git a/x/stake/types/msg_test.go b/x/stake/types/msg_test.go index d4a971bab..73eef084a 100644 --- a/x/stake/types/msg_test.go +++ b/x/stake/types/msg_test.go @@ -69,6 +69,46 @@ func TestMsgEditValidator(t *testing.T) { } } +// test ValidateBasic and GetSigners for MsgCreateValidatorOnBehalfOf +func TestMsgCreateValidatorOnBehalfOf(t *testing.T) { + tests := []struct { + name, moniker, identity, website, details string + delegatorAddr sdk.AccAddress + validatorAddr sdk.AccAddress + validatorPubKey crypto.PubKey + bond sdk.Coin + expectPass bool + }{ + {"basic good", "a", "b", "c", "d", addr1, addr2, pk2, coinPos, true}, + {"partial description", "", "", "c", "", addr1, addr2, pk2, coinPos, true}, + {"empty description", "", "", "", "", addr1, addr2, pk2, coinPos, false}, + {"empty delegator address", "a", "b", "c", "d", emptyAddr, addr2, pk2, coinPos, false}, + {"empty validator address", "a", "b", "c", "d", addr1, emptyAddr, pk2, coinPos, false}, + {"empty pubkey", "a", "b", "c", "d", addr1, addr2, emptyPubkey, coinPos, true}, + {"empty bond", "a", "b", "c", "d", addr1, addr2, pk2, coinZero, false}, + {"negative bond", "a", "b", "c", "d", addr1, addr2, pk2, coinNeg, false}, + {"negative bond", "a", "b", "c", "d", addr1, addr2, pk2, coinNeg, false}, + } + + for _, tc := range tests { + description := NewDescription(tc.moniker, tc.identity, tc.website, tc.details) + msg := NewMsgCreateValidatorOnBehalfOf(tc.delegatorAddr, tc.validatorAddr, tc.validatorPubKey, tc.bond, description) + if tc.expectPass { + require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name) + } else { + require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name) + } + } + + msg := NewMsgCreateValidator(addr1, pk1, coinPos, Description{}) + addrs := msg.GetSigners() + require.Equal(t, []sdk.AccAddress{addr1}, addrs, "Signers on default msg is wrong") + + msg = NewMsgCreateValidatorOnBehalfOf(addr2, addr1, pk1, coinPos, Description{}) + addrs = msg.GetSigners() + require.Equal(t, []sdk.AccAddress{addr2, addr1}, addrs, "Signers for onbehalfof msg is wrong") +} + // test ValidateBasic for MsgDelegate func TestMsgDelegate(t *testing.T) { tests := []struct { From e984b73b9631f5a222aa2ac22ad5a952094bc2d5 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 10 Jul 2018 20:34:39 -0400 Subject: [PATCH 13/16] update readme --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 0383fded2..e865a2c55 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,14 @@ ![banner](docs/graphics/cosmos-sdk-image.png) [![version](https://img.shields.io/github/tag/cosmos/cosmos-sdk.svg)](https://github.com/cosmos/cosmos-sdk/releases/latest) +[![CircleCI](https://circleci.com/gh/cosmos/cosmos-sdk/tree/master.svg?style=shield)](https://circleci.com/gh/cosmos/cosmos-sdk/tree/master) +[![codecov](https://codecov.io/gh/cosmos/cosmos-sdk/branch/master/graph/badge.svg)](https://codecov.io/gh/cosmos/cosmos-sdk) +[![Go Report Card](https://goreportcard.com/badge/github.com/cosmos/cosmos-sdk)](https://goreportcard.com/report/github.com/cosmos/cosmos-sdk) +[![license](https://img.shields.io/github/license/cosmos/cosmos-sdk.svg)](https://github.com/cosmos/cosmos-sdk/blob/master/LICENSE) +[![LoC](https://tokei.rs/b1/github/cosmos/cosmos-sdk)](https://github.com/cosmos/cosmos-sdk) [![API Reference](https://godoc.org/github.com/cosmos/cosmos-sdk?status.svg )](https://godoc.org/github.com/cosmos/cosmos-sdk) [![riot.im](https://img.shields.io/badge/riot.im-JOIN%20CHAT-green.svg)](https://riot.im/app/#/room/#cosmos-sdk:matrix.org) -[![license](https://img.shields.io/github/license/cosmos/cosmos-sdk.svg)](https://github.com/cosmos/cosmos-sdk/blob/master/LICENSE) -[![LoC](https://tokei.rs/b1/github/cosmos/cosmos-sdk)](https://github.com/cosmos/cosmos-sdk) -[![Go Report Card](https://goreportcard.com/badge/github.com/cosmos/cosmos-sdk)](https://goreportcard.com/report/github.com/cosmos/cosmos-sdk) - -Branch | Tests | Coverage -----------|-------|--------- -develop | [![CircleCI](https://circleci.com/gh/cosmos/cosmos-sdk/tree/develop.svg?style=shield)](https://circleci.com/gh/cosmos/cosmos-sdk/tree/develop) | [![codecov](https://codecov.io/gh/cosmos/cosmos-sdk/branch/develop/graph/badge.svg)](https://codecov.io/gh/cosmos/cosmos-sdk) -master | [![CircleCI](https://circleci.com/gh/cosmos/cosmos-sdk/tree/master.svg?style=shield)](https://circleci.com/gh/cosmos/cosmos-sdk/tree/master) | [![codecov](https://codecov.io/gh/cosmos/cosmos-sdk/branch/master/graph/badge.svg)](https://codecov.io/gh/cosmos/cosmos-sdk) The Cosmos-SDK is a framework for building blockchain applications in Golang. It is being used to build `Gaia`, the first implementation of the [Cosmos Hub](https://cosmos.network), @@ -20,6 +17,9 @@ It is being used to build `Gaia`, the first implementation of the [Cosmos Hub](h **WARNING**: The SDK has mostly stabilized, but we are still making some breaking changes. +**Note**: The `master` branch is an active development branch. For the latest +release, see the [release page](https://github.com/cosmos/cosmos-sdk/releases). + **Note**: Requires [Go 1.10+](https://golang.org/dl/) ## Gaia Testnet From c6827dfb43d180e4f8bb249ec4594ea01eb8ed17 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 10 Jul 2018 21:40:24 -0400 Subject: [PATCH 14/16] fix post merge --- Gopkg.lock | 3 +-- types/errors.go | 5 ++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index a98a7c86a..a73a2009a 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -137,7 +137,6 @@ ".", "hcl/ast", "hcl/parser", - "hcl/printer", "hcl/scanner", "hcl/strconv", "hcl/token", @@ -508,6 +507,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "33d51b55781a1579d2fde1bba70077b49c5804862ea56c72136f013c8498e0c6" + inputs-digest = "37c54ed9bde68bad33be02f5e09b17a42397fb2fc9a10fa582e66b3852a99370" solver-name = "gps-cdcl" solver-version = 1 diff --git a/types/errors.go b/types/errors.go index 0f37bbd6b..a106ee9bb 100644 --- a/types/errors.go +++ b/types/errors.go @@ -56,7 +56,10 @@ const ( CodeMemoTooLarge CodeType = 13 // CodespaceRoot is a codespace for error codes in this file only. - CodespaceRoot CodespaceType = 1 + // Notice that 0 is an "unset" codespace, which can be overridden with + // Error.WithDefaultCodespace(). + CodespaceUndefined CodespaceType = 0 + CodespaceRoot CodespaceType = 1 // Maximum reservable codespace (2^16 - 1) MaximumCodespace CodespaceType = 65535 From dd429fd5d0ddd789de1f79620bba920a6ab0e8fd Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 10 Jul 2018 23:27:47 -0400 Subject: [PATCH 15/16] democoin: fix genesis for amino --- examples/democoin/cmd/democoind/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/democoin/cmd/democoind/main.go b/examples/democoin/cmd/democoind/main.go index e74b3b700..0b6a9b8b1 100644 --- a/examples/democoin/cmd/democoind/main.go +++ b/examples/democoin/cmd/democoind/main.go @@ -42,8 +42,8 @@ func CoolAppGenState(cdc *wire.Codec, appGenTxs []json.RawMessage) (appState jso key = "pow" value = json.RawMessage(`{ - "difficulty": 1, - "count": 0 + "difficulty": "1", + "count": "0" }`) appState, err = server.InsertKeyJSON(cdc, appState, key, value) From e56379821c2c8a46c9dc396defde5a569e5ed0ee Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 10 Jul 2018 23:57:48 -0400 Subject: [PATCH 16/16] update changelog --- CHANGELOG.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 44fa7290e..f4ad1c0d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## 0.21.0 + +*TBD* + +BREAKING CHANGES +* [x/stake] Specify DelegatorAddress in MsgCreateValidator +* [x/auth] NewAccountMapper takes a constructor instead of a prototype + +FEATURES +* [baseapp] NewBaseApp now takes option functions as parameters + ## 0.20.0 *July 10th, 2018* @@ -21,7 +32,6 @@ BREAKING CHANGES * [auth] Removed MsgChangePubKey * [auth] Removed SetPubKey from account mapper * [auth] AltBytes renamed to Memo, now a string, max 100 characters, costs a bit of gas -* [baseapp] NewBaseApp now takes option functions as parameters * [types] `GetMsg()` -> `GetMsgs()` as txs wrap many messages * [types] Removed GetMemo from Tx (it is still on StdTx) * [types] renamed rational.Evaluate to rational.Round{Int64, Int} @@ -89,7 +99,6 @@ FEATURES * [tests] created a randomized testing framework. - Currently bank has limited functionality in the framework - Auth has its invariants checked within the framework -* [x/stake] Allow validator to be created with starting delegation by a third-party delegator on behalf of validator. * [tests] Add WaitForNextNBlocksTM helper method * [keys] New keys now have 24 word recovery keys, for heightened security