nspcc-dev / neo-go

Go Node and SDK for the Neo blockchain
MIT License
123 stars 79 forks source link

Item cast to struct does not ensure/convert field type #3610

Open carpawell opened 1 month ago

carpawell commented 1 month ago

Tried to cast item from contract's storage and use it.

Current Behavior

    newNodes := storage.Find(ctx, newNodesPrefix, storage.None)
    for iterator.Next(newNodes) {
        newNode := iterator.Value(newNodes).(struct {
            key []byte
            val []byte
        })

        newNode.key[0] = 1
    }

leads to SETITEM: invalid item type ByteString

newNode.key[:][0] = 1 solves the issue... why?

Expected Behavior

I said (asserted/converted) that it is a []byte, i want to use it as []byte.

Possible Solution

Ensure, cast or throw an exception at .() operator, not when it is tried to be used later.

Steps to Reproduce

Code from Current Behavior.

Context

https://github.com/nspcc-dev/neofs-contract/pull/438#discussion_r1786975526

Regression

Not sure.

Your Environment

github.com/nspcc-dev/neo-go v0.106.3