Browse Source

types: add AppVersion to ConsensusParams (#5031)

Co-authored-by: JamesRay <66258875@qq.com>

making it possible to change app version via EndBlock
pull/5044/head
Anton Kaliaev 4 years ago
committed by GitHub
parent
commit
ceac02b891
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 573 additions and 286 deletions
  1. +3
    -1
      CHANGELOG_PENDING.md
  2. +231
    -170
      abci/types/types.pb.go
  3. +3
    -3
      consensus/replay.go
  4. +1
    -0
      proto/tendermint/abci/types/types.proto
  5. +1
    -3
      proto/tendermint/consensus/walmsgs.pb.go
  6. +1
    -3
      proto/tendermint/crypto/keys/types.pb.go
  7. +289
    -40
      proto/tendermint/types/params.pb.go
  8. +9
    -0
      proto/tendermint/types/params.proto
  9. +3
    -1
      state/execution.go
  10. +3
    -5
      state/execution_test.go
  11. +6
    -22
      state/helpers_test.go
  12. +0
    -36
      state/state_test.go
  13. +2
    -2
      state/validation_test.go
  14. +10
    -0
      types/params.go
  15. +11
    -0
      types/params_test.go

+ 3
- 1
CHANGELOG_PENDING.md View File

@ -25,7 +25,7 @@ Friendly reminder, we have a [bug bounty program](https://hackerone.com/tendermi
- [crypto] \#4940 All keys have become `[]byte` instead of `[<size>]byte`. The byte method no longer returns the marshaled value but just the `[]byte` form of the data. - [crypto] \#4940 All keys have become `[]byte` instead of `[<size>]byte`. The byte method no longer returns the marshaled value but just the `[]byte` form of the data.
- [crypto] \4988 Removal of key type multisig - [crypto] \4988 Removal of key type multisig
- The key has been moved to the Cosmos-SDK (https://github.com/cosmos/cosmos-sdk/blob/master/crypto/types/multisig/multisignature.go) - The key has been moved to the Cosmos-SDK (https://github.com/cosmos/cosmos-sdk/blob/master/crypto/types/multisig/multisignature.go)
- [crypto] \#4989 Remove `Simple` prefixes from `SimpleProof`, `SimpleValueOp` & `SimpleProofNode`.
- [crypto] \#4989 Remove `Simple` prefixes from `SimpleProof`, `SimpleValueOp` & `SimpleProofNode`.
- `merkle.Proof` has been renamed to `ProofOps`. - `merkle.Proof` has been renamed to `ProofOps`.
- Protobuf messages `Proof` & `ProofOp` has been moved to `proto/crypto/merkle` - Protobuf messages `Proof` & `ProofOp` has been moved to `proto/crypto/merkle`
- `SimpleHashFromByteSlices` has been renamed to `HashFromByteSlices` - `SimpleHashFromByteSlices` has been renamed to `HashFromByteSlices`
@ -91,6 +91,8 @@ Friendly reminder, we have a [bug bounty program](https://hackerone.com/tendermi
- [p2p] \#4981 Expose `SaveAs` func on NodeKey (@melekes) - [p2p] \#4981 Expose `SaveAs` func on NodeKey (@melekes)
- [evidence] [#4821](https://github.com/tendermint/tendermint/pull/4821) Amnesia evidence can be detected, verified and committed (@cmwaters) - [evidence] [#4821](https://github.com/tendermint/tendermint/pull/4821) Amnesia evidence can be detected, verified and committed (@cmwaters)
- [rpc] \#5017 Add `/check_tx` endpoint to check transactions without executing them or adding them to the mempool (@melekes) - [rpc] \#5017 Add `/check_tx` endpoint to check transactions without executing them or adding them to the mempool (@melekes)
- [abci] \#5031 Add `AppVersion` to consensus parameters (@james-ray)
... making it possible to update your ABCI application version via `EndBlock` response
### IMPROVEMENTS: ### IMPROVEMENTS:


+ 231
- 170
abci/types/types.pb.go View File

@ -2420,6 +2420,7 @@ type ConsensusParams struct {
Block *BlockParams `protobuf:"bytes,1,opt,name=block,proto3" json:"block,omitempty"` Block *BlockParams `protobuf:"bytes,1,opt,name=block,proto3" json:"block,omitempty"`
Evidence *types1.EvidenceParams `protobuf:"bytes,2,opt,name=evidence,proto3" json:"evidence,omitempty"` Evidence *types1.EvidenceParams `protobuf:"bytes,2,opt,name=evidence,proto3" json:"evidence,omitempty"`
Validator *types1.ValidatorParams `protobuf:"bytes,3,opt,name=validator,proto3" json:"validator,omitempty"` Validator *types1.ValidatorParams `protobuf:"bytes,3,opt,name=validator,proto3" json:"validator,omitempty"`
Version *types1.VersionParams `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"`
} }
func (m *ConsensusParams) Reset() { *m = ConsensusParams{} } func (m *ConsensusParams) Reset() { *m = ConsensusParams{} }
@ -2476,6 +2477,13 @@ func (m *ConsensusParams) GetValidator() *types1.ValidatorParams {
return nil return nil
} }
func (m *ConsensusParams) GetVersion() *types1.VersionParams {
if m != nil {
return m.Version
}
return nil
}
// BlockParams contains limits on the block size. // BlockParams contains limits on the block size.
type BlockParams struct { type BlockParams struct {
// Note: must be greater than 0 // Note: must be greater than 0
@ -3132,173 +3140,174 @@ func init() {
func init() { proto.RegisterFile("tendermint/abci/types/types.proto", fileDescriptor_59fda1d591595b39) } func init() { proto.RegisterFile("tendermint/abci/types/types.proto", fileDescriptor_59fda1d591595b39) }
var fileDescriptor_59fda1d591595b39 = []byte{ var fileDescriptor_59fda1d591595b39 = []byte{
// 2645 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5a, 0xcd, 0x72, 0x1b, 0xc7,
0xf1, 0xc7, 0x02, 0x20, 0x3e, 0x9a, 0x04, 0x08, 0x8e, 0x68, 0x19, 0xc6, 0x5f, 0x26, 0xe5, 0x95,
0x65, 0xcb, 0xb6, 0xfe, 0xa0, 0x4d, 0x57, 0xb9, 0xe4, 0x48, 0x89, 0x43, 0x50, 0x54, 0xc0, 0x48,
0x16, 0xa9, 0x25, 0xa9, 0xc8, 0x49, 0x95, 0x37, 0x83, 0xdd, 0x21, 0xb0, 0x26, 0xb0, 0xbb, 0xc6,
0x0e, 0x28, 0x22, 0x95, 0x43, 0x2a, 0x97, 0x54, 0x6e, 0xca, 0x03, 0xe4, 0x1d, 0x72, 0x48, 0x95,
0xf3, 0x02, 0xa9, 0x72, 0xe5, 0xe4, 0x63, 0x4e, 0x4e, 0x4a, 0xca, 0x29, 0x79, 0x87, 0x54, 0x6a,
0x3e, 0xf6, 0x0b, 0x9f, 0x0b, 0x47, 0xb7, 0x5c, 0x50, 0x33, 0xbd, 0xdd, 0x3d, 0x33, 0x3d, 0x33,
0xdd, 0xbf, 0xee, 0x01, 0xbc, 0x41, 0x89, 0x6d, 0x92, 0x7e, 0xcf, 0xb2, 0xe9, 0x16, 0x6e, 0x19,
0xd6, 0x16, 0x1d, 0xba, 0xc4, 0x13, 0xbf, 0x75, 0xb7, 0xef, 0x50, 0x07, 0xbd, 0x12, 0xb2, 0xd4,
0x19, 0x4b, 0x9d, 0x7f, 0xac, 0xbd, 0x19, 0x91, 0x34, 0xfa, 0x43, 0x97, 0x3a, 0x5b, 0x3d, 0xd2,
0x3f, 0xeb, 0x92, 0xa8, 0x70, 0xed, 0x4a, 0x84, 0x6b, 0x4c, 0x75, 0x4d, 0x1d, 0xd7, 0x71, 0x46,
0x86, 0x71, 0x9e, 0xd7, 0xc7, 0x34, 0xb8, 0xb8, 0x8f, 0x7b, 0xfe, 0xe7, 0xcd, 0xb6, 0xe3, 0xb4,
0xbb, 0x64, 0x8b, 0xf7, 0x5a, 0x83, 0xd3, 0x2d, 0x6a, 0xf5, 0x88, 0x47, 0x71, 0xcf, 0x95, 0x0c,
0xeb, 0x6d, 0xa7, 0xed, 0xf0, 0xe6, 0x16, 0x6b, 0x09, 0xaa, 0xfa, 0xaf, 0x02, 0xe4, 0x35, 0xf2,
0xe5, 0x80, 0x78, 0x14, 0xdd, 0x82, 0x2c, 0x31, 0x3a, 0x4e, 0x35, 0x7d, 0x55, 0xb9, 0xb1, 0xbc,
0xad, 0xd6, 0x27, 0xae, 0xb7, 0x2e, 0xb9, 0xf7, 0x8c, 0x8e, 0xd3, 0x4c, 0x69, 0x5c, 0x02, 0xdd,
0x86, 0xa5, 0xd3, 0xee, 0xc0, 0xeb, 0x54, 0x33, 0x5c, 0xf4, 0xda, 0x6c, 0xd1, 0x7b, 0x8c, 0xb5,
0x99, 0xd2, 0x84, 0x0c, 0x1b, 0xd6, 0xb2, 0x4f, 0x9d, 0x6a, 0x36, 0xc9, 0xb0, 0xfb, 0xf6, 0x29,
0x1f, 0x96, 0x49, 0xa0, 0x26, 0x80, 0x47, 0xa8, 0xee, 0xb8, 0xd4, 0x72, 0xec, 0xea, 0x12, 0x97,
0x7f, 0x7b, 0xb6, 0xfc, 0x11, 0xa1, 0x07, 0x9c, 0xbd, 0x99, 0xd2, 0x8a, 0x9e, 0xdf, 0x61, 0x9a,
0x2c, 0xdb, 0xa2, 0xba, 0xd1, 0xc1, 0x96, 0x5d, 0xcd, 0x25, 0xd1, 0xb4, 0x6f, 0x5b, 0x74, 0x97,
0xb1, 0x33, 0x4d, 0x96, 0xdf, 0x61, 0xa6, 0xf8, 0x72, 0x40, 0xfa, 0xc3, 0x6a, 0x3e, 0x89, 0x29,
0x1e, 0x31, 0x56, 0x66, 0x0a, 0x2e, 0x83, 0xee, 0xc3, 0x72, 0x8b, 0xb4, 0x2d, 0x5b, 0x6f, 0x75,
0x1d, 0xe3, 0xac, 0x5a, 0xe0, 0x2a, 0x6e, 0xcc, 0x56, 0xd1, 0x60, 0x02, 0x0d, 0xc6, 0xdf, 0x4c,
0x69, 0xd0, 0x0a, 0x7a, 0xa8, 0x01, 0x05, 0xa3, 0x43, 0x8c, 0x33, 0x9d, 0x5e, 0x54, 0x8b, 0x5c,
0xd3, 0xf5, 0xd9, 0x9a, 0x76, 0x19, 0xf7, 0xf1, 0x45, 0x33, 0xa5, 0xe5, 0x0d, 0xd1, 0x64, 0x76,
0x31, 0x49, 0xd7, 0x3a, 0x27, 0x7d, 0xa6, 0xe5, 0x52, 0x12, 0xbb, 0xdc, 0x15, 0xfc, 0x5c, 0x4f,
0xd1, 0xf4, 0x3b, 0x68, 0x0f, 0x8a, 0xc4, 0x36, 0xe5, 0xc2, 0x96, 0xb9, 0xa2, 0xb7, 0xe6, 0x9c,
0x30, 0xdb, 0xf4, 0x97, 0x55, 0x20, 0xb2, 0x8d, 0x7e, 0x00, 0x39, 0xc3, 0xe9, 0xf5, 0x2c, 0x5a,
0x5d, 0xe1, 0x3a, 0xde, 0x9c, 0xb3, 0x24, 0xce, 0xdb, 0x4c, 0x69, 0x52, 0x0a, 0x1d, 0x43, 0xb9,
0x6b, 0x79, 0x54, 0xf7, 0x6c, 0xec, 0x7a, 0x1d, 0x87, 0x7a, 0xd5, 0x12, 0xd7, 0xf3, 0xde, 0x6c,
0x3d, 0x0f, 0x2c, 0x8f, 0x1e, 0xf9, 0x22, 0xcd, 0x94, 0x56, 0xea, 0x46, 0x09, 0x4c, 0xab, 0x73,
0x7a, 0x4a, 0xfa, 0x81, 0xda, 0x6a, 0x39, 0x89, 0xd6, 0x03, 0x26, 0xe3, 0x6b, 0x61, 0x5a, 0x9d,
0x28, 0x01, 0x61, 0xb8, 0xd4, 0x75, 0xb0, 0x19, 0x28, 0xd5, 0x8d, 0xce, 0xc0, 0x3e, 0xab, 0xae,
0x72, 0xd5, 0x5b, 0x73, 0x26, 0xec, 0x60, 0xd3, 0x57, 0xb4, 0xcb, 0xc4, 0x9a, 0x29, 0x6d, 0xad,
0x3b, 0x4a, 0x44, 0x26, 0xac, 0x63, 0xd7, 0xed, 0x0e, 0x47, 0xc7, 0xa8, 0xf0, 0x31, 0xde, 0x9f,
0x3d, 0xc6, 0x0e, 0x93, 0x1c, 0x1d, 0x04, 0xe1, 0x31, 0x6a, 0x23, 0x0f, 0x4b, 0xe7, 0xb8, 0x3b,
0x20, 0xea, 0xdb, 0xb0, 0x1c, 0x71, 0x1f, 0xa8, 0x0a, 0xf9, 0x1e, 0xf1, 0x3c, 0xdc, 0x26, 0x55,
0xe5, 0xaa, 0x72, 0xa3, 0xa8, 0xf9, 0x5d, 0xb5, 0x0c, 0x2b, 0x51, 0x67, 0xa1, 0xf6, 0x02, 0x41,
0xe6, 0x00, 0x98, 0xe0, 0x39, 0xe9, 0x7b, 0xec, 0xd6, 0x4b, 0x41, 0xd9, 0x45, 0xd7, 0xa0, 0xc4,
0x8f, 0x98, 0xee, 0x7f, 0x67, 0xce, 0x2c, 0xab, 0xad, 0x70, 0xe2, 0x63, 0xc9, 0xb4, 0x09, 0xcb,
0xee, 0xb6, 0x1b, 0xb0, 0x64, 0x38, 0x0b, 0xb8, 0xdb, 0xae, 0x64, 0x50, 0xbf, 0x07, 0x95, 0x51,
0x7f, 0x81, 0x2a, 0x90, 0x39, 0x23, 0x43, 0x39, 0x1e, 0x6b, 0xa2, 0x75, 0xb9, 0x2c, 0x3e, 0x46,
0x51, 0x93, 0x6b, 0xfc, 0x43, 0x3a, 0x10, 0x0e, 0x5c, 0x04, 0xf3, 0x71, 0xcc, 0x1f, 0x73, 0xe9,
0xe5, 0xed, 0x5a, 0x5d, 0x38, 0xeb, 0xba, 0xef, 0xac, 0xeb, 0xc7, 0xbe, 0xb3, 0x6e, 0x14, 0xbe,
0xfe, 0x76, 0x33, 0xf5, 0xec, 0x6f, 0x9b, 0x8a, 0xc6, 0x25, 0xd0, 0x6b, 0xec, 0x16, 0x63, 0xcb,
0xd6, 0x2d, 0x53, 0x8e, 0x93, 0xe7, 0xfd, 0x7d, 0x13, 0x3d, 0x82, 0x8a, 0xe1, 0xd8, 0x1e, 0xb1,
0xbd, 0x81, 0xa7, 0x8b, 0x60, 0x20, 0x1d, 0xf0, 0xb4, 0x9b, 0xb5, 0xeb, 0xb3, 0x1f, 0x72, 0x6e,
0x6d, 0xd5, 0x88, 0x13, 0xd0, 0x03, 0x80, 0x73, 0xdc, 0xb5, 0x4c, 0x4c, 0x9d, 0xbe, 0x57, 0xcd,
0x5e, 0xcd, 0xcc, 0x50, 0xf6, 0xd8, 0x67, 0x3c, 0x71, 0x4d, 0x4c, 0x49, 0x23, 0xcb, 0x66, 0xae,
0x45, 0xe4, 0xd1, 0x5b, 0xb0, 0x8a, 0x5d, 0x57, 0xf7, 0x28, 0xa6, 0x44, 0x6f, 0x0d, 0x29, 0xf1,
0xb8, 0x93, 0x5e, 0xd1, 0x4a, 0xd8, 0x75, 0x8f, 0x18, 0xb5, 0xc1, 0x88, 0xaa, 0x19, 0xec, 0x36,
0xf7, 0x87, 0x08, 0x41, 0xd6, 0xc4, 0x14, 0x73, 0x6b, 0xad, 0x68, 0xbc, 0xcd, 0x68, 0x2e, 0xa6,
0x1d, 0x69, 0x03, 0xde, 0x46, 0x97, 0x21, 0xd7, 0x21, 0x56, 0xbb, 0x43, 0xf9, 0xb2, 0x33, 0x9a,
0xec, 0xb1, 0x8d, 0x71, 0xfb, 0xce, 0x39, 0xe1, 0x21, 0xa5, 0xa0, 0x89, 0x8e, 0xfa, 0x2c, 0x0d,
0x6b, 0x63, 0x3e, 0x93, 0xe9, 0xed, 0x60, 0xaf, 0xe3, 0x8f, 0xc5, 0xda, 0xe8, 0x23, 0xa6, 0x17,
0x9b, 0xa4, 0x2f, 0x43, 0x61, 0x35, 0x6a, 0x01, 0xb1, 0xf8, 0x26, 0xff, 0x2e, 0xd7, 0x2c, 0xb9,
0xd1, 0x09, 0x54, 0xba, 0xd8, 0xa3, 0xba, 0xf0, 0x35, 0x3a, 0x8f, 0x6a, 0x99, 0x99, 0x9e, 0xf7,
0x01, 0xf6, 0x7d, 0x14, 0x3b, 0xd7, 0x52, 0x5d, 0xb9, 0x1b, 0xa3, 0xa2, 0x27, 0xb0, 0xde, 0x1a,
0xfe, 0x02, 0xdb, 0xd4, 0xb2, 0x89, 0x3e, 0xb6, 0x3d, 0x9b, 0x53, 0x54, 0xef, 0x9d, 0x5b, 0x26,
0xb1, 0x0d, 0x7f, 0x5f, 0x2e, 0x05, 0x2a, 0x82, 0x7d, 0xf3, 0xd4, 0x27, 0x50, 0x8e, 0xfb, 0x7e,
0x54, 0x86, 0x34, 0xbd, 0x90, 0xc6, 0x48, 0xd3, 0x0b, 0xf4, 0x11, 0x64, 0x99, 0x3a, 0x6e, 0x88,
0xf2, 0xd4, 0xe0, 0x2c, 0xa5, 0x8f, 0x87, 0x2e, 0xd1, 0x38, 0xbf, 0xaa, 0x06, 0x97, 0x20, 0x88,
0x07, 0xa3, 0xba, 0xd5, 0x77, 0x60, 0x75, 0xc4, 0xd5, 0x47, 0x76, 0x54, 0x89, 0xee, 0xa8, 0xba,
0x0a, 0xa5, 0x98, 0x47, 0x57, 0x2f, 0xc3, 0xfa, 0x24, 0xd7, 0xac, 0xda, 0x01, 0x3d, 0xe6, 0x5c,
0xd1, 0x6d, 0x28, 0x04, 0xbe, 0x59, 0x5c, 0xc2, 0x69, 0x76, 0xf3, 0x45, 0xb4, 0x40, 0x80, 0xdd,
0x41, 0x76, 0x8e, 0xf9, 0x39, 0x49, 0xf3, 0xe9, 0xe7, 0xb1, 0xeb, 0x36, 0xb1, 0xd7, 0x51, 0x7f,
0x0e, 0xd5, 0x69, 0x1e, 0x77, 0x64, 0x31, 0xd9, 0xe0, 0x78, 0x5e, 0x86, 0xdc, 0xa9, 0xd3, 0xef,
0x61, 0xca, 0x95, 0x95, 0x34, 0xd9, 0x63, 0xc7, 0x56, 0x78, 0xdf, 0x0c, 0x27, 0x8b, 0x8e, 0xaa,
0xc3, 0x6b, 0x53, 0xfd, 0x2d, 0x13, 0xb1, 0x6c, 0x93, 0x08, 0xab, 0x96, 0x34, 0xd1, 0x09, 0x15,
0x89, 0xc9, 0x8a, 0x0e, 0x1b, 0xd6, 0xe3, 0x2b, 0xe6, 0xfa, 0x8b, 0x9a, 0xec, 0xa9, 0x7f, 0x2e,
0x42, 0x41, 0x23, 0x9e, 0xcb, 0x5c, 0x01, 0x6a, 0x42, 0x91, 0x5c, 0x18, 0x44, 0x20, 0x2a, 0x65,
0x0e, 0xfe, 0x10, 0x32, 0x7b, 0x3e, 0x3f, 0x0b, 0xf8, 0x81, 0x30, 0xfa, 0x38, 0x86, 0x26, 0xaf,
0xcd, 0x53, 0x12, 0x85, 0x93, 0x77, 0xe2, 0x70, 0xf2, 0xcd, 0x39, 0xb2, 0x23, 0x78, 0xf2, 0xe3,
0x18, 0x9e, 0x9c, 0x37, 0x70, 0x0c, 0x50, 0xee, 0x4f, 0x00, 0x94, 0xf3, 0x96, 0x3f, 0x05, 0x51,
0xee, 0x4f, 0x40, 0x94, 0x37, 0xe6, 0xce, 0x65, 0x22, 0xa4, 0xbc, 0x13, 0x87, 0x94, 0xf3, 0xcc,
0x31, 0x82, 0x29, 0x1f, 0x4c, 0xc2, 0x94, 0xef, 0xcc, 0xd1, 0x31, 0x15, 0x54, 0xee, 0x8e, 0x81,
0xca, 0xb7, 0xe6, 0xa8, 0x9a, 0x80, 0x2a, 0xf7, 0x63, 0xa8, 0x12, 0x12, 0xd9, 0x66, 0x0a, 0xac,
0xbc, 0x37, 0x0e, 0x2b, 0xdf, 0x9e, 0x77, 0xd4, 0x26, 0xe1, 0xca, 0x4f, 0x46, 0x70, 0xe5, 0xf5,
0x79, 0xab, 0x1a, 0x05, 0x96, 0x27, 0x53, 0x80, 0xe5, 0xcd, 0x39, 0x8a, 0xe6, 0x20, 0xcb, 0x93,
0x29, 0xc8, 0x72, 0x9e, 0xda, 0x39, 0xd0, 0xb2, 0x35, 0x0b, 0x5a, 0xbe, 0x3f, 0x6f, 0xca, 0xc9,
0xb0, 0x25, 0x99, 0x89, 0x2d, 0x3f, 0x98, 0x33, 0xc8, 0xe2, 0xe0, 0xf2, 0x1d, 0x16, 0xde, 0x47,
0x5c, 0x12, 0x73, 0x85, 0xa4, 0xdf, 0x77, 0xfa, 0x12, 0xb7, 0x89, 0x8e, 0x7a, 0x83, 0x01, 0x8e,
0xd0, 0xf1, 0xcc, 0x00, 0xa2, 0x3c, 0xf0, 0x44, 0xdc, 0x8c, 0xfa, 0x27, 0x25, 0x94, 0xe5, 0xd1,
0x39, 0x0a, 0x56, 0x8a, 0x12, 0xac, 0x44, 0xf0, 0x69, 0x3a, 0x8e, 0x4f, 0x37, 0x61, 0x99, 0x85,
0x92, 0x11, 0xe8, 0x89, 0x5d, 0x1f, 0x7a, 0xa2, 0x77, 0x61, 0x8d, 0x63, 0x08, 0x81, 0x62, 0x65,
0xfc, 0xc8, 0xf2, 0x60, 0xb8, 0xca, 0x3e, 0x88, 0xa3, 0x2b, 0x02, 0xc9, 0xff, 0xc3, 0xa5, 0x08,
0x6f, 0x10, 0xa2, 0x04, 0xc6, 0xaa, 0x04, 0xdc, 0x3b, 0x32, 0x56, 0x7d, 0x1a, 0x1a, 0x28, 0x84,
0xb5, 0x08, 0xb2, 0x86, 0x63, 0x12, 0x19, 0x40, 0x78, 0x9b, 0x41, 0xdd, 0xae, 0xd3, 0x96, 0x61,
0x82, 0x35, 0x19, 0x57, 0xe0, 0x53, 0x8b, 0xc2, 0x59, 0xaa, 0x7f, 0x54, 0x42, 0x7d, 0x21, 0xd2,
0x9d, 0x04, 0x4a, 0x95, 0x97, 0x09, 0x4a, 0xd3, 0xff, 0x1d, 0x28, 0x55, 0xff, 0xad, 0x84, 0x5b,
0x1a, 0xc0, 0xcd, 0xef, 0x66, 0x82, 0x30, 0xfc, 0x2e, 0xf1, 0x0d, 0x92, 0xe1, 0x57, 0x66, 0x0a,
0x39, 0xbe, 0x0d, 0xf1, 0x4c, 0x21, 0x2f, 0x02, 0x32, 0xef, 0xa0, 0x4f, 0xa0, 0xe8, 0xf6, 0x1d,
0xe7, 0x54, 0x77, 0x5c, 0x4f, 0xfa, 0xe5, 0x18, 0xc0, 0x12, 0x95, 0xa0, 0xba, 0xa8, 0x26, 0xd5,
0x0f, 0x19, 0xeb, 0x81, 0xeb, 0x69, 0x05, 0x57, 0xb6, 0x22, 0x00, 0xa3, 0x18, 0xc3, 0xbf, 0x57,
0xa0, 0xc8, 0x16, 0xe1, 0xb9, 0xd8, 0x20, 0xdc, 0xbd, 0x16, 0xb5, 0x90, 0xa0, 0x9a, 0x80, 0xc6,
0xdd, 0x3c, 0x7a, 0x08, 0x39, 0x72, 0x4e, 0x6c, 0xca, 0x76, 0x8b, 0x19, 0xf8, 0xca, 0x54, 0x58,
0x49, 0x6c, 0xda, 0xa8, 0x32, 0xb3, 0xfe, 0xf3, 0xdb, 0xcd, 0x8a, 0x90, 0xb9, 0xe9, 0xf4, 0x2c,
0x4a, 0x7a, 0x2e, 0x1d, 0x6a, 0x52, 0x8b, 0xfa, 0x9b, 0x34, 0x43, 0x77, 0xb1, 0x10, 0x30, 0xd1,
0xd0, 0xfe, 0xf5, 0x49, 0x47, 0xb0, 0x7e, 0x32, 0xe3, 0xbf, 0x0e, 0xd0, 0xc6, 0x9e, 0xfe, 0x14,
0xdb, 0x94, 0x98, 0x72, 0x07, 0x8a, 0x6d, 0xec, 0xfd, 0x84, 0x13, 0x18, 0x68, 0x63, 0x9f, 0x07,
0x1e, 0x31, 0xf9, 0x56, 0x64, 0xb4, 0x7c, 0x1b, 0x7b, 0x27, 0x1e, 0x31, 0x23, 0x6b, 0xcd, 0xbf,
0x8c, 0xb5, 0xc6, 0xed, 0x5d, 0x18, 0xb5, 0xf7, 0x6f, 0xd3, 0xe1, 0x3d, 0x09, 0xc1, 0xf0, 0xff,
0xa6, 0x2d, 0x7e, 0xcf, 0x93, 0xe3, 0x78, 0x1c, 0x46, 0x9f, 0xc1, 0x5a, 0x70, 0x3f, 0xf5, 0x01,
0xbf, 0xb7, 0xfe, 0x29, 0x5c, 0xec, 0x9a, 0x57, 0xce, 0xe3, 0x64, 0x0f, 0x7d, 0x0e, 0xaf, 0x8e,
0x78, 0xa3, 0x60, 0x80, 0xf4, 0x42, 0x4e, 0xe9, 0x95, 0xb8, 0x53, 0xf2, 0xf5, 0x87, 0xd6, 0xcb,
0xbc, 0x94, 0x5b, 0xb3, 0xcf, 0x12, 0xb2, 0x28, 0xc2, 0x98, 0x78, 0x26, 0xae, 0x41, 0xa9, 0x4f,
0x28, 0xb6, 0x6c, 0x3d, 0x96, 0xfe, 0xae, 0x08, 0xa2, 0x08, 0x0e, 0xea, 0x63, 0x78, 0x65, 0x22,
0xc6, 0x40, 0xdf, 0x87, 0x62, 0x08, 0x52, 0x94, 0x99, 0x39, 0x64, 0x90, 0x0b, 0x85, 0x12, 0xea,
0x57, 0x4a, 0xa8, 0x38, 0x9e, 0x63, 0xdd, 0x87, 0x5c, 0x9f, 0x78, 0x83, 0xae, 0xc8, 0x77, 0xca,
0xdb, 0x1f, 0x2e, 0x82, 0x51, 0x18, 0x75, 0xd0, 0xa5, 0x9a, 0x54, 0xa1, 0x3e, 0x82, 0x9c, 0xa0,
0x20, 0x80, 0xdc, 0xce, 0xee, 0xee, 0xde, 0xe1, 0x71, 0x25, 0x85, 0x8a, 0xb0, 0xb4, 0xd3, 0x38,
0xd0, 0x8e, 0x2b, 0x0a, 0x23, 0x6b, 0x7b, 0x3f, 0xde, 0xdb, 0x3d, 0xae, 0xa4, 0xd1, 0x1a, 0x94,
0x44, 0x5b, 0xbf, 0x77, 0xa0, 0x7d, 0xba, 0x73, 0x5c, 0xc9, 0x44, 0x48, 0x47, 0x7b, 0x0f, 0xef,
0xee, 0x69, 0x95, 0xac, 0xfa, 0x01, 0xcb, 0xa4, 0xa6, 0x40, 0x98, 0x30, 0x67, 0x52, 0x22, 0x39,
0x93, 0xfa, 0xbb, 0x34, 0xd4, 0xa6, 0x23, 0x12, 0x74, 0x38, 0xb2, 0xe2, 0x5b, 0x0b, 0x83, 0x9a,
0x91, 0x65, 0xa3, 0xeb, 0x50, 0xee, 0x93, 0x53, 0x42, 0x8d, 0x8e, 0x40, 0x4b, 0x22, 0xde, 0x95,
0xb4, 0x92, 0xa4, 0x72, 0x21, 0x4f, 0xb0, 0x7d, 0x41, 0x0c, 0xaa, 0x8b, 0x24, 0x4e, 0x9c, 0xbf,
0x22, 0x63, 0x63, 0xd4, 0x23, 0x41, 0x54, 0x8f, 0xe6, 0x19, 0xb1, 0x08, 0x4b, 0xda, 0xde, 0xb1,
0xf6, 0x59, 0x25, 0x8d, 0x10, 0x94, 0x79, 0x53, 0x3f, 0x7a, 0xb8, 0x73, 0x78, 0xd4, 0x3c, 0x60,
0x46, 0xbc, 0x04, 0xab, 0xbe, 0x11, 0x7d, 0x62, 0x56, 0xfd, 0x8b, 0x02, 0xab, 0x23, 0xd7, 0x03,
0xdd, 0x82, 0x25, 0x01, 0xc1, 0x95, 0x99, 0x45, 0x7c, 0x7e, 0xdf, 0xe5, 0x8d, 0x12, 0x02, 0xe8,
// 2661 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5a, 0x5b, 0x6f, 0x1b, 0xc7,
0xf5, 0xe7, 0x92, 0x14, 0x2f, 0x47, 0x22, 0x45, 0x8d, 0x15, 0x87, 0xe1, 0xdf, 0x91, 0x9c, 0x75,
0x9c, 0x38, 0x97, 0x3f, 0x95, 0x28, 0x40, 0x60, 0xd7, 0x6e, 0x53, 0x51, 0x96, 0x4b, 0xd5, 0x8e,
0x25, 0xaf, 0x24, 0xd7, 0x69, 0x81, 0x6c, 0x87, 0xbb, 0x23, 0x72, 0x23, 0x72, 0x77, 0xc3, 0x1d,
0xca, 0x62, 0xd1, 0x87, 0xa2, 0x40, 0x51, 0xf4, 0xcd, 0xfd, 0x00, 0xfd, 0x0e, 0x7d, 0x28, 0x90,
0x7e, 0x81, 0x02, 0x79, 0xcc, 0x63, 0x9f, 0xd2, 0xc2, 0xee, 0x53, 0xfb, 0x1d, 0x8a, 0x62, 0x2e,
0x7b, 0xe3, 0x75, 0x99, 0xfa, 0xad, 0x2f, 0xc4, 0xcc, 0xd9, 0x73, 0xce, 0xcc, 0x9c, 0x99, 0x39,
0xe7, 0x77, 0xce, 0x10, 0xde, 0xa0, 0xc4, 0x36, 0x49, 0xbf, 0x67, 0xd9, 0x74, 0x0b, 0xb7, 0x0c,
0x6b, 0x8b, 0x0e, 0x5d, 0xe2, 0x89, 0xdf, 0xba, 0xdb, 0x77, 0xa8, 0x83, 0x5e, 0x09, 0x59, 0xea,
0x8c, 0xa5, 0xce, 0x3f, 0xd6, 0xde, 0x8c, 0x48, 0x1a, 0xfd, 0xa1, 0x4b, 0x9d, 0xad, 0x1e, 0xe9,
0x9f, 0x75, 0x49, 0x54, 0xb8, 0x76, 0x25, 0xc2, 0x35, 0xa6, 0xba, 0xa6, 0x8e, 0xeb, 0x38, 0x23,
0xc3, 0x38, 0xcf, 0xeb, 0x63, 0x1a, 0x5c, 0xdc, 0xc7, 0x3d, 0xff, 0xf3, 0x66, 0xdb, 0x71, 0xda,
0x5d, 0xb2, 0xc5, 0x7b, 0xad, 0xc1, 0xe9, 0x16, 0xb5, 0x7a, 0xc4, 0xa3, 0xb8, 0xe7, 0x4a, 0x86,
0xf5, 0xb6, 0xd3, 0x76, 0x78, 0x73, 0x8b, 0xb5, 0x04, 0x55, 0xfd, 0x57, 0x01, 0xf2, 0x1a, 0xf9,
0x72, 0x40, 0x3c, 0x8a, 0x6e, 0x42, 0x96, 0x18, 0x1d, 0xa7, 0x9a, 0xbe, 0xaa, 0xdc, 0x58, 0xde,
0x56, 0xeb, 0x13, 0xd7, 0x5b, 0x97, 0xdc, 0x7b, 0x46, 0xc7, 0x69, 0xa6, 0x34, 0x2e, 0x81, 0x6e,
0xc3, 0xd2, 0x69, 0x77, 0xe0, 0x75, 0xaa, 0x19, 0x2e, 0x7a, 0x6d, 0xb6, 0xe8, 0x3d, 0xc6, 0xda,
0x4c, 0x69, 0x42, 0x86, 0x0d, 0x6b, 0xd9, 0xa7, 0x4e, 0x35, 0x9b, 0x64, 0xd8, 0x7d, 0xfb, 0x94,
0x0f, 0xcb, 0x24, 0x50, 0x13, 0xc0, 0x23, 0x54, 0x77, 0x5c, 0x6a, 0x39, 0x76, 0x75, 0x89, 0xcb,
0xbf, 0x3d, 0x5b, 0xfe, 0x88, 0xd0, 0x03, 0xce, 0xde, 0x4c, 0x69, 0x45, 0xcf, 0xef, 0x30, 0x4d,
0x96, 0x6d, 0x51, 0xdd, 0xe8, 0x60, 0xcb, 0xae, 0xe6, 0x92, 0x68, 0xda, 0xb7, 0x2d, 0xba, 0xcb,
0xd8, 0x99, 0x26, 0xcb, 0xef, 0x30, 0x53, 0x7c, 0x39, 0x20, 0xfd, 0x61, 0x35, 0x9f, 0xc4, 0x14,
0x8f, 0x18, 0x2b, 0x33, 0x05, 0x97, 0x41, 0xf7, 0x61, 0xb9, 0x45, 0xda, 0x96, 0xad, 0xb7, 0xba,
0x8e, 0x71, 0x56, 0x2d, 0x70, 0x15, 0x37, 0x66, 0xab, 0x68, 0x30, 0x81, 0x06, 0xe3, 0x6f, 0xa6,
0x34, 0x68, 0x05, 0x3d, 0xd4, 0x80, 0x82, 0xd1, 0x21, 0xc6, 0x99, 0x4e, 0x2f, 0xaa, 0x45, 0xae,
0xe9, 0xfa, 0x6c, 0x4d, 0xbb, 0x8c, 0xfb, 0xf8, 0xa2, 0x99, 0xd2, 0xf2, 0x86, 0x68, 0x32, 0xbb,
0x98, 0xa4, 0x6b, 0x9d, 0x93, 0x3e, 0xd3, 0x72, 0x29, 0x89, 0x5d, 0xee, 0x0a, 0x7e, 0xae, 0xa7,
0x68, 0xfa, 0x1d, 0xb4, 0x07, 0x45, 0x62, 0x9b, 0x72, 0x61, 0xcb, 0x5c, 0xd1, 0x5b, 0x73, 0x4e,
0x98, 0x6d, 0xfa, 0xcb, 0x2a, 0x10, 0xd9, 0x46, 0x3f, 0x80, 0x9c, 0xe1, 0xf4, 0x7a, 0x16, 0xad,
0xae, 0x70, 0x1d, 0x6f, 0xce, 0x59, 0x12, 0xe7, 0x6d, 0xa6, 0x34, 0x29, 0x85, 0x8e, 0xa1, 0xdc,
0xb5, 0x3c, 0xaa, 0x7b, 0x36, 0x76, 0xbd, 0x8e, 0x43, 0xbd, 0x6a, 0x89, 0xeb, 0x79, 0x6f, 0xb6,
0x9e, 0x07, 0x96, 0x47, 0x8f, 0x7c, 0x91, 0x66, 0x4a, 0x2b, 0x75, 0xa3, 0x04, 0xa6, 0xd5, 0x39,
0x3d, 0x25, 0xfd, 0x40, 0x6d, 0xb5, 0x9c, 0x44, 0xeb, 0x01, 0x93, 0xf1, 0xb5, 0x30, 0xad, 0x4e,
0x94, 0x80, 0x30, 0x5c, 0xea, 0x3a, 0xd8, 0x0c, 0x94, 0xea, 0x46, 0x67, 0x60, 0x9f, 0x55, 0x57,
0xb9, 0xea, 0xad, 0x39, 0x13, 0x76, 0xb0, 0xe9, 0x2b, 0xda, 0x65, 0x62, 0xcd, 0x94, 0xb6, 0xd6,
0x1d, 0x25, 0x22, 0x13, 0xd6, 0xb1, 0xeb, 0x76, 0x87, 0xa3, 0x63, 0x54, 0xf8, 0x18, 0x1f, 0xcc,
0x1e, 0x63, 0x87, 0x49, 0x8e, 0x0e, 0x82, 0xf0, 0x18, 0xb5, 0x91, 0x87, 0xa5, 0x73, 0xdc, 0x1d,
0x10, 0xf5, 0x6d, 0x58, 0x8e, 0xb8, 0x0f, 0x54, 0x85, 0x7c, 0x8f, 0x78, 0x1e, 0x6e, 0x93, 0xaa,
0x72, 0x55, 0xb9, 0x51, 0xd4, 0xfc, 0xae, 0x5a, 0x86, 0x95, 0xa8, 0xb3, 0x50, 0x7b, 0x81, 0x20,
0x73, 0x00, 0x4c, 0xf0, 0x9c, 0xf4, 0x3d, 0x76, 0xeb, 0xa5, 0xa0, 0xec, 0xa2, 0x6b, 0x50, 0xe2,
0x47, 0x4c, 0xf7, 0xbf, 0x33, 0x67, 0x96, 0xd5, 0x56, 0x38, 0xf1, 0xb1, 0x64, 0xda, 0x84, 0x65,
0x77, 0xdb, 0x0d, 0x58, 0x32, 0x9c, 0x05, 0xdc, 0x6d, 0x57, 0x32, 0xa8, 0xdf, 0x83, 0xca, 0xa8,
0xbf, 0x40, 0x15, 0xc8, 0x9c, 0x91, 0xa1, 0x1c, 0x8f, 0x35, 0xd1, 0xba, 0x5c, 0x16, 0x1f, 0xa3,
0xa8, 0xc9, 0x35, 0xfe, 0x31, 0x1d, 0x08, 0x07, 0x2e, 0x82, 0xf9, 0x38, 0xe6, 0x8f, 0xb9, 0xf4,
0xf2, 0x76, 0xad, 0x2e, 0x9c, 0x75, 0xdd, 0x77, 0xd6, 0xf5, 0x63, 0xdf, 0x59, 0x37, 0x0a, 0x5f,
0x7f, 0xbb, 0x99, 0x7a, 0xf6, 0xb7, 0x4d, 0x45, 0xe3, 0x12, 0xe8, 0x35, 0x76, 0x8b, 0xb1, 0x65,
0xeb, 0x96, 0x29, 0xc7, 0xc9, 0xf3, 0xfe, 0xbe, 0x89, 0x1e, 0x41, 0xc5, 0x70, 0x6c, 0x8f, 0xd8,
0xde, 0xc0, 0xd3, 0x45, 0x30, 0x90, 0x0e, 0x78, 0xda, 0xcd, 0xda, 0xf5, 0xd9, 0x0f, 0x39, 0xb7,
0xb6, 0x6a, 0xc4, 0x09, 0xe8, 0x01, 0xc0, 0x39, 0xee, 0x5a, 0x26, 0xa6, 0x4e, 0xdf, 0xab, 0x66,
0xaf, 0x66, 0x66, 0x28, 0x7b, 0xec, 0x33, 0x9e, 0xb8, 0x26, 0xa6, 0xa4, 0x91, 0x65, 0x33, 0xd7,
0x22, 0xf2, 0xe8, 0x2d, 0x58, 0xc5, 0xae, 0xab, 0x7b, 0x14, 0x53, 0xa2, 0xb7, 0x86, 0x94, 0x78,
0xdc, 0x49, 0xaf, 0x68, 0x25, 0xec, 0xba, 0x47, 0x8c, 0xda, 0x60, 0x44, 0xd5, 0x0c, 0x76, 0x9b,
0xfb, 0x43, 0x84, 0x20, 0x6b, 0x62, 0x8a, 0xb9, 0xb5, 0x56, 0x34, 0xde, 0x66, 0x34, 0x17, 0xd3,
0x8e, 0xb4, 0x01, 0x6f, 0xa3, 0xcb, 0x90, 0xeb, 0x10, 0xab, 0xdd, 0xa1, 0x7c, 0xd9, 0x19, 0x4d,
0xf6, 0xd8, 0xc6, 0xb8, 0x7d, 0xe7, 0x9c, 0xf0, 0x90, 0x52, 0xd0, 0x44, 0x47, 0x7d, 0x96, 0x86,
0xb5, 0x31, 0x9f, 0xc9, 0xf4, 0x76, 0xb0, 0xd7, 0xf1, 0xc7, 0x62, 0x6d, 0xf4, 0x31, 0xd3, 0x8b,
0x4d, 0xd2, 0x97, 0xa1, 0xb0, 0x1a, 0xb5, 0x80, 0x58, 0x7c, 0x93, 0x7f, 0x97, 0x6b, 0x96, 0xdc,
0xe8, 0x04, 0x2a, 0x5d, 0xec, 0x51, 0x5d, 0xf8, 0x1a, 0x9d, 0x47, 0xb5, 0xcc, 0x4c, 0xcf, 0xfb,
0x00, 0xfb, 0x3e, 0x8a, 0x9d, 0x6b, 0xa9, 0xae, 0xdc, 0x8d, 0x51, 0xd1, 0x13, 0x58, 0x6f, 0x0d,
0x7f, 0x81, 0x6d, 0x6a, 0xd9, 0x44, 0x1f, 0xdb, 0x9e, 0xcd, 0x29, 0xaa, 0xf7, 0xce, 0x2d, 0x93,
0xd8, 0x86, 0xbf, 0x2f, 0x97, 0x02, 0x15, 0xc1, 0xbe, 0x79, 0xea, 0x13, 0x28, 0xc7, 0x7d, 0x3f,
0x2a, 0x43, 0x9a, 0x5e, 0x48, 0x63, 0xa4, 0xe9, 0x05, 0xfa, 0x18, 0xb2, 0x4c, 0x1d, 0x37, 0x44,
0x79, 0x6a, 0x70, 0x96, 0xd2, 0xc7, 0x43, 0x97, 0x68, 0x9c, 0x5f, 0x55, 0x83, 0x4b, 0x10, 0xc4,
0x83, 0x51, 0xdd, 0xea, 0x3b, 0xb0, 0x3a, 0xe2, 0xea, 0x23, 0x3b, 0xaa, 0x44, 0x77, 0x54, 0x5d,
0x85, 0x52, 0xcc, 0xa3, 0xab, 0x97, 0x61, 0x7d, 0x92, 0x6b, 0x56, 0xed, 0x80, 0x1e, 0x73, 0xae,
0xe8, 0x36, 0x14, 0x02, 0xdf, 0x2c, 0x2e, 0xe1, 0x34, 0xbb, 0xf9, 0x22, 0x5a, 0x20, 0xc0, 0xee,
0x20, 0x3b, 0xc7, 0xfc, 0x9c, 0xa4, 0xf9, 0xf4, 0xf3, 0xd8, 0x75, 0x9b, 0xd8, 0xeb, 0xa8, 0x3f,
0x87, 0xea, 0x34, 0x8f, 0x3b, 0xb2, 0x98, 0x6c, 0x70, 0x3c, 0x2f, 0x43, 0xee, 0xd4, 0xe9, 0xf7,
0x30, 0xe5, 0xca, 0x4a, 0x9a, 0xec, 0xb1, 0x63, 0x2b, 0xbc, 0x6f, 0x86, 0x93, 0x45, 0x47, 0xd5,
0xe1, 0xb5, 0xa9, 0xfe, 0x96, 0x89, 0x58, 0xb6, 0x49, 0x84, 0x55, 0x4b, 0x9a, 0xe8, 0x84, 0x8a,
0xc4, 0x64, 0x45, 0x87, 0x0d, 0xeb, 0xf1, 0x15, 0x73, 0xfd, 0x45, 0x4d, 0xf6, 0xd4, 0xbf, 0x14,
0xa1, 0xa0, 0x11, 0xcf, 0x65, 0xae, 0x00, 0x35, 0xa1, 0x48, 0x2e, 0x0c, 0x22, 0x10, 0x95, 0x32,
0x07, 0x7f, 0x08, 0x99, 0x3d, 0x9f, 0x9f, 0x05, 0xfc, 0x40, 0x18, 0xdd, 0x8a, 0xa1, 0xc9, 0x6b,
0xf3, 0x94, 0x44, 0xe1, 0xe4, 0x9d, 0x38, 0x9c, 0x7c, 0x73, 0x8e, 0xec, 0x08, 0x9e, 0xbc, 0x15,
0xc3, 0x93, 0xf3, 0x06, 0x8e, 0x01, 0xca, 0xfd, 0x09, 0x80, 0x72, 0xde, 0xf2, 0xa7, 0x20, 0xca,
0xfd, 0x09, 0x88, 0xf2, 0xc6, 0xdc, 0xb9, 0x4c, 0x84, 0x94, 0x77, 0xe2, 0x90, 0x72, 0x9e, 0x39,
0x46, 0x30, 0xe5, 0x83, 0x49, 0x98, 0xf2, 0x9d, 0x39, 0x3a, 0xa6, 0x82, 0xca, 0xdd, 0x31, 0x50,
0xf9, 0xd6, 0x1c, 0x55, 0x13, 0x50, 0xe5, 0x7e, 0x0c, 0x55, 0x42, 0x22, 0xdb, 0x4c, 0x81, 0x95,
0xf7, 0xc6, 0x61, 0xe5, 0xdb, 0xf3, 0x8e, 0xda, 0x24, 0x5c, 0xf9, 0xc9, 0x08, 0xae, 0xbc, 0x3e,
0x6f, 0x55, 0xa3, 0xc0, 0xf2, 0x64, 0x0a, 0xb0, 0x7c, 0x7f, 0x8e, 0xa2, 0x39, 0xc8, 0xf2, 0x64,
0x0a, 0xb2, 0x9c, 0xa7, 0x76, 0x0e, 0xb4, 0x6c, 0xcd, 0x82, 0x96, 0x1f, 0xcc, 0x9b, 0x72, 0x32,
0x6c, 0x49, 0x66, 0x62, 0xcb, 0x0f, 0xe7, 0x0c, 0xb2, 0x38, 0xb8, 0x7c, 0x87, 0x85, 0xf7, 0x11,
0x97, 0xc4, 0x5c, 0x21, 0xe9, 0xf7, 0x9d, 0xbe, 0xc4, 0x6d, 0xa2, 0xa3, 0xde, 0x60, 0x80, 0x23,
0x74, 0x3c, 0x33, 0x80, 0x28, 0x0f, 0x3c, 0x11, 0x37, 0xa3, 0xfe, 0x59, 0x09, 0x65, 0x79, 0x74,
0x8e, 0x82, 0x95, 0xa2, 0x04, 0x2b, 0x11, 0x7c, 0x9a, 0x8e, 0xe3, 0xd3, 0x4d, 0x58, 0x66, 0xa1,
0x64, 0x04, 0x7a, 0x62, 0xd7, 0x87, 0x9e, 0xe8, 0x5d, 0x58, 0xe3, 0x18, 0x42, 0xa0, 0x58, 0x19,
0x3f, 0xb2, 0x3c, 0x18, 0xae, 0xb2, 0x0f, 0xe2, 0xe8, 0x8a, 0x40, 0xf2, 0xff, 0x70, 0x29, 0xc2,
0x1b, 0x84, 0x28, 0x81, 0xb1, 0x2a, 0x01, 0xf7, 0x8e, 0x8c, 0x55, 0x9f, 0x86, 0x06, 0x0a, 0x61,
0x2d, 0x82, 0xac, 0xe1, 0x98, 0x44, 0x06, 0x10, 0xde, 0x66, 0x50, 0xb7, 0xeb, 0xb4, 0x65, 0x98,
0x60, 0x4d, 0xc6, 0x15, 0xf8, 0xd4, 0xa2, 0x70, 0x96, 0xea, 0x9f, 0x94, 0x50, 0x5f, 0x88, 0x74,
0x27, 0x81, 0x52, 0xe5, 0x65, 0x82, 0xd2, 0xf4, 0x7f, 0x07, 0x4a, 0xd5, 0x7f, 0x2b, 0xe1, 0x96,
0x06, 0x70, 0xf3, 0xbb, 0x99, 0x20, 0x0c, 0xbf, 0x4b, 0x7c, 0x83, 0x64, 0xf8, 0x95, 0x99, 0x42,
0x8e, 0x6f, 0x43, 0x3c, 0x53, 0xc8, 0x8b, 0x80, 0xcc, 0x3b, 0xe8, 0x13, 0x28, 0xba, 0x7d, 0xc7,
0x39, 0xd5, 0x1d, 0xd7, 0x93, 0x7e, 0x39, 0x06, 0xb0, 0x44, 0x25, 0xa8, 0x2e, 0xaa, 0x49, 0xf5,
0x43, 0xc6, 0x7a, 0xe0, 0x7a, 0x5a, 0xc1, 0x95, 0xad, 0x08, 0xc0, 0x28, 0xc6, 0xf0, 0xef, 0x15,
0x28, 0xb2, 0x45, 0x78, 0x2e, 0x36, 0x08, 0x77, 0xaf, 0x45, 0x2d, 0x24, 0xa8, 0x26, 0xa0, 0x71,
0x37, 0x8f, 0x1e, 0x42, 0x8e, 0x9c, 0x13, 0x9b, 0xb2, 0xdd, 0x62, 0x06, 0xbe, 0x32, 0x15, 0x56,
0x12, 0x9b, 0x36, 0xaa, 0xcc, 0xac, 0xff, 0xfc, 0x76, 0xb3, 0x22, 0x64, 0xde, 0x77, 0x7a, 0x16,
0x25, 0x3d, 0x97, 0x0e, 0x35, 0xa9, 0x45, 0xfd, 0x6d, 0x9a, 0xa1, 0xbb, 0x58, 0x08, 0x98, 0x68,
0x68, 0xff, 0xfa, 0xa4, 0x23, 0x58, 0x3f, 0x99, 0xf1, 0x5f, 0x07, 0x68, 0x63, 0x4f, 0x7f, 0x8a,
0x6d, 0x4a, 0x4c, 0xb9, 0x03, 0xc5, 0x36, 0xf6, 0x7e, 0xc2, 0x09, 0x0c, 0xb4, 0xb1, 0xcf, 0x03,
0x8f, 0x98, 0x7c, 0x2b, 0x32, 0x5a, 0xbe, 0x8d, 0xbd, 0x13, 0x8f, 0x98, 0x91, 0xb5, 0xe6, 0x5f,
0xc6, 0x5a, 0xe3, 0xf6, 0x2e, 0x8c, 0xda, 0xfb, 0x77, 0xe9, 0xf0, 0x9e, 0x84, 0x60, 0xf8, 0x7f,
0xd3, 0x16, 0x7f, 0xe0, 0xc9, 0x71, 0x3c, 0x0e, 0xa3, 0xcf, 0x60, 0x2d, 0xb8, 0x9f, 0xfa, 0x80,
0xdf, 0x5b, 0xff, 0x14, 0x2e, 0x76, 0xcd, 0x2b, 0xe7, 0x71, 0xb2, 0x87, 0x3e, 0x87, 0x57, 0x47,
0xbc, 0x51, 0x30, 0x40, 0x7a, 0x21, 0xa7, 0xf4, 0x4a, 0xdc, 0x29, 0xf9, 0xfa, 0x43, 0xeb, 0x65,
0x5e, 0xca, 0xad, 0xd9, 0x67, 0x09, 0x59, 0x14, 0x61, 0x4c, 0x3c, 0x13, 0xd7, 0xa0, 0xd4, 0x27,
0x14, 0x5b, 0xb6, 0x1e, 0x4b, 0x7f, 0x57, 0x04, 0x51, 0x04, 0x07, 0xf5, 0x31, 0xbc, 0x32, 0x11,
0x63, 0xa0, 0xef, 0x43, 0x31, 0x04, 0x29, 0xca, 0xcc, 0x1c, 0x32, 0xc8, 0x85, 0x42, 0x09, 0xf5,
0x2b, 0x25, 0x54, 0x1c, 0xcf, 0xb1, 0xee, 0x43, 0xae, 0x4f, 0xbc, 0x41, 0x57, 0xe4, 0x3b, 0xe5,
0xed, 0x8f, 0x16, 0xc1, 0x28, 0x8c, 0x3a, 0xe8, 0x52, 0x4d, 0xaa, 0x50, 0x1f, 0x41, 0x4e, 0x50,
0x10, 0x40, 0x6e, 0x67, 0x77, 0x77, 0xef, 0xf0, 0xb8, 0x92, 0x42, 0x45, 0x58, 0xda, 0x69, 0x1c,
0x68, 0xc7, 0x15, 0x85, 0x91, 0xb5, 0xbd, 0x1f, 0xef, 0xed, 0x1e, 0x57, 0xd2, 0x68, 0x0d, 0x4a,
0xa2, 0xad, 0xdf, 0x3b, 0xd0, 0x3e, 0xdd, 0x39, 0xae, 0x64, 0x22, 0xa4, 0xa3, 0xbd, 0x87, 0x77,
0xf7, 0xb4, 0x4a, 0x56, 0xfd, 0x90, 0x65, 0x52, 0x53, 0x20, 0x4c, 0x98, 0x33, 0x29, 0x91, 0x9c,
0x49, 0xfd, 0x7d, 0x1a, 0x6a, 0xd3, 0x11, 0x09, 0x3a, 0x1c, 0x59, 0xf1, 0xcd, 0x85, 0x41, 0xcd,
0xc8, 0xb2, 0xd1, 0x75, 0x28, 0xf7, 0xc9, 0x29, 0xa1, 0x46, 0x47, 0xa0, 0x25, 0x11, 0xef, 0x4a,
0x5a, 0x49, 0x52, 0xb9, 0x90, 0x27, 0xd8, 0xbe, 0x20, 0x06, 0xd5, 0x45, 0x12, 0x27, 0xce, 0x5f,
0x91, 0xb1, 0x31, 0xea, 0x91, 0x20, 0xaa, 0x47, 0xf3, 0x8c, 0x58, 0x84, 0x25, 0x6d, 0xef, 0x58,
0xfb, 0xac, 0x92, 0x46, 0x08, 0xca, 0xbc, 0xa9, 0x1f, 0x3d, 0xdc, 0x39, 0x3c, 0x6a, 0x1e, 0x30,
0x23, 0x5e, 0x82, 0x55, 0xdf, 0x88, 0x3e, 0x31, 0xab, 0xfe, 0x26, 0x0d, 0xab, 0x23, 0xd7, 0x03,
0xdd, 0x84, 0x25, 0x01, 0xc1, 0x95, 0x99, 0x45, 0x7c, 0x7e, 0xdf, 0xe5, 0x8d, 0x12, 0x02, 0xe8,
0x0e, 0x14, 0x88, 0xac, 0x54, 0xc8, 0x2b, 0x79, 0x75, 0xbc, 0xda, 0xe2, 0xd7, 0x32, 0xa4, 0x68, 0x0e, 0x14, 0x88, 0xac, 0x54, 0xc8, 0x2b, 0x79, 0x75, 0xbc, 0xda, 0xe2, 0xd7, 0x32, 0xa4, 0x68,
0x20, 0xc1, 0x42, 0x68, 0x70, 0xe7, 0x65, 0xb6, 0xf8, 0xc6, 0xb8, 0x78, 0xe0, 0x2d, 0xa4, 0x7c, 0x20, 0xc1, 0x42, 0x68, 0x70, 0xe7, 0x65, 0xb6, 0xf8, 0xc6, 0xb8, 0x78, 0xe0, 0x2d, 0xa4, 0x7c,
0x28, 0xa3, 0xee, 0xc2, 0x72, 0x64, 0x52, 0xe8, 0xff, 0xa0, 0xd8, 0xc3, 0x17, 0xb2, 0x56, 0x25,
0x4a, 0x10, 0x85, 0x1e, 0xbe, 0xe0, 0x65, 0x2a, 0xf4, 0x2a, 0xe4, 0xd9, 0xc7, 0x36, 0x16, 0xce,
0x23, 0xa3, 0xe5, 0x7a, 0xf8, 0xe2, 0x47, 0xd8, 0x53, 0x0d, 0x28, 0xc7, 0x0b, 0x39, 0xec, 0x34,
0xf5, 0x9d, 0x81, 0x6d, 0x72, 0x1d, 0x4b, 0x9a, 0xe8, 0xa0, 0xdb, 0xb0, 0x74, 0xee, 0x08, 0xdf,
0x33, 0xeb, 0xd6, 0x3d, 0x76, 0x28, 0x89, 0x94, 0x83, 0x84, 0x8c, 0xfa, 0x10, 0xca, 0xdc, 0x8b,
0xec, 0x50, 0xda, 0xb7, 0x5a, 0x03, 0x4a, 0xa2, 0x15, 0xc9, 0x95, 0x09, 0x15, 0xc9, 0x00, 0x67,
0x04, 0x28, 0x25, 0x23, 0xca, 0x61, 0xbc, 0xa3, 0xfe, 0x4a, 0x81, 0x25, 0xae, 0x90, 0xb9, 0x18,
0x5e, 0xe3, 0x91, 0x08, 0x96, 0xb5, 0x91, 0x01, 0x80, 0xfd, 0x81, 0xfc, 0xf9, 0x5e, 0x9f, 0xe5,
0xdc, 0x82, 0x69, 0x35, 0xae, 0x48, 0x2f, 0xb7, 0x1e, 0x2a, 0x88, 0x78, 0xba, 0x88, 0x5a, 0xf5,
0x99, 0x02, 0x85, 0xe3, 0x0b, 0x79, 0x42, 0xa7, 0x94, 0x7e, 0xd8, 0xec, 0xf7, 0xf9, 0xec, 0x45,
0xb1, 0x44, 0x74, 0x64, 0x2d, 0x29, 0x13, 0xd4, 0xa9, 0xee, 0x05, 0x37, 0x31, 0xbb, 0x58, 0x3a,
0xe9, 0x97, 0xf0, 0xa4, 0xdb, 0xb9, 0x0d, 0xc5, 0xe0, 0xb4, 0x30, 0x18, 0x8f, 0x4d, 0xb3, 0x4f,
0x3c, 0x4f, 0x1a, 0xd9, 0xef, 0xf2, 0x0a, 0xa3, 0xf3, 0x54, 0x96, 0x52, 0x32, 0x9a, 0xe8, 0xa8,
0x16, 0xac, 0x8e, 0x04, 0x26, 0xf4, 0x43, 0xc8, 0xbb, 0x83, 0x96, 0xee, 0xef, 0xd3, 0xc8, 0xf1,
0x94, 0x08, 0xef, 0x8c, 0x0c, 0xbd, 0xfa, 0xe1, 0xa0, 0xd5, 0xb5, 0x8c, 0xfb, 0x64, 0xe8, 0xcf,
0xc8, 0x1d, 0xb4, 0xee, 0x8b, 0x3d, 0x15, 0x43, 0xa5, 0xa3, 0x43, 0xfd, 0x12, 0x0a, 0xfe, 0x31,
0x41, 0x77, 0xa3, 0x97, 0x40, 0x19, 0xbf, 0x43, 0x93, 0xe2, 0xa6, 0x1c, 0x24, 0x14, 0x64, 0x89,
0x87, 0x67, 0xb5, 0x6d, 0x62, 0xea, 0x61, 0x4e, 0xc1, 0xc7, 0x2c, 0x68, 0xab, 0xe2, 0xc3, 0x03,
0x3f, 0xa1, 0x50, 0xff, 0xa1, 0x40, 0xc1, 0xbf, 0x93, 0x13, 0x8f, 0x4f, 0x6c, 0x4a, 0xe9, 0xef,
0x3a, 0xa5, 0x69, 0xf5, 0x5d, 0xbf, 0x9a, 0x9e, 0x5d, 0xb8, 0x9a, 0x7e, 0x13, 0x10, 0x75, 0x28,
0xee, 0xea, 0xe7, 0x0e, 0xb5, 0xec, 0xb6, 0x2e, 0x2c, 0x2b, 0xf0, 0x52, 0x85, 0x7f, 0x79, 0xcc,
0x3f, 0x1c, 0x72, 0x23, 0xff, 0x5a, 0x81, 0x42, 0x10, 0xdd, 0x16, 0xad, 0xe6, 0x5d, 0x86, 0x9c,
0xf4, 0xe0, 0xa2, 0x9c, 0x27, 0x7b, 0x41, 0xc1, 0x39, 0x1b, 0x29, 0x38, 0xd7, 0xa0, 0xd0, 0x23,
0x14, 0xf3, 0x40, 0x2f, 0xb2, 0xb7, 0xa0, 0xff, 0xee, 0x35, 0x58, 0x8e, 0x94, 0x57, 0x51, 0x1e,
0x32, 0x0f, 0xc9, 0xd3, 0x4a, 0x0a, 0x2d, 0x43, 0x5e, 0x23, 0xbc, 0xa2, 0x52, 0x51, 0xb6, 0xbf,
0x5a, 0x86, 0xd5, 0x9d, 0xc6, 0xee, 0x3e, 0x0b, 0x30, 0x96, 0x81, 0x79, 0x66, 0x77, 0x00, 0x59,
0x9e, 0xdc, 0x26, 0x78, 0xc8, 0xad, 0x25, 0x29, 0xcf, 0x21, 0x0d, 0x96, 0x78, 0x0e, 0x8c, 0x92,
0xbc, 0xef, 0xd6, 0x12, 0x55, 0xed, 0xd8, 0x24, 0xf9, 0x19, 0x4e, 0xf0, 0xec, 0x5b, 0x4b, 0x52,
0xca, 0x43, 0x9f, 0x43, 0x31, 0x4c, 0x6e, 0x93, 0x3e, 0x06, 0xd7, 0x12, 0x17, 0xf9, 0x98, 0xfe,
0x10, 0xc4, 0x27, 0x7d, 0x0a, 0xad, 0x25, 0x76, 0x47, 0xe8, 0x09, 0xe4, 0xfd, 0x74, 0x29, 0xd9,
0x73, 0x6d, 0x2d, 0x61, 0x01, 0x8e, 0x6d, 0x9f, 0xc8, 0x77, 0x93, 0xbc, 0x49, 0xd7, 0x12, 0x55,
0x19, 0xd1, 0x09, 0xe4, 0x24, 0x4e, 0x4d, 0xf4, 0x10, 0x5b, 0x4b, 0x56, 0x56, 0x63, 0x46, 0x0e,
0x2b, 0x0a, 0x49, 0xdf, 0xe1, 0x6b, 0x89, 0xcb, 0xab, 0x08, 0x03, 0x44, 0x52, 0xdf, 0xc4, 0x0f,
0xec, 0xb5, 0xe4, 0x65, 0x53, 0xf4, 0x33, 0x28, 0x04, 0x09, 0x4e, 0xc2, 0x87, 0xee, 0x5a, 0xd2,
0xca, 0x25, 0xfa, 0x02, 0x4a, 0x71, 0x4c, 0xbf, 0xc8, 0xf3, 0x75, 0x6d, 0xa1, 0x92, 0x24, 0x1b,
0x2b, 0x0e, 0xf3, 0x17, 0x79, 0xd4, 0xae, 0x2d, 0x54, 0xa7, 0x44, 0xe7, 0xb0, 0x36, 0x8e, 0xcc,
0x17, 0x7d, 0xe9, 0xae, 0x2d, 0x5c, 0xbf, 0x44, 0x43, 0x40, 0x13, 0xd0, 0xfd, 0xc2, 0xcf, 0xdf,
0xb5, 0xc5, 0x8b, 0x9a, 0x8d, 0xbd, 0xaf, 0x9f, 0x6f, 0x28, 0xdf, 0x3c, 0xdf, 0x50, 0xfe, 0xfe,
0x7c, 0x43, 0x79, 0xf6, 0x62, 0x23, 0xf5, 0xcd, 0x8b, 0x8d, 0xd4, 0x5f, 0x5f, 0x6c, 0xa4, 0x7e,
0xfa, 0x5e, 0xdb, 0xa2, 0x9d, 0x41, 0xab, 0x6e, 0x38, 0xbd, 0xad, 0xe8, 0x7f, 0x7f, 0x26, 0xfd,
0x51, 0xa9, 0x95, 0xe3, 0xc1, 0xef, 0xc3, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x99, 0x3b, 0x6a,
0xd0, 0xc8, 0x24, 0x00, 0x00,
0x28, 0x83, 0x6e, 0x85, 0x48, 0x2d, 0x3b, 0x5e, 0x16, 0x90, 0xe2, 0x82, 0x41, 0x0a, 0xfb, 0xfc,
0xea, 0x2e, 0x2c, 0x47, 0xd6, 0x83, 0xfe, 0x0f, 0x8a, 0x3d, 0x7c, 0x21, 0xcb, 0x5c, 0xa2, 0x7a,
0x51, 0xe8, 0xe1, 0x0b, 0x5e, 0xe1, 0x42, 0xaf, 0x42, 0x9e, 0x7d, 0x6c, 0x63, 0xe1, 0x77, 0x32,
0x5a, 0xae, 0x87, 0x2f, 0x7e, 0x84, 0x3d, 0xd5, 0x80, 0x72, 0xbc, 0x06, 0xc4, 0x0e, 0x62, 0xdf,
0x19, 0xd8, 0x26, 0xd7, 0xb1, 0xa4, 0x89, 0x0e, 0xba, 0x0d, 0x4b, 0xe7, 0x8e, 0x70, 0x5b, 0xb3,
0x2e, 0xec, 0x63, 0x87, 0x92, 0x48, 0x25, 0x49, 0xc8, 0xa8, 0x0f, 0xa1, 0xcc, 0x1d, 0xd0, 0x0e,
0xa5, 0x7d, 0xab, 0x35, 0xa0, 0x24, 0x5a, 0xcc, 0x5c, 0x99, 0x50, 0xcc, 0x0c, 0x20, 0x4a, 0x00,
0x70, 0x32, 0xa2, 0x92, 0xc6, 0x3b, 0xea, 0xaf, 0x14, 0x58, 0xe2, 0x0a, 0x99, 0x77, 0xe2, 0xe5,
0x21, 0x09, 0x7e, 0x59, 0x1b, 0x19, 0x00, 0xd8, 0x1f, 0xc8, 0x9f, 0xef, 0xf5, 0x59, 0x7e, 0x31,
0x98, 0x56, 0xe3, 0x8a, 0x74, 0x90, 0xeb, 0xa1, 0x82, 0x88, 0x93, 0x8c, 0xa8, 0x55, 0x9f, 0x29,
0x50, 0x38, 0xbe, 0x90, 0x87, 0x7b, 0x4a, 0xd5, 0x88, 0xcd, 0x7e, 0x9f, 0xcf, 0x5e, 0xd4, 0x59,
0x44, 0x47, 0x96, 0xa1, 0x32, 0x41, 0x89, 0xeb, 0x5e, 0x70, 0x89, 0xb3, 0x8b, 0x65, 0xa2, 0x7e,
0xf5, 0x4f, 0x7a, 0xac, 0xdb, 0x50, 0x0c, 0x0e, 0x1a, 0xcb, 0x00, 0xb0, 0x69, 0xf6, 0x89, 0xe7,
0x49, 0x23, 0xfb, 0x5d, 0x5e, 0x9c, 0x74, 0x9e, 0xca, 0x2a, 0x4c, 0x46, 0x13, 0x1d, 0xd5, 0x82,
0xd5, 0x91, 0x98, 0x86, 0x7e, 0x08, 0x79, 0x77, 0xd0, 0xd2, 0xfd, 0x7d, 0x1a, 0x39, 0xd9, 0x12,
0x1c, 0x9e, 0x91, 0xa1, 0x57, 0x3f, 0x1c, 0xb4, 0xba, 0x96, 0x71, 0x9f, 0x0c, 0xfd, 0x19, 0xb9,
0x83, 0xd6, 0x7d, 0xb1, 0xa7, 0x62, 0xa8, 0x74, 0x74, 0xa8, 0x5f, 0x42, 0xc1, 0x3f, 0x26, 0xe8,
0x6e, 0xf4, 0xfe, 0x28, 0xe3, 0xd7, 0x6f, 0x52, 0xc8, 0x95, 0x83, 0x44, 0x2e, 0xd1, 0xbb, 0xb0,
0xe6, 0x59, 0x6d, 0x9b, 0x98, 0x7a, 0x98, 0x8e, 0xf0, 0x31, 0x0b, 0xda, 0xaa, 0xf8, 0xf0, 0xc0,
0xcf, 0x45, 0xd4, 0x7f, 0x28, 0x50, 0xf0, 0xaf, 0xf3, 0xc4, 0xe3, 0x13, 0x9b, 0x52, 0xfa, 0xbb,
0x4e, 0x69, 0x5a, 0x69, 0xd8, 0x2f, 0xc4, 0x67, 0x17, 0x2e, 0xc4, 0xbf, 0x0f, 0x88, 0x3a, 0x14,
0x77, 0xf5, 0x73, 0x87, 0x5a, 0x76, 0x5b, 0x17, 0x96, 0x15, 0x50, 0xab, 0xc2, 0xbf, 0x3c, 0xe6,
0x1f, 0x0e, 0xb9, 0x91, 0x7f, 0xad, 0x40, 0x21, 0x08, 0x8c, 0x8b, 0x16, 0x02, 0x2f, 0x43, 0x4e,
0x3a, 0x7f, 0x51, 0x09, 0x94, 0xbd, 0xa0, 0x56, 0x9d, 0x8d, 0xd4, 0xaa, 0x6b, 0x50, 0xe8, 0x11,
0x8a, 0x39, 0x46, 0x10, 0x89, 0x5f, 0xd0, 0x7f, 0xf7, 0x1a, 0x2c, 0x47, 0x2a, 0xb3, 0x28, 0x0f,
0x99, 0x87, 0xe4, 0x69, 0x25, 0x85, 0x96, 0x21, 0xaf, 0x11, 0x5e, 0x8c, 0xa9, 0x28, 0xdb, 0x5f,
0x2d, 0xc3, 0xea, 0x4e, 0x63, 0x77, 0x9f, 0xc5, 0x26, 0xcb, 0xc0, 0x3c, 0x29, 0x3c, 0x80, 0x2c,
0xcf, 0x8b, 0x13, 0xbc, 0x01, 0xd7, 0x92, 0x54, 0xf6, 0x90, 0x06, 0x4b, 0x3c, 0x7d, 0x46, 0x49,
0x9e, 0x86, 0x6b, 0x89, 0x0a, 0x7e, 0x6c, 0x92, 0xfc, 0x0c, 0x27, 0x78, 0x31, 0xae, 0x25, 0xa9,
0x02, 0xa2, 0xcf, 0xa1, 0x18, 0xe6, 0xc5, 0x49, 0xdf, 0x91, 0x6b, 0x89, 0xeb, 0x83, 0x4c, 0x7f,
0x88, 0xff, 0x93, 0xbe, 0xa2, 0xd6, 0x12, 0xbb, 0x23, 0xf4, 0x04, 0xf2, 0x7e, 0xa6, 0x95, 0xec,
0xa5, 0xb7, 0x96, 0xb0, 0x76, 0xc7, 0xb6, 0x4f, 0xa4, 0xca, 0x49, 0x9e, 0xb3, 0x6b, 0x89, 0x0a,
0x94, 0xe8, 0x04, 0x72, 0x12, 0xe2, 0x26, 0x7a, 0xc3, 0xad, 0x25, 0xab, 0xc8, 0x31, 0x23, 0x87,
0xc5, 0x88, 0xa4, 0x4f, 0xf8, 0xb5, 0xc4, 0x95, 0x59, 0x84, 0x01, 0x22, 0x59, 0x73, 0xe2, 0xb7,
0xf9, 0x5a, 0xf2, 0x8a, 0x2b, 0xfa, 0x19, 0x14, 0x82, 0xdc, 0x28, 0xe1, 0x1b, 0x79, 0x2d, 0x69,
0xd1, 0x13, 0x7d, 0x01, 0xa5, 0x78, 0x3a, 0xb0, 0xc8, 0xcb, 0x77, 0x6d, 0xa1, 0x6a, 0x26, 0x1b,
0x2b, 0x9e, 0x21, 0x2c, 0xf2, 0x1e, 0x5e, 0x5b, 0xa8, 0xc4, 0x89, 0xce, 0x61, 0x6d, 0x1c, 0xd4,
0x2f, 0xfa, 0x48, 0x5e, 0x5b, 0xb8, 0xf4, 0x89, 0x86, 0x80, 0x26, 0x24, 0x06, 0x0b, 0xbf, 0x9c,
0xd7, 0x16, 0xaf, 0x87, 0x36, 0xf6, 0xbe, 0x7e, 0xbe, 0xa1, 0x7c, 0xf3, 0x7c, 0x43, 0xf9, 0xfb,
0xf3, 0x0d, 0xe5, 0xd9, 0x8b, 0x8d, 0xd4, 0x37, 0x2f, 0x36, 0x52, 0x7f, 0x7d, 0xb1, 0x91, 0xfa,
0xe9, 0x7b, 0x6d, 0x8b, 0x76, 0x06, 0xad, 0xba, 0xe1, 0xf4, 0xb6, 0xa2, 0x7f, 0x1b, 0x9a, 0xf4,
0x1f, 0xa7, 0x56, 0x8e, 0x07, 0xbf, 0x8f, 0xfe, 0x13, 0x00, 0x00, 0xff, 0xff, 0x61, 0x0b, 0xa4,
0x73, 0x03, 0x25, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -5962,6 +5971,18 @@ func (m *ConsensusParams) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i _ = i
var l int var l int
_ = l _ = l
if m.Version != nil {
{
size, err := m.Version.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintTypes(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x22
}
if m.Validator != nil { if m.Validator != nil {
{ {
size, err := m.Validator.MarshalToSizedBuffer(dAtA[:i]) size, err := m.Validator.MarshalToSizedBuffer(dAtA[:i])
@ -6358,12 +6379,12 @@ func (m *Evidence) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i-- i--
dAtA[i] = 0x28 dAtA[i] = 0x28
} }
n48, err48 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
if err48 != nil {
return 0, err48
n49, err49 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
if err49 != nil {
return 0, err49
} }
i -= n48
i = encodeVarintTypes(dAtA, i, uint64(n48))
i -= n49
i = encodeVarintTypes(dAtA, i, uint64(n49))
i-- i--
dAtA[i] = 0x22 dAtA[i] = 0x22
if m.Height != 0 { if m.Height != 0 {
@ -7459,6 +7480,10 @@ func (m *ConsensusParams) Size() (n int) {
l = m.Validator.Size() l = m.Validator.Size()
n += 1 + l + sovTypes(uint64(l)) n += 1 + l + sovTypes(uint64(l))
} }
if m.Version != nil {
l = m.Version.Size()
n += 1 + l + sovTypes(uint64(l))
}
return n return n
} }
@ -12974,6 +12999,42 @@ func (m *ConsensusParams) Unmarshal(dAtA []byte) error {
return err return err
} }
iNdEx = postIndex iNdEx = postIndex
case 4:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowTypes
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthTypes
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthTypes
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.Version == nil {
m.Version = &types1.VersionParams{}
}
if err := m.Version.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipTypes(dAtA[iNdEx:]) skippy, err := skipTypes(dAtA[iNdEx:])


+ 3
- 3
consensus/replay.go View File

@ -253,10 +253,9 @@ func (h *Handshaker) Handshake(proxyApp proxy.AppConns) error {
"protocol-version", res.AppVersion, "protocol-version", res.AppVersion,
) )
// Set AppVersion on the state.
if h.initialState.Version.Consensus.App != res.AppVersion {
// Only set the version if we're starting from zero.
if h.initialState.LastBlockHeight == 0 {
h.initialState.Version.Consensus.App = res.AppVersion h.initialState.Version.Consensus.App = res.AppVersion
sm.SaveState(h.stateDB, h.initialState)
} }
// Replay blocks up to the latest in the blockstore. // Replay blocks up to the latest in the blockstore.
@ -331,6 +330,7 @@ func (h *Handshaker) ReplayBlocks(
if res.ConsensusParams != nil { if res.ConsensusParams != nil {
state.ConsensusParams = types.UpdateConsensusParams(state.ConsensusParams, res.ConsensusParams) state.ConsensusParams = types.UpdateConsensusParams(state.ConsensusParams, res.ConsensusParams)
state.Version.Consensus.App = state.ConsensusParams.Version.AppVersion
} }
sm.SaveState(h.stateDB, state) sm.SaveState(h.stateDB, state)
} }


+ 1
- 0
proto/tendermint/abci/types/types.proto View File

@ -281,6 +281,7 @@ message ConsensusParams {
BlockParams block = 1; BlockParams block = 1;
tendermint.types.EvidenceParams evidence = 2; tendermint.types.EvidenceParams evidence = 2;
tendermint.types.ValidatorParams validator = 3; tendermint.types.ValidatorParams validator = 3;
tendermint.types.VersionParams version = 4;
} }
// BlockParams contains limits on the block size. // BlockParams contains limits on the block size.


+ 1
- 3
proto/tendermint/consensus/walmsgs.pb.go View File

@ -369,9 +369,7 @@ func init() {
proto.RegisterType((*TimedWALMessage)(nil), "tendermint.consensus.TimedWALMessage") proto.RegisterType((*TimedWALMessage)(nil), "tendermint.consensus.TimedWALMessage")
} }
func init() {
proto.RegisterFile("tendermint/consensus/walmsgs.proto", fileDescriptor_ba295fe8d98f7e98)
}
func init() { proto.RegisterFile("tendermint/consensus/walmsgs.proto", fileDescriptor_ba295fe8d98f7e98) }
var fileDescriptor_ba295fe8d98f7e98 = []byte{ var fileDescriptor_ba295fe8d98f7e98 = []byte{
// 542 bytes of a gzipped FileDescriptorProto // 542 bytes of a gzipped FileDescriptorProto


+ 1
- 3
proto/tendermint/crypto/keys/types.pb.go View File

@ -178,9 +178,7 @@ func init() {
proto.RegisterType((*PrivateKey)(nil), "tendermint.crypto.keys.PrivateKey") proto.RegisterType((*PrivateKey)(nil), "tendermint.crypto.keys.PrivateKey")
} }
func init() {
proto.RegisterFile("tendermint/crypto/keys/types.proto", fileDescriptor_6e4a90a3275dcf41)
}
func init() { proto.RegisterFile("tendermint/crypto/keys/types.proto", fileDescriptor_6e4a90a3275dcf41) }
var fileDescriptor_6e4a90a3275dcf41 = []byte{ var fileDescriptor_6e4a90a3275dcf41 = []byte{
// 205 bytes of a gzipped FileDescriptorProto // 205 bytes of a gzipped FileDescriptorProto


+ 289
- 40
proto/tendermint/types/params.pb.go View File

@ -33,6 +33,7 @@ type ConsensusParams struct {
Block BlockParams `protobuf:"bytes,1,opt,name=block,proto3" json:"block"` Block BlockParams `protobuf:"bytes,1,opt,name=block,proto3" json:"block"`
Evidence EvidenceParams `protobuf:"bytes,2,opt,name=evidence,proto3" json:"evidence"` Evidence EvidenceParams `protobuf:"bytes,2,opt,name=evidence,proto3" json:"evidence"`
Validator ValidatorParams `protobuf:"bytes,3,opt,name=validator,proto3" json:"validator"` Validator ValidatorParams `protobuf:"bytes,3,opt,name=validator,proto3" json:"validator"`
Version VersionParams `protobuf:"bytes,4,opt,name=version,proto3" json:"version"`
} }
func (m *ConsensusParams) Reset() { *m = ConsensusParams{} } func (m *ConsensusParams) Reset() { *m = ConsensusParams{} }
@ -89,6 +90,13 @@ func (m *ConsensusParams) GetValidator() ValidatorParams {
return ValidatorParams{} return ValidatorParams{}
} }
func (m *ConsensusParams) GetVersion() VersionParams {
if m != nil {
return m.Version
}
return VersionParams{}
}
// BlockParams contains limits on the block size. // BlockParams contains limits on the block size.
type BlockParams struct { type BlockParams struct {
// Note: must be greater than 0 // Note: must be greater than 0
@ -285,6 +293,51 @@ func (m *ValidatorParams) GetPubKeyTypes() []string {
return nil return nil
} }
// VersionParams contains the ABCI application version.
type VersionParams struct {
AppVersion uint64 `protobuf:"varint,1,opt,name=app_version,json=appVersion,proto3" json:"app_version,omitempty"`
}
func (m *VersionParams) Reset() { *m = VersionParams{} }
func (m *VersionParams) String() string { return proto.CompactTextString(m) }
func (*VersionParams) ProtoMessage() {}
func (*VersionParams) Descriptor() ([]byte, []int) {
return fileDescriptor_e12598271a686f57, []int{4}
}
func (m *VersionParams) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *VersionParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_VersionParams.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *VersionParams) XXX_Merge(src proto.Message) {
xxx_messageInfo_VersionParams.Merge(m, src)
}
func (m *VersionParams) XXX_Size() int {
return m.Size()
}
func (m *VersionParams) XXX_DiscardUnknown() {
xxx_messageInfo_VersionParams.DiscardUnknown(m)
}
var xxx_messageInfo_VersionParams proto.InternalMessageInfo
func (m *VersionParams) GetAppVersion() uint64 {
if m != nil {
return m.AppVersion
}
return 0
}
// HashedParams is a subset of ConsensusParams. // HashedParams is a subset of ConsensusParams.
// It is amino encoded and hashed into // It is amino encoded and hashed into
// the Header.ConsensusHash. // the Header.ConsensusHash.
@ -297,7 +350,7 @@ func (m *HashedParams) Reset() { *m = HashedParams{} }
func (m *HashedParams) String() string { return proto.CompactTextString(m) } func (m *HashedParams) String() string { return proto.CompactTextString(m) }
func (*HashedParams) ProtoMessage() {} func (*HashedParams) ProtoMessage() {}
func (*HashedParams) Descriptor() ([]byte, []int) { func (*HashedParams) Descriptor() ([]byte, []int) {
return fileDescriptor_e12598271a686f57, []int{4}
return fileDescriptor_e12598271a686f57, []int{5}
} }
func (m *HashedParams) XXX_Unmarshal(b []byte) error { func (m *HashedParams) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b) return m.Unmarshal(b)
@ -345,46 +398,50 @@ func init() {
proto.RegisterType((*BlockParams)(nil), "tendermint.types.BlockParams") proto.RegisterType((*BlockParams)(nil), "tendermint.types.BlockParams")
proto.RegisterType((*EvidenceParams)(nil), "tendermint.types.EvidenceParams") proto.RegisterType((*EvidenceParams)(nil), "tendermint.types.EvidenceParams")
proto.RegisterType((*ValidatorParams)(nil), "tendermint.types.ValidatorParams") proto.RegisterType((*ValidatorParams)(nil), "tendermint.types.ValidatorParams")
proto.RegisterType((*VersionParams)(nil), "tendermint.types.VersionParams")
proto.RegisterType((*HashedParams)(nil), "tendermint.types.HashedParams") proto.RegisterType((*HashedParams)(nil), "tendermint.types.HashedParams")
} }
func init() { proto.RegisterFile("tendermint/types/params.proto", fileDescriptor_e12598271a686f57) } func init() { proto.RegisterFile("tendermint/types/params.proto", fileDescriptor_e12598271a686f57) }
var fileDescriptor_e12598271a686f57 = []byte{ var fileDescriptor_e12598271a686f57 = []byte{
// 528 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x53, 0x41, 0x6f, 0xd3, 0x30,
0x14, 0xae, 0xe9, 0x18, 0x9d, 0xbb, 0xae, 0x95, 0x85, 0x44, 0x18, 0x5a, 0x5a, 0x72, 0x40, 0x93,
0x40, 0x89, 0x04, 0x07, 0x04, 0x17, 0x44, 0x60, 0x1a, 0x08, 0x75, 0x9a, 0xa2, 0xc1, 0x61, 0x17,
0xcb, 0x69, 0xbc, 0x2c, 0x5a, 0x1d, 0x47, 0xb1, 0x3d, 0xb5, 0xff, 0x82, 0x23, 0xc7, 0x1d, 0xf9,
0x09, 0xfc, 0x84, 0x1d, 0x27, 0x71, 0x80, 0x13, 0xa0, 0xf6, 0xc2, 0xcf, 0x40, 0x79, 0x69, 0xc8,
0xda, 0xdd, 0xec, 0xf7, 0x7d, 0xef, 0xf3, 0xf7, 0xde, 0x27, 0xe3, 0x1d, 0xcd, 0xd3, 0x88, 0xe7,
0x22, 0x49, 0xb5, 0xa7, 0xa7, 0x19, 0x57, 0x5e, 0xc6, 0x72, 0x26, 0x94, 0x9b, 0xe5, 0x52, 0x4b,
0xd2, 0xab, 0x61, 0x17, 0xe0, 0xed, 0xbb, 0xb1, 0x8c, 0x25, 0x80, 0x5e, 0x71, 0x2a, 0x79, 0xdb,
0x76, 0x2c, 0x65, 0x3c, 0xe6, 0x1e, 0xdc, 0x42, 0x73, 0xe2, 0x45, 0x26, 0x67, 0x3a, 0x91, 0x69,
0x89, 0x3b, 0x3f, 0x10, 0xee, 0xbe, 0x91, 0xa9, 0xe2, 0xa9, 0x32, 0xea, 0x10, 0x5e, 0x20, 0x2f,
0xf0, 0xed, 0x70, 0x2c, 0x47, 0x67, 0x16, 0x1a, 0xa0, 0xdd, 0xf6, 0xd3, 0x1d, 0x77, 0xf5, 0x2d,
0xd7, 0x2f, 0xe0, 0x92, 0xed, 0xaf, 0x5d, 0xfe, 0xea, 0x37, 0x82, 0xb2, 0x83, 0xf8, 0xb8, 0xc5,
0xcf, 0x93, 0x88, 0xa7, 0x23, 0x6e, 0xdd, 0x82, 0xee, 0xc1, 0xcd, 0xee, 0xbd, 0x05, 0x63, 0x49,
0xe0, 0x7f, 0x1f, 0xd9, 0xc3, 0x1b, 0xe7, 0x6c, 0x9c, 0x44, 0x4c, 0xcb, 0xdc, 0x6a, 0x82, 0xc8,
0xc3, 0x9b, 0x22, 0x9f, 0x2a, 0xca, 0x92, 0x4a, 0xdd, 0xe9, 0x70, 0xdc, 0xbe, 0x66, 0x93, 0x3c,
0xc0, 0x1b, 0x82, 0x4d, 0x68, 0x38, 0xd5, 0x5c, 0xc1, 0x60, 0xcd, 0xa0, 0x25, 0xd8, 0xc4, 0x2f,
0xee, 0xe4, 0x1e, 0xbe, 0x53, 0x80, 0x31, 0x53, 0xe0, 0xba, 0x19, 0xac, 0x0b, 0x36, 0xd9, 0x67,
0x8a, 0x0c, 0xf0, 0xa6, 0x4e, 0x04, 0xa7, 0x89, 0xd4, 0x8c, 0x0a, 0x05, 0x76, 0x9a, 0x01, 0x2e,
0x6a, 0xef, 0xa5, 0x66, 0x43, 0xe5, 0x7c, 0x47, 0x78, 0x6b, 0x79, 0x20, 0xf2, 0x18, 0x93, 0x42,
0x8d, 0xc5, 0x9c, 0xa6, 0x46, 0x50, 0xd8, 0x4c, 0xf5, 0x66, 0x57, 0xb0, 0xc9, 0xeb, 0x98, 0x1f,
0x18, 0x01, 0xe6, 0x14, 0x19, 0xe2, 0x5e, 0x45, 0xae, 0xa2, 0x59, 0x6c, 0xee, 0xbe, 0x5b, 0x66,
0xe7, 0x56, 0xd9, 0xb9, 0x6f, 0x17, 0x04, 0xbf, 0x55, 0x0c, 0xfb, 0xe5, 0x77, 0x1f, 0x05, 0x5b,
0xa5, 0x5e, 0x85, 0x54, 0x93, 0xa4, 0x46, 0x80, 0xd7, 0x0e, 0x4c, 0x72, 0x60, 0x04, 0x79, 0x82,
0x49, 0x96, 0x4b, 0x79, 0x42, 0x75, 0x9e, 0xb0, 0x31, 0xcd, 0x78, 0x9e, 0xc8, 0xc8, 0x5a, 0x03,
0x53, 0x3d, 0x40, 0x8e, 0x0a, 0xe0, 0x10, 0xea, 0xce, 0x2b, 0xdc, 0x5d, 0x59, 0x30, 0x71, 0x70,
0x27, 0x33, 0x21, 0x3d, 0xe3, 0x53, 0x0a, 0x09, 0x58, 0x68, 0xd0, 0xdc, 0xdd, 0x08, 0xda, 0x99,
0x09, 0x3f, 0xf0, 0xe9, 0x51, 0x51, 0x7a, 0xd9, 0xfa, 0x76, 0xd1, 0x47, 0x7f, 0x2f, 0xfa, 0xc8,
0x39, 0xc6, 0x9b, 0xef, 0x98, 0x3a, 0xe5, 0xd1, 0xa2, 0xfb, 0x11, 0xee, 0xc2, 0x1e, 0xe8, 0x6a,
0x08, 0x1d, 0x28, 0x0f, 0xab, 0x24, 0x1c, 0xdc, 0xa9, 0x79, 0x75, 0x1e, 0xed, 0x8a, 0xb5, 0xcf,
0x94, 0xff, 0xf1, 0xeb, 0xcc, 0x46, 0x97, 0x33, 0x1b, 0x5d, 0xcd, 0x6c, 0xf4, 0x67, 0x66, 0xa3,
0xcf, 0x73, 0xbb, 0x71, 0x35, 0xb7, 0x1b, 0x3f, 0xe7, 0x76, 0xe3, 0xf8, 0x79, 0x9c, 0xe8, 0x53,
0x13, 0xba, 0x23, 0x29, 0xbc, 0xeb, 0x7f, 0xa8, 0x3e, 0x96, 0x9f, 0x64, 0xf5, 0x7f, 0x85, 0xeb,
0x50, 0x7f, 0xf6, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x47, 0xb8, 0x4b, 0xd4, 0x7a, 0x03, 0x00, 0x00,
// 572 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x53, 0xcd, 0x6e, 0xd3, 0x4c,
0x14, 0x8d, 0xeb, 0x7e, 0x6d, 0x7a, 0xd3, 0x34, 0xd1, 0xe8, 0x93, 0x08, 0x45, 0xb5, 0x83, 0x17,
0xa8, 0x12, 0xc8, 0x96, 0x60, 0x81, 0xe8, 0xa6, 0xc2, 0x50, 0x15, 0x84, 0x52, 0x55, 0x56, 0x61,
0xd1, 0x8d, 0x35, 0x8e, 0xa7, 0xae, 0xd5, 0x8c, 0x67, 0xe4, 0x19, 0x47, 0xc9, 0x5b, 0xb0, 0xec,
0xb2, 0x4b, 0x1e, 0x81, 0x47, 0xe8, 0xb2, 0x12, 0x1b, 0x56, 0x80, 0x92, 0x0d, 0x8f, 0x81, 0x3c,
0xce, 0x90, 0x9f, 0xb2, 0xb3, 0xef, 0xf9, 0x99, 0xb9, 0xe7, 0x68, 0x60, 0x4f, 0x92, 0x2c, 0x26,
0x39, 0x4d, 0x33, 0xe9, 0xc9, 0x31, 0x27, 0xc2, 0xe3, 0x38, 0xc7, 0x54, 0xb8, 0x3c, 0x67, 0x92,
0xa1, 0xf6, 0x1c, 0x76, 0x15, 0xbc, 0xfb, 0x7f, 0xc2, 0x12, 0xa6, 0x40, 0xaf, 0xfc, 0xaa, 0x78,
0xbb, 0x56, 0xc2, 0x58, 0x32, 0x20, 0x9e, 0xfa, 0x8b, 0x8a, 0x0b, 0x2f, 0x2e, 0x72, 0x2c, 0x53,
0x96, 0x55, 0xb8, 0x73, 0xbd, 0x06, 0xad, 0x37, 0x2c, 0x13, 0x24, 0x13, 0x85, 0x38, 0x55, 0x27,
0xa0, 0x57, 0xf0, 0x5f, 0x34, 0x60, 0xfd, 0xab, 0x8e, 0xd1, 0x35, 0xf6, 0x1b, 0xcf, 0xf7, 0xdc,
0xd5, 0xb3, 0x5c, 0xbf, 0x84, 0x2b, 0xb6, 0xbf, 0x7e, 0xfb, 0xc3, 0xae, 0x05, 0x95, 0x02, 0xf9,
0x50, 0x27, 0xc3, 0x34, 0x26, 0x59, 0x9f, 0x74, 0xd6, 0x94, 0xba, 0x7b, 0x5f, 0x7d, 0x34, 0x63,
0x2c, 0x19, 0xfc, 0xd5, 0xa1, 0x23, 0xd8, 0x1a, 0xe2, 0x41, 0x1a, 0x63, 0xc9, 0xf2, 0x8e, 0xa9,
0x4c, 0x1e, 0xdf, 0x37, 0xf9, 0xa4, 0x29, 0x4b, 0x2e, 0x73, 0x25, 0x3a, 0x84, 0xcd, 0x21, 0xc9,
0x45, 0xca, 0xb2, 0xce, 0xba, 0x32, 0xb1, 0xff, 0x61, 0x52, 0x11, 0x96, 0x2c, 0xb4, 0xca, 0x21,
0xd0, 0x58, 0xd8, 0x13, 0x3d, 0x82, 0x2d, 0x8a, 0x47, 0x61, 0x34, 0x96, 0x44, 0xa8, 0x64, 0xcc,
0xa0, 0x4e, 0xf1, 0xc8, 0x2f, 0xff, 0xd1, 0x03, 0xd8, 0x2c, 0xc1, 0x04, 0x0b, 0xb5, 0xb6, 0x19,
0x6c, 0x50, 0x3c, 0x3a, 0xc6, 0x02, 0x75, 0x61, 0x5b, 0xa6, 0x94, 0x84, 0x29, 0x93, 0x38, 0xa4,
0x42, 0xed, 0x63, 0x06, 0x50, 0xce, 0xde, 0x33, 0x89, 0x7b, 0xc2, 0xf9, 0x66, 0xc0, 0xce, 0x72,
0x22, 0xe8, 0x29, 0xa0, 0xd2, 0x0d, 0x27, 0x24, 0xcc, 0x0a, 0x1a, 0xaa, 0x68, 0xf5, 0x99, 0x2d,
0x8a, 0x47, 0xaf, 0x13, 0x72, 0x52, 0x50, 0x75, 0x39, 0x81, 0x7a, 0xd0, 0xd6, 0x64, 0xdd, 0xed,
0x2c, 0xfa, 0x87, 0x6e, 0x55, 0xbe, 0xab, 0xcb, 0x77, 0xdf, 0xce, 0x08, 0x7e, 0xbd, 0x5c, 0xf5,
0xfa, 0xa7, 0x6d, 0x04, 0x3b, 0x95, 0x9f, 0x46, 0xf4, 0x26, 0x59, 0x41, 0xd5, 0x5d, 0x9b, 0x6a,
0x93, 0x93, 0x82, 0xa2, 0x67, 0x80, 0x78, 0xce, 0xd8, 0x45, 0x28, 0xf3, 0x14, 0x0f, 0x42, 0x4e,
0xf2, 0x94, 0xc5, 0x2a, 0x5a, 0x33, 0x68, 0x2b, 0xe4, 0xac, 0x04, 0x4e, 0xd5, 0xdc, 0x39, 0x84,
0xd6, 0x4a, 0x43, 0xc8, 0x81, 0x26, 0x2f, 0xa2, 0xf0, 0x8a, 0x8c, 0x43, 0x95, 0x7e, 0xc7, 0xe8,
0x9a, 0xfb, 0x5b, 0x41, 0x83, 0x17, 0xd1, 0x07, 0x32, 0x3e, 0x2b, 0x47, 0x07, 0xf5, 0xaf, 0x37,
0xb6, 0xf1, 0xfb, 0xc6, 0x36, 0x9c, 0x03, 0x68, 0x2e, 0xb5, 0x83, 0x6c, 0x68, 0x60, 0xce, 0x43,
0xdd, 0x69, 0x99, 0xc6, 0x7a, 0x00, 0x98, 0xf3, 0x19, 0x6d, 0x41, 0x7b, 0x0e, 0xdb, 0xef, 0xb0,
0xb8, 0x24, 0xf1, 0x4c, 0xfa, 0x04, 0x5a, 0x2a, 0xc3, 0x70, 0xb5, 0xc0, 0xa6, 0x1a, 0xf7, 0x74,
0x8b, 0x0e, 0x34, 0xe7, 0xbc, 0x79, 0x97, 0x0d, 0xcd, 0x3a, 0xc6, 0xc2, 0xff, 0xf8, 0x65, 0x62,
0x19, 0xb7, 0x13, 0xcb, 0xb8, 0x9b, 0x58, 0xc6, 0xaf, 0x89, 0x65, 0x7c, 0x9e, 0x5a, 0xb5, 0xbb,
0xa9, 0x55, 0xfb, 0x3e, 0xb5, 0x6a, 0xe7, 0x2f, 0x93, 0x54, 0x5e, 0x16, 0x91, 0xdb, 0x67, 0xd4,
0x5b, 0x7c, 0xc0, 0xf3, 0xcf, 0xea, 0x85, 0xae, 0x3e, 0xee, 0x68, 0x43, 0xcd, 0x5f, 0xfc, 0x09,
0x00, 0x00, 0xff, 0xff, 0xf4, 0xdd, 0x09, 0xef, 0xf7, 0x03, 0x00, 0x00,
} }
func (this *ConsensusParams) Equal(that interface{}) bool { func (this *ConsensusParams) Equal(that interface{}) bool {
@ -415,6 +472,9 @@ func (this *ConsensusParams) Equal(that interface{}) bool {
if !this.Validator.Equal(&that1.Validator) { if !this.Validator.Equal(&that1.Validator) {
return false return false
} }
if !this.Version.Equal(&that1.Version) {
return false
}
return true return true
} }
func (this *BlockParams) Equal(that interface{}) bool { func (this *BlockParams) Equal(that interface{}) bool {
@ -509,6 +569,30 @@ func (this *ValidatorParams) Equal(that interface{}) bool {
} }
return true return true
} }
func (this *VersionParams) Equal(that interface{}) bool {
if that == nil {
return this == nil
}
that1, ok := that.(*VersionParams)
if !ok {
that2, ok := that.(VersionParams)
if ok {
that1 = &that2
} else {
return false
}
}
if that1 == nil {
return this == nil
} else if this == nil {
return false
}
if this.AppVersion != that1.AppVersion {
return false
}
return true
}
func (this *HashedParams) Equal(that interface{}) bool { func (this *HashedParams) Equal(that interface{}) bool {
if that == nil { if that == nil {
return this == nil return this == nil
@ -556,6 +640,16 @@ func (m *ConsensusParams) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i _ = i
var l int var l int
_ = l _ = l
{
size, err := m.Version.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintParams(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x22
{ {
size, err := m.Validator.MarshalToSizedBuffer(dAtA[:i]) size, err := m.Validator.MarshalToSizedBuffer(dAtA[:i])
if err != nil { if err != nil {
@ -657,12 +751,12 @@ func (m *EvidenceParams) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i-- i--
dAtA[i] = 0x18 dAtA[i] = 0x18
} }
n4, err4 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MaxAgeDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MaxAgeDuration):])
if err4 != nil {
return 0, err4
n5, err5 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MaxAgeDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MaxAgeDuration):])
if err5 != nil {
return 0, err5
} }
i -= n4
i = encodeVarintParams(dAtA, i, uint64(n4))
i -= n5
i = encodeVarintParams(dAtA, i, uint64(n5))
i-- i--
dAtA[i] = 0x12 dAtA[i] = 0x12
if m.MaxAgeNumBlocks != 0 { if m.MaxAgeNumBlocks != 0 {
@ -705,6 +799,34 @@ func (m *ValidatorParams) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil return len(dAtA) - i, nil
} }
func (m *VersionParams) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *VersionParams) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *VersionParams) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
if m.AppVersion != 0 {
i = encodeVarintParams(dAtA, i, uint64(m.AppVersion))
i--
dAtA[i] = 0x8
}
return len(dAtA) - i, nil
}
func (m *HashedParams) Marshal() (dAtA []byte, err error) { func (m *HashedParams) Marshal() (dAtA []byte, err error) {
size := m.Size() size := m.Size()
dAtA = make([]byte, size) dAtA = make([]byte, size)
@ -761,6 +883,14 @@ func NewPopulatedValidatorParams(r randyParams, easy bool) *ValidatorParams {
return this return this
} }
func NewPopulatedVersionParams(r randyParams, easy bool) *VersionParams {
this := &VersionParams{}
this.AppVersion = uint64(uint64(r.Uint32()))
if !easy && r.Intn(10) != 0 {
}
return this
}
type randyParams interface { type randyParams interface {
Float32() float32 Float32() float32
Float64() float64 Float64() float64
@ -845,6 +975,8 @@ func (m *ConsensusParams) Size() (n int) {
n += 1 + l + sovParams(uint64(l)) n += 1 + l + sovParams(uint64(l))
l = m.Validator.Size() l = m.Validator.Size()
n += 1 + l + sovParams(uint64(l)) n += 1 + l + sovParams(uint64(l))
l = m.Version.Size()
n += 1 + l + sovParams(uint64(l))
return n return n
} }
@ -901,6 +1033,18 @@ func (m *ValidatorParams) Size() (n int) {
return n return n
} }
func (m *VersionParams) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
if m.AppVersion != 0 {
n += 1 + sovParams(uint64(m.AppVersion))
}
return n
}
func (m *HashedParams) Size() (n int) { func (m *HashedParams) Size() (n int) {
if m == nil { if m == nil {
return 0 return 0
@ -1050,6 +1194,39 @@ func (m *ConsensusParams) Unmarshal(dAtA []byte) error {
return err return err
} }
iNdEx = postIndex iNdEx = postIndex
case 4:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowParams
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthParams
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthParams
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if err := m.Version.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipParams(dAtA[iNdEx:]) skippy, err := skipParams(dAtA[iNdEx:])
@ -1412,6 +1589,78 @@ func (m *ValidatorParams) Unmarshal(dAtA []byte) error {
} }
return nil return nil
} }
func (m *VersionParams) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowParams
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: VersionParams: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: VersionParams: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field AppVersion", wireType)
}
m.AppVersion = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowParams
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.AppVersion |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := skipParams(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthParams
}
if (iNdEx + skippy) < 0 {
return ErrInvalidLengthParams
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *HashedParams) Unmarshal(dAtA []byte) error { func (m *HashedParams) Unmarshal(dAtA []byte) error {
l := len(dAtA) l := len(dAtA)
iNdEx := 0 iNdEx := 0


+ 9
- 0
proto/tendermint/types/params.proto View File

@ -14,6 +14,7 @@ message ConsensusParams {
BlockParams block = 1 [(gogoproto.nullable) = false]; BlockParams block = 1 [(gogoproto.nullable) = false];
EvidenceParams evidence = 2 [(gogoproto.nullable) = false]; EvidenceParams evidence = 2 [(gogoproto.nullable) = false];
ValidatorParams validator = 3 [(gogoproto.nullable) = false]; ValidatorParams validator = 3 [(gogoproto.nullable) = false];
VersionParams version = 4 [(gogoproto.nullable) = false];
} }
// BlockParams contains limits on the block size. // BlockParams contains limits on the block size.
@ -64,6 +65,14 @@ message ValidatorParams {
repeated string pub_key_types = 1; repeated string pub_key_types = 1;
} }
// VersionParams contains the ABCI application version.
message VersionParams {
option (gogoproto.populate) = true;
option (gogoproto.equal) = true;
uint64 app_version = 1;
}
// HashedParams is a subset of ConsensusParams. // HashedParams is a subset of ConsensusParams.
// It is amino encoded and hashed into // It is amino encoded and hashed into
// the Header.ConsensusHash. // the Header.ConsensusHash.


+ 3
- 1
state/execution.go View File

@ -431,11 +431,13 @@ func updateState(
if err != nil { if err != nil {
return state, fmt.Errorf("error updating consensus params: %v", err) return state, fmt.Errorf("error updating consensus params: %v", err)
} }
state.Version.Consensus.App = nextParams.Version.AppVersion
// Change results from this height but only applies to the next height. // Change results from this height but only applies to the next height.
lastHeightParamsChanged = header.Height + 1 lastHeightParamsChanged = header.Height + 1
} }
// TODO: allow app to upgrade version
nextVersion := state.Version nextVersion := state.Version
// NOTE: the AppHash has not been populated. // NOTE: the AppHash has not been populated.


+ 3
- 5
state/execution_test.go View File

@ -8,7 +8,6 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/tendermint/tendermint/abci/example/kvstore"
abci "github.com/tendermint/tendermint/abci/types" abci "github.com/tendermint/tendermint/abci/types"
"github.com/tendermint/tendermint/crypto/ed25519" "github.com/tendermint/tendermint/crypto/ed25519"
cryptoenc "github.com/tendermint/tendermint/crypto/encoding" cryptoenc "github.com/tendermint/tendermint/crypto/encoding"
@ -28,8 +27,7 @@ var (
) )
func TestApplyBlock(t *testing.T) { func TestApplyBlock(t *testing.T) {
app := kvstore.NewApplication()
app.RetainBlocks = 1
app := &testApp{}
cc := proxy.NewLocalClientCreator(app) cc := proxy.NewLocalClientCreator(app)
proxyApp := proxy.NewAppConns(cc) proxyApp := proxy.NewAppConns(cc)
err := proxyApp.Start() err := proxyApp.Start()
@ -44,11 +42,12 @@ func TestApplyBlock(t *testing.T) {
block := makeBlock(state, 1) block := makeBlock(state, 1)
blockID := types.BlockID{Hash: block.Hash(), PartSetHeader: block.MakePartSet(testPartSize).Header()} blockID := types.BlockID{Hash: block.Hash(), PartSetHeader: block.MakePartSet(testPartSize).Header()}
_, retainHeight, err := blockExec.ApplyBlock(state, blockID, block)
state, retainHeight, err := blockExec.ApplyBlock(state, blockID, block)
require.Nil(t, err) require.Nil(t, err)
assert.EqualValues(t, retainHeight, 1) assert.EqualValues(t, retainHeight, 1)
// TODO check state and mempool // TODO check state and mempool
assert.EqualValues(t, 1, state.Version.Consensus.App, "App version wasn't updated")
} }
// TestBeginBlockValidators ensures we send absent validators list. // TestBeginBlockValidators ensures we send absent validators list.
@ -402,5 +401,4 @@ func TestEndBlockValidatorUpdatesResultingInEmptySet(t *testing.T) {
assert.NotPanics(t, func() { state, _, err = blockExec.ApplyBlock(state, blockID, block) }) assert.NotPanics(t, func() { state, _, err = blockExec.ApplyBlock(state, blockID, block) })
assert.NotNil(t, err) assert.NotNil(t, err)
assert.NotEmpty(t, state.NextValidators.Validators) assert.NotEmpty(t, state.NextValidators.Validators)
} }

+ 6
- 22
state/helpers_test.go View File

@ -145,26 +145,6 @@ func genValSet(size int) *types.ValidatorSet {
return types.NewValidatorSet(vals) return types.NewValidatorSet(vals)
} }
func makeConsensusParams(
blockBytes, blockGas int64,
blockTimeIotaMs int64,
evidenceAge int64,
maxNumEvidence uint32,
) tmproto.ConsensusParams {
return tmproto.ConsensusParams{
Block: tmproto.BlockParams{
MaxBytes: blockBytes,
MaxGas: blockGas,
TimeIotaMs: blockTimeIotaMs,
},
Evidence: tmproto.EvidenceParams{
MaxAgeNumBlocks: evidenceAge,
MaxAgeDuration: time.Duration(evidenceAge),
MaxNum: maxNumEvidence,
},
}
}
func makeHeaderPartsResponsesValPubKeyChange( func makeHeaderPartsResponsesValPubKeyChange(
state sm.State, state sm.State,
pubkey crypto.PubKey, pubkey crypto.PubKey,
@ -266,7 +246,11 @@ func (app *testApp) BeginBlock(req abci.RequestBeginBlock) abci.ResponseBeginBlo
} }
func (app *testApp) EndBlock(req abci.RequestEndBlock) abci.ResponseEndBlock { func (app *testApp) EndBlock(req abci.RequestEndBlock) abci.ResponseEndBlock {
return abci.ResponseEndBlock{ValidatorUpdates: app.ValidatorUpdates}
return abci.ResponseEndBlock{
ValidatorUpdates: app.ValidatorUpdates,
ConsensusParamUpdates: &abci.ConsensusParams{
Version: &tmproto.VersionParams{
AppVersion: 1}}}
} }
func (app *testApp) DeliverTx(req abci.RequestDeliverTx) abci.ResponseDeliverTx { func (app *testApp) DeliverTx(req abci.RequestDeliverTx) abci.ResponseDeliverTx {
@ -278,7 +262,7 @@ func (app *testApp) CheckTx(req abci.RequestCheckTx) abci.ResponseCheckTx {
} }
func (app *testApp) Commit() abci.ResponseCommit { func (app *testApp) Commit() abci.ResponseCommit {
return abci.ResponseCommit{}
return abci.ResponseCommit{RetainHeight: 1}
} }
func (app *testApp) Query(reqQuery abci.RequestQuery) (resQuery abci.ResponseQuery) { func (app *testApp) Query(reqQuery abci.RequestQuery) (resQuery abci.ResponseQuery) {


+ 0
- 36
state/state_test.go View File

@ -7,7 +7,6 @@ import (
"math/big" "math/big"
"os" "os"
"testing" "testing"
"time"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
@ -1029,41 +1028,6 @@ func TestConsensusParamsChangesSaveLoad(t *testing.T) {
} }
} }
func TestApplyUpdates(t *testing.T) {
initParams := makeConsensusParams(1, 2, 3, 4, 5)
const maxAge int64 = 66
cases := [...]struct {
init tmproto.ConsensusParams
updates abci.ConsensusParams
expected tmproto.ConsensusParams
}{
0: {initParams, abci.ConsensusParams{}, initParams},
1: {initParams, abci.ConsensusParams{}, initParams},
2: {initParams,
abci.ConsensusParams{
Block: &abci.BlockParams{
MaxBytes: 44,
MaxGas: 55,
},
},
makeConsensusParams(44, 55, 3, 4, 5)},
3: {initParams,
abci.ConsensusParams{
Evidence: &tmproto.EvidenceParams{
MaxAgeNumBlocks: maxAge,
MaxAgeDuration: time.Duration(maxAge),
MaxNum: 10,
},
},
makeConsensusParams(1, 2, 3, maxAge, 10)},
}
for i, tc := range cases {
res := types.UpdateConsensusParams(tc.init, &(tc.updates))
assert.Equal(t, tc.expected, res, "case %d", i)
}
}
func TestStateProto(t *testing.T) { func TestStateProto(t *testing.T) {
tearDown, _, state := setupTestCase(t) tearDown, _, state := setupTestCase(t)
defer tearDown(t) defer tearDown(t)


+ 2
- 2
state/validation_test.go View File

@ -46,9 +46,9 @@ func TestValidateBlockHeader(t *testing.T) {
// some bad values // some bad values
wrongHash := tmhash.Sum([]byte("this hash is wrong")) wrongHash := tmhash.Sum([]byte("this hash is wrong"))
wrongVersion1 := state.Version.Consensus wrongVersion1 := state.Version.Consensus
wrongVersion1.Block++
wrongVersion1.Block += 2
wrongVersion2 := state.Version.Consensus wrongVersion2 := state.Version.Consensus
wrongVersion2.App++
wrongVersion2.App += 2
// Manipulation of any header field causes failure. // Manipulation of any header field causes failure.
testCases := []struct { testCases := []struct {


+ 10
- 0
types/params.go View File

@ -30,6 +30,7 @@ func DefaultConsensusParams() *tmproto.ConsensusParams {
Block: DefaultBlockParams(), Block: DefaultBlockParams(),
Evidence: DefaultEvidenceParams(), Evidence: DefaultEvidenceParams(),
Validator: DefaultValidatorParams(), Validator: DefaultValidatorParams(),
Version: DefaultVersionParams(),
} }
} }
@ -60,6 +61,12 @@ func DefaultValidatorParams() tmproto.ValidatorParams {
} }
} }
func DefaultVersionParams() tmproto.VersionParams {
return tmproto.VersionParams{
AppVersion: 0,
}
}
func IsValidPubkeyType(params tmproto.ValidatorParams, pubkeyType string) bool { func IsValidPubkeyType(params tmproto.ValidatorParams, pubkeyType string) bool {
for i := 0; i < len(params.PubKeyTypes); i++ { for i := 0; i < len(params.PubKeyTypes); i++ {
if params.PubKeyTypes[i] == pubkeyType { if params.PubKeyTypes[i] == pubkeyType {
@ -182,5 +189,8 @@ func UpdateConsensusParams(params tmproto.ConsensusParams, params2 *abci.Consens
// This avoids having to initialize the slice to 0 values, and then write to it again. // This avoids having to initialize the slice to 0 values, and then write to it again.
res.Validator.PubKeyTypes = append([]string{}, params2.Validator.PubKeyTypes...) res.Validator.PubKeyTypes = append([]string{}, params2.Validator.PubKeyTypes...)
} }
if params2.Version != nil {
res.Version.AppVersion = params2.Version.AppVersion
}
return res return res
} }

+ 11
- 0
types/params_test.go View File

@ -138,3 +138,14 @@ func TestConsensusParamsUpdate(t *testing.T) {
assert.Equal(t, tc.updatedParams, UpdateConsensusParams(tc.params, tc.updates)) assert.Equal(t, tc.updatedParams, UpdateConsensusParams(tc.params, tc.updates))
} }
} }
func TestConsensusParamsUpdate_AppVersion(t *testing.T) {
params := makeParams(1, 2, 10, 3, 0, valEd25519)
assert.EqualValues(t, 0, params.Version.AppVersion)
updated := UpdateConsensusParams(params,
&abci.ConsensusParams{Version: &tmproto.VersionParams{AppVersion: 1}})
assert.EqualValues(t, 1, updated.Version.AppVersion)
}

Loading…
Cancel
Save