diff --git a/pkg/smartcontract/context/context.go b/pkg/smartcontract/context/context.go index 16fc0b424..b22c9cb22 100644 --- a/pkg/smartcontract/context/context.go +++ b/pkg/smartcontract/context/context.go @@ -135,7 +135,7 @@ func (c *ParameterContext) getItemForContract(ctr *wallet.Contract) *Item { params[i].Type = ctr.Parameters[i].Type } item := &Item{ - Script: h, + Script: ctr.Script, Parameters: params, Signatures: make(map[string][]byte), } diff --git a/pkg/smartcontract/context/context_test.go b/pkg/smartcontract/context/context_test.go index 8c389e97c..2be84eb03 100644 --- a/pkg/smartcontract/context/context_test.go +++ b/pkg/smartcontract/context/context_test.go @@ -2,6 +2,7 @@ package context import ( "encoding/hex" + "encoding/json" "testing" "github.com/nspcc-dev/neo-go/internal/testserdes" @@ -131,7 +132,7 @@ func TestParameterContext_MarshalJSON(t *testing.T) { Verifiable: tx, Items: map[util.Uint160]*Item{ priv.GetScriptHash(): { - Script: priv.GetScriptHash(), + Script: priv.PublicKey().GetVerificationScript(), Parameters: []smartcontract.Parameter{{ Type: smartcontract.SignatureType, Value: sign, @@ -144,6 +145,22 @@ func TestParameterContext_MarshalJSON(t *testing.T) { } testserdes.MarshalUnmarshalJSON(t, expected, new(ParameterContext)) + + t.Run("invalid script", func(t *testing.T) { + js := `{ + "script": "AQID", + "parameters": [ + { + "type": "Signature", + "value": "QfOZLLqjMyPWMzRxMAKw7fcd8leLcpwiiTV2pUyC0pth/y7Iw7o7WzNpxeAJm5bmExmlF7g5pMhXz1xVT6KK3g==" + } + ], + "signatures": { + "025c210bde738e0e646929ee04ec2ccb42a700356083f55386b5347b9b725c10b9": "a6c6d8a2334791888df559419f07209ee39e2f20688af8cc38010854b98abf77194e37f173bbc86b77dce4afa8ce3ae5170dd346b5265bcb9b723d83299a6f0f", + "035d4da640b3a39f19ed88855aeddd97725422b4230ccae56bd5544419d0056ea9": "058e577f23395f382194eebb83f66bb8903c8f3c5b6afd759c20f2518466124dcd9cbccfc029a42e9a7d5a3a060b091edc73dcac949fd894d7a9d10678296ac6" + }` + require.Error(t, json.Unmarshal([]byte(js), new(ParameterContext))) + }) } func getPrivateKeys(t *testing.T, n int) ([]*keys.PrivateKey, []*keys.PublicKey) { diff --git a/pkg/smartcontract/context/item.go b/pkg/smartcontract/context/item.go index fcbb3e9fc..2b8a3dc57 100644 --- a/pkg/smartcontract/context/item.go +++ b/pkg/smartcontract/context/item.go @@ -1,23 +1,23 @@ package context import ( + "encoding/base64" "encoding/hex" "encoding/json" "github.com/nspcc-dev/neo-go/pkg/crypto/keys" "github.com/nspcc-dev/neo-go/pkg/smartcontract" - "github.com/nspcc-dev/neo-go/pkg/util" ) // Item represents a transaction context item. type Item struct { - Script util.Uint160 + Script []byte Parameters []smartcontract.Parameter Signatures map[string][]byte } type itemAux struct { - Script util.Uint160 `json:"script"` + Script string `json:"script"` Parameters []smartcontract.Parameter `json:"parameters"` Signatures map[string]string `json:"signatures"` } @@ -36,7 +36,7 @@ func (it *Item) AddSignature(pub *keys.PublicKey, sig []byte) { // MarshalJSON implements json.Marshaler interface. func (it Item) MarshalJSON() ([]byte, error) { ci := itemAux{ - Script: it.Script, + Script: base64.StdEncoding.EncodeToString(it.Script), Parameters: it.Parameters, Signatures: make(map[string]string, len(it.Signatures)), } @@ -55,6 +55,11 @@ func (it *Item) UnmarshalJSON(data []byte) error { return err } + script, err := base64.StdEncoding.DecodeString(ci.Script) + if err != nil { + return err + } + sigs := make(map[string][]byte, len(ci.Signatures)) for keyHex, sigHex := range ci.Signatures { _, err := keys.NewPublicKeyFromString(keyHex) @@ -69,7 +74,7 @@ func (it *Item) UnmarshalJSON(data []byte) error { } it.Signatures = sigs - it.Script = ci.Script + it.Script = script it.Parameters = ci.Parameters return nil } diff --git a/pkg/smartcontract/context/item_test.go b/pkg/smartcontract/context/item_test.go index ca29fc897..21108aa4d 100644 --- a/pkg/smartcontract/context/item_test.go +++ b/pkg/smartcontract/context/item_test.go @@ -8,7 +8,6 @@ import ( "github.com/nspcc-dev/neo-go/internal/testserdes" "github.com/nspcc-dev/neo-go/pkg/crypto/keys" "github.com/nspcc-dev/neo-go/pkg/smartcontract" - "github.com/nspcc-dev/neo-go/pkg/util" "github.com/stretchr/testify/require" ) @@ -41,7 +40,7 @@ func TestContextItem_MarshalJSON(t *testing.T) { require.NoError(t, err) expected := &Item{ - Script: util.Uint160{1, 2, 3}, + Script: []byte{1, 2, 3}, Parameters: []smartcontract.Parameter{{ Type: smartcontract.SignatureType, Value: random.Bytes(64),