Validate InstantiateConfig in CodeInfo

This commit is contained in:
Alex Peters
2020-07-17 09:49:43 +02:00
parent 871896c62b
commit 530710e67f
4 changed files with 45 additions and 85 deletions

View File

@@ -104,9 +104,8 @@ func TestGenesisExportImport(t *testing.T) {
func TestFailFastImport(t *testing.T) {
wasmCode, err := ioutil.ReadFile("./testdata/contract.wasm")
require.NoError(t, err)
codeHash := sha256.Sum256(wasmCode)
anyAddress := make([]byte, 20)
myCodeInfo := wasmTypes.CodeInfoFixture(wasmTypes.WithSHA256CodeHash(wasmCode))
specs := map[string]struct {
src types.GenesisState
expSuccess bool
@@ -114,11 +113,8 @@ func TestFailFastImport(t *testing.T) {
"happy path: code info correct": {
src: types.GenesisState{
Codes: []types.Code{{
CodeID: 1,
CodeInfo: wasmTypes.CodeInfo{
CodeHash: codeHash[:],
Creator: anyAddress,
},
CodeID: 1,
CodeInfo: myCodeInfo,
CodesBytes: wasmCode,
}},
Sequences: []types.Sequence{
@@ -132,18 +128,12 @@ func TestFailFastImport(t *testing.T) {
"happy path: code ids can contain gaps": {
src: types.GenesisState{
Codes: []types.Code{{
CodeID: 1,
CodeInfo: wasmTypes.CodeInfo{
CodeHash: codeHash[:],
Creator: anyAddress,
},
CodeID: 1,
CodeInfo: myCodeInfo,
CodesBytes: wasmCode,
}, {
CodeID: 3,
CodeInfo: wasmTypes.CodeInfo{
CodeHash: codeHash[:],
Creator: anyAddress,
},
CodeID: 3,
CodeInfo: myCodeInfo,
CodesBytes: wasmCode,
}},
Sequences: []types.Sequence{
@@ -157,18 +147,12 @@ func TestFailFastImport(t *testing.T) {
"happy path: code order does not matter": {
src: types.GenesisState{
Codes: []types.Code{{
CodeID: 2,
CodeInfo: wasmTypes.CodeInfo{
CodeHash: codeHash[:],
Creator: anyAddress,
},
CodeID: 2,
CodeInfo: myCodeInfo,
CodesBytes: wasmCode,
}, {
CodeID: 1,
CodeInfo: wasmTypes.CodeInfo{
CodeHash: codeHash[:],
Creator: anyAddress,
},
CodeID: 1,
CodeInfo: myCodeInfo,
CodesBytes: wasmCode,
}},
Contracts: nil,
@@ -182,11 +166,8 @@ func TestFailFastImport(t *testing.T) {
},
"prevent code hash mismatch": {src: types.GenesisState{
Codes: []types.Code{{
CodeID: 1,
CodeInfo: wasmTypes.CodeInfo{
CodeHash: make([]byte, len(codeHash)),
Creator: anyAddress,
},
CodeID: 1,
CodeInfo: wasmTypes.CodeInfoFixture(func(i *wasmTypes.CodeInfo) { i.CodeHash = make([]byte, sha256.Size) }),
CodesBytes: wasmCode,
}},
Params: types.DefaultParams(),
@@ -194,19 +175,13 @@ func TestFailFastImport(t *testing.T) {
"prevent duplicate codeIDs": {src: types.GenesisState{
Codes: []types.Code{
{
CodeID: 1,
CodeInfo: wasmTypes.CodeInfo{
CodeHash: codeHash[:],
Creator: anyAddress,
},
CodeID: 1,
CodeInfo: myCodeInfo,
CodesBytes: wasmCode,
},
{
CodeID: 1,
CodeInfo: wasmTypes.CodeInfo{
CodeHash: codeHash[:],
Creator: anyAddress,
},
CodeID: 1,
CodeInfo: myCodeInfo,
CodesBytes: wasmCode,
},
},
@@ -215,11 +190,8 @@ func TestFailFastImport(t *testing.T) {
"happy path: code id in info and contract do match": {
src: types.GenesisState{
Codes: []types.Code{{
CodeID: 1,
CodeInfo: wasmTypes.CodeInfo{
CodeHash: codeHash[:],
Creator: anyAddress,
},
CodeID: 1,
CodeInfo: myCodeInfo,
CodesBytes: wasmCode,
}},
Contracts: []types.Contract{
@@ -239,11 +211,8 @@ func TestFailFastImport(t *testing.T) {
"happy path: code info with two contracts": {
src: types.GenesisState{
Codes: []types.Code{{
CodeID: 1,
CodeInfo: wasmTypes.CodeInfo{
CodeHash: codeHash[:],
Creator: anyAddress,
},
CodeID: 1,
CodeInfo: myCodeInfo,
CodesBytes: wasmCode,
}},
Contracts: []types.Contract{
@@ -277,11 +246,8 @@ func TestFailFastImport(t *testing.T) {
"prevent duplicate contract address": {
src: types.GenesisState{
Codes: []types.Code{{
CodeID: 1,
CodeInfo: wasmTypes.CodeInfo{
CodeHash: codeHash[:],
Creator: anyAddress,
},
CodeID: 1,
CodeInfo: myCodeInfo,
CodesBytes: wasmCode,
}},
Contracts: []types.Contract{
@@ -299,11 +265,8 @@ func TestFailFastImport(t *testing.T) {
"prevent duplicate contract model keys": {
src: types.GenesisState{
Codes: []types.Code{{
CodeID: 1,
CodeInfo: wasmTypes.CodeInfo{
CodeHash: codeHash[:],
Creator: anyAddress,
},
CodeID: 1,
CodeInfo: myCodeInfo,
CodesBytes: wasmCode,
}},
Contracts: []types.Contract{
@@ -337,11 +300,8 @@ func TestFailFastImport(t *testing.T) {
"prevent code id seq init value == max codeID used": {
src: types.GenesisState{
Codes: []types.Code{{
CodeID: 2,
CodeInfo: wasmTypes.CodeInfo{
CodeHash: codeHash[:],
Creator: anyAddress,
},
CodeID: 2,
CodeInfo: myCodeInfo,
CodesBytes: wasmCode,
}},
Sequences: []types.Sequence{
@@ -353,11 +313,8 @@ func TestFailFastImport(t *testing.T) {
"prevent contract id seq init value == count contracts": {
src: types.GenesisState{
Codes: []types.Code{{
CodeID: 1,
CodeInfo: wasmTypes.CodeInfo{
CodeHash: codeHash[:],
Creator: anyAddress,
},
CodeID: 1,
CodeInfo: myCodeInfo,
CodesBytes: wasmCode,
}},
Contracts: []types.Contract{
@@ -456,8 +413,8 @@ func TestImportContractWithCodeHistoryReset(t *testing.T) {
"source": "https://example.com",
"builder": "foo/bar:tag",
"instantiate_config": {
"type": 1,
"address": ""
"permission": "OnlyAddress",
"address": "cosmos1qtu5n0cnhfkjj6l2rq97hmky9fd89gwca9yarx"
}
},
"code_bytes": %q

View File

@@ -42,15 +42,10 @@ func GenesisFixture(mutators ...func(*GenesisState)) GenesisState {
func CodeFixture(mutators ...func(*Code)) Code {
wasmCode := rand.Bytes(100)
codeHash := sha256.Sum256(wasmCode)
anyAddress := make([]byte, 20)
fixture := Code{
CodeID: 1,
CodeInfo: CodeInfo{
CodeHash: codeHash[:],
Creator: anyAddress,
},
CodeID: 1,
CodeInfo: CodeInfoFixture(WithSHA256CodeHash(wasmCode)),
CodesBytes: wasmCode,
}
@@ -65,10 +60,11 @@ func CodeInfoFixture(mutators ...func(*CodeInfo)) CodeInfo {
codeHash := sha256.Sum256(wasmCode)
anyAddress := make([]byte, 20)
fixture := CodeInfo{
CodeHash: codeHash[:],
Creator: anyAddress,
Source: "https://example.com",
Builder: "my/builder:tag",
CodeHash: codeHash[:],
Creator: anyAddress,
Source: "https://example.com",
Builder: "my/builder:tag",
InstantiateConfig: AllowEverybody,
}
for _, m := range mutators {
m(&fixture)

View File

@@ -51,6 +51,9 @@ func (c CodeInfo) ValidateBasic() error {
if err := validateBuilder(c.Builder); err != nil {
return sdkerrors.Wrap(err, "builder")
}
if err := c.InstantiateConfig.ValidateBasic(); err != nil {
return sdkerrors.Wrap(err, "instantiate config")
}
return nil
}

View File

@@ -101,6 +101,10 @@ func TestCodeInfoValidateBasic(t *testing.T) {
srcMutator: func(c *CodeInfo) { c.Builder = "invalid" },
expError: true,
},
"Instantiate config invalid": {
srcMutator: func(c *CodeInfo) { c.InstantiateConfig = AccessConfig{} },
expError: true,
},
}
for msg, spec := range specs {
t.Run(msg, func(t *testing.T) {