manifest: return an error from IsValid
Be more specific.
This commit is contained in:
parent
211fe307ee
commit
5ba074b4cf
4 changed files with 21 additions and 14 deletions
|
@ -265,8 +265,9 @@ func (m *Management) Deploy(d dao.DAO, sender util.Uint160, neff *nef.File, mani
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if !manif.IsValid(h) {
|
err = manif.IsValid(h)
|
||||||
return nil, errors.New("invalid manifest for this contract")
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("invalid manifest: %w", err)
|
||||||
}
|
}
|
||||||
newcontract := &state.Contract{
|
newcontract := &state.Contract{
|
||||||
ID: id,
|
ID: id,
|
||||||
|
@ -322,8 +323,9 @@ func (m *Management) Update(d dao.DAO, hash util.Uint160, neff *nef.File, manif
|
||||||
if manif.Name != contract.Manifest.Name {
|
if manif.Name != contract.Manifest.Name {
|
||||||
return nil, errors.New("contract name can't be changed")
|
return nil, errors.New("contract name can't be changed")
|
||||||
}
|
}
|
||||||
if !manif.IsValid(contract.Hash) {
|
err = manif.IsValid(contract.Hash)
|
||||||
return nil, errors.New("invalid manifest for this contract")
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("invalid manifest: %w", err)
|
||||||
}
|
}
|
||||||
m.markUpdated(hash)
|
m.markUpdated(hash)
|
||||||
contract.Manifest = *manif
|
contract.Manifest = *manif
|
||||||
|
|
|
@ -71,13 +71,15 @@ func (m *Manifest) CanCall(hash util.Uint160, toCall *Manifest, method string) b
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsValid checks whether the hash given is correct wrt manifest's groups.
|
// IsValid checks whether the hash given is correct wrt manifest's groups.
|
||||||
func (m *Manifest) IsValid(hash util.Uint160) bool {
|
func (m *Manifest) IsValid(hash util.Uint160) error {
|
||||||
|
var err error
|
||||||
for _, g := range m.Groups {
|
for _, g := range m.Groups {
|
||||||
if !g.IsValid(hash) {
|
err = g.IsValid(hash)
|
||||||
return false
|
if err != nil {
|
||||||
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToStackItem converts Manifest to stackitem.Item.
|
// ToStackItem converts Manifest to stackitem.Item.
|
||||||
|
|
|
@ -112,7 +112,7 @@ func TestIsValid(t *testing.T) {
|
||||||
m := NewManifest("Test")
|
m := NewManifest("Test")
|
||||||
|
|
||||||
t.Run("valid, no groups", func(t *testing.T) {
|
t.Run("valid, no groups", func(t *testing.T) {
|
||||||
require.True(t, m.IsValid(contractHash))
|
require.NoError(t, m.IsValid(contractHash))
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("with groups", func(t *testing.T) {
|
t.Run("with groups", func(t *testing.T) {
|
||||||
|
@ -129,11 +129,11 @@ func TestIsValid(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Run("valid", func(t *testing.T) {
|
t.Run("valid", func(t *testing.T) {
|
||||||
require.True(t, m.IsValid(contractHash))
|
require.NoError(t, m.IsValid(contractHash))
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("invalid, wrong contract hash", func(t *testing.T) {
|
t.Run("invalid, wrong contract hash", func(t *testing.T) {
|
||||||
require.False(t, m.IsValid(util.Uint160{4, 5, 6}))
|
require.Error(t, m.IsValid(util.Uint160{4, 5, 6}))
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("invalid, wrong group signature", func(t *testing.T) {
|
t.Run("invalid, wrong group signature", func(t *testing.T) {
|
||||||
|
@ -145,7 +145,7 @@ func TestIsValid(t *testing.T) {
|
||||||
// of the contract hash.
|
// of the contract hash.
|
||||||
Signature: pk.Sign([]byte{1, 2, 3}),
|
Signature: pk.Sign([]byte{1, 2, 3}),
|
||||||
})
|
})
|
||||||
require.False(t, m.IsValid(contractHash))
|
require.Error(t, m.IsValid(contractHash))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,8 +56,11 @@ func NewParameter(name string, typ smartcontract.ParamType) Parameter {
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsValid checks whether group's signature corresponds to the given hash.
|
// IsValid checks whether group's signature corresponds to the given hash.
|
||||||
func (g *Group) IsValid(h util.Uint160) bool {
|
func (g *Group) IsValid(h util.Uint160) error {
|
||||||
return g.PublicKey.Verify(g.Signature, hash.Sha256(h.BytesBE()).BytesBE())
|
if !g.PublicKey.Verify(g.Signature, hash.Sha256(h.BytesBE()).BytesBE()) {
|
||||||
|
return errors.New("incorrect group signature")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalJSON implements json.Marshaler interface.
|
// MarshalJSON implements json.Marshaler interface.
|
||||||
|
|
Loading…
Reference in a new issue