Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HF-based native contract update doesn't work as expected #3194

Closed
AnnaShaleva opened this issue Apr 11, 2024 · 0 comments · Fixed by #3195
Closed

HF-based native contract update doesn't work as expected #3194

AnnaShaleva opened this issue Apr 11, 2024 · 0 comments · Fixed by #3195
Labels
bug Used to tag confirmed bugs
Milestone

Comments

@AnnaShaleva
Copy link
Member

Describe the bug
While testing the NeoGo's port of HF-based native contracts update I discovered the following situation: native NEP-17 tokens do not have Transfer events declared in their manifest. So states comparison of the fresh NeoC# node master with nspcc-dev/neo-go#3402 gives us:

anna@kiwi:~/Documents/GitProjects/nspcc-dev/neo-go$ go run scripts/compare-states/compare-states.go --ignore-height http://localhost:10332 http://localhost:20332
at 0: e96672c15146f6e385c87f4d8327207e33086f805e88b4a28fb8cffe65f82786 vs 0dcd4ee76db1f5e30eef0c1574311063adcea654a22831430ef8e5a3f0e17eba
state differs at 0, block 1f4d1defa46faa5e7b9b8d3f79a06bec777d7c26c4aa5f6f5899a291daa87c15
different state found
exit status 1

And if take a look at the genesis block state dumps we can see that:

anna@kiwi:~/Documents/GitProjects/nspcc-dev/neo-go$ go run scripts/compare-dumps/compare-dumps.go Storage_mainnet_783K/ GoDump_mainnet_10/
Processing directory BlockStorage_0
block 0: value mismatch for key /////wj1Y+pAvCg9TQ4FxI6jBbPyoHNA7w==:
	Contract ID: -1
	Item prefix (base64): CPVj6kC8KD1NDgXEjqMFs/Kgc0Dv
	Item prefix (hex): 08f563ea40bc283d4d0e05c48ea305b3f2a07340ef
	Item prefix (bytes): [8 245 99 234 64 188 40 61 77 14 5 196 142 163 5 179 242 160 115 64 239]
	Diff: QAUhAfshACgU9WPqQLwoPU0OBcSOowWz8qBzQO8o005FRjNuZW8tY29yZS12My4wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACFEEEa93tnQBBBGvd7Z0AQQRr3e2dAEEEa93tnQBBBGvd7Z0AQQRr3e2dAEEEa93tnQBBBGvd7Z0AQQRr3e2dAEEEa93tnQBBBGvd7Z0AQQRr3e2dAEEEa93tnQBBBGvd7Z0AQQRr3e2dAEEEa93tnQBBBGvd7Z0AQQRr3e2dAEEEa93tnQHvz5gNBCCgITmVvVG9rZW5AAEgAQAEoBk5FUC0xN0ECQBNBBSgJYmFsYW5jZU9mQAFBAigHYWNjb3VudCEBFCEBESEAIAFBBSgIZGVjaW1hbHNAACEBESEBByABQQUoD2dldEFjY291bnRTdGF0ZUABQQIoB2FjY291bnQhARQhASAhAQ4gAUEFKBBnZXRBbGxDYW5kaWRhdGVzQAAhATAhARUgAUEFKBBnZXRDYW5kaWRhdGVWb3RlQAFBAigGcHViS2V5IQEWIQERIQEcIAFBBSgNZ2V0Q2FuZGlkYXRlc0AAIQEgIQEjIAFBBSgMZ2V0Q29tbWl0dGVlQAAhASAhASogAUEFKA5nZXRHYXNQZXJCbG9ja0AAIQERIQExIAFBBSgWZ2V0TmV4dEJsb2NrVmFsaWRhdG9yc0AAIQEgIQE4IAFBBSgQZ2V0UmVnaXN0ZXJQcmljZUAAIQERIQE/IAFBBSgRcmVnaXN0ZXJDYW5kaWRhdGVAAUECKAZwdWJrZXkhARYhARAhAUYgAEEFKA5zZXRHYXNQZXJCbG9ja0ABQQIoC2dhc1BlckJsb2NrIQERIQL/ACEBTSAAQQUoEHNldFJlZ2lzdGVyUHJpY2VAAUECKA1yZWdpc3RlclByaWNlIQERIQL/ACEBVCAAQQUoBnN5bWJvbEAAIQETIQFbIAFBBSgLdG90YWxTdXBwbHlAACEBESEBYiABQQUoCHRyYW5zZmVyQARBAigEZnJvbSEBFEECKAJ0byEBFEECKAZhbW91bnQhARFBAigEZGF0YSEAIQEQIQFpIABBBSgMdW5jbGFpbWVkR2FzQAJBAigHYWNjb3VudCEBFEECKANlbmQhAREhAREhAXAgAUEFKBN1bnJlZ2lzdGVyQ2FuZGlkYXRlQAFBAigGcHVia2V5IQEWIQEQIQF3IABBBSgEdm90ZUACQQIoB2FjY291bnQhARRBAigGdm90ZVRvIQEWIQEQIQF+IABAA0ECKBVDYW5kaWRhdGVTdGF0ZUNoYW5nZWRAA0ECKAZwdWJrZXkhARZBAigKcmVnaXN0ZXJlZCEBEEECKAV2b3RlcyEBEUECKARWb3RlQARBAigHYWNjb3VudCEBFEECKARmcm9tIQEWQQIoAnRvIQEWQQIoBmFtb3VudCEBEUECKBBDb21taXR0ZWVDaGFuZ2VkQAJBAigDb2xkIQEgQQIoA25ldyEBIEABQQIAAEAAKARudWxs vs QAUhAfshACgU9WPqQLwoPU0OBcSOowWz8qBzQO8o005FRjNuZW8tY29yZS12My4wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACFEEEa93tnQBBBGvd7Z0AQQRr3e2dAEEEa93tnQBBBGvd7Z0AQQRr3e2dAEEEa93tnQBBBGvd7Z0AQQRr3e2dAEEEa93tnQBBBGvd7Z0AQQRr3e2dAEEEa93tnQBBBGvd7Z0AQQRr3e2dAEEEa93tnQBBBGvd7Z0AQQRr3e2dAEEEa93tnQHvz5gNBCCgITmVvVG9rZW5AAEgAQAEoBk5FUC0xN0ECQBNBBSgJYmFsYW5jZU9mQAFBAigHYWNjb3VudCEBFCEBESEAIAFBBSgIZGVjaW1hbHNAACEBESEBByABQQUoD2dldEFjY291bnRTdGF0ZUABQQIoB2FjY291bnQhARQhASAhAQ4gAUEFKBBnZXRBbGxDYW5kaWRhdGVzQAAhATAhARUgAUEFKBBnZXRDYW5kaWRhdGVWb3RlQAFBAigGcHViS2V5IQEWIQERIQEcIAFBBSgNZ2V0Q2FuZGlkYXRlc0AAIQEgIQEjIAFBBSgMZ2V0Q29tbWl0dGVlQAAhASAhASogAUEFKA5nZXRHYXNQZXJCbG9ja0AAIQERIQExIAFBBSgWZ2V0TmV4dEJsb2NrVmFsaWRhdG9yc0AAIQEgIQE4IAFBBSgQZ2V0UmVnaXN0ZXJQcmljZUAAIQERIQE/IAFBBSgRcmVnaXN0ZXJDYW5kaWRhdGVAAUECKAZwdWJrZXkhARYhARAhAUYgAEEFKA5zZXRHYXNQZXJCbG9ja0ABQQIoC2dhc1BlckJsb2NrIQERIQL/ACEBTSAAQQUoEHNldFJlZ2lzdGVyUHJpY2VAAUECKA1yZWdpc3RlclByaWNlIQERIQL/ACEBVCAAQQUoBnN5bWJvbEAAIQETIQFbIAFBBSgLdG90YWxTdXBwbHlAACEBESEBYiABQQUoCHRyYW5zZmVyQARBAigEZnJvbSEBFEECKAJ0byEBFEECKAZhbW91bnQhARFBAigEZGF0YSEAIQEQIQFpIABBBSgMdW5jbGFpbWVkR2FzQAJBAigHYWNjb3VudCEBFEECKANlbmQhAREhAREhAXAgAUEFKBN1bnJlZ2lzdGVyQ2FuZGlkYXRlQAFBAigGcHVia2V5IQEWIQEQIQF3IABBBSgEdm90ZUACQQIoB2FjY291bnQhARRBAigGdm90ZVRvIQEWIQEQIQF+IABABEECKAhUcmFuc2ZlckADQQIoBGZyb20hARRBAigCdG8hARRBAigGYW1vdW50IQERQQIoFUNhbmRpZGF0ZVN0YXRlQ2hhbmdlZEADQQIoBnB1YmtleSEBFkECKApyZWdpc3RlcmVkIQEQQQIoBXZvdGVzIQERQQIoBFZvdGVABEECKAdhY2NvdW50IQEUQQIoBGZyb20hARZBAigCdG8hARZBAigGYW1vdW50IQERQQIoEENvbW1pdHRlZUNoYW5nZWRAAkECKANvbGQhASBBAigDbmV3IQEgQAFBAgAAQAAoBG51bGw=
block 0: value mismatch for key /////wjPduKL0AYsSkeO41VhARMZ88+k0g==:
	Contract ID: -1
	Item prefix (base64): CM924ovQBixKR47jVWEBExnzz6TS
	Item prefix (hex): 08cf76e28bd0062c4a478ee35561011319f3cfa4d2
	Item prefix (bytes): [8 207 118 226 139 208 6 44 74 71 142 227 85 97 1 19 25 243 207 164 210]
	Diff: QAUhAfohACgUz3bii9AGLEpHjuNVYQETGfPPpNIocU5FRjNuZW8tY29yZS12My4wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjEEEa93tnQBBBGvd7Z0AQQRr3e2dAEEEa93tnQBBBGvd7Z0BRQceeQQgoCEdhc1Rva2VuQABIAEABKAZORVAtMTdBAkAFQQUoCWJhbGFuY2VPZkABQQIoB2FjY291bnQhARQhAREhACABQQUoCGRlY2ltYWxzQAAhAREhAQcgAUEFKAZzeW1ib2xAACEBEyEBDiABQQUoC3RvdGFsU3VwcGx5QAAhAREhARUgAUEFKAh0cmFuc2ZlckAEQQIoBGZyb20hARRBAigCdG8hARRBAigGYW1vdW50IQERQQIoBGRhdGEhACEBECEBHCAAQABAAUECAABAACgEbnVsbA== vs QAUhAfohACgUz3bii9AGLEpHjuNVYQETGfPPpNIocU5FRjNuZW8tY29yZS12My4wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjEEEa93tnQBBBGvd7Z0AQQRr3e2dAEEEa93tnQBBBGvd7Z0BRQceeQQgoCEdhc1Rva2VuQABIAEABKAZORVAtMTdBAkAFQQUoCWJhbGFuY2VPZkABQQIoB2FjY291bnQhARQhAREhACABQQUoCGRlY2ltYWxzQAAhAREhAQcgAUEFKAZzeW1ib2xAACEBEyEBDiABQQUoC3RvdGFsU3VwcGx5QAAhAREhARUgAUEFKAh0cmFuc2ZlckAEQQIoBGZyb20hARRBAigCdG8hARRBAigGYW1vdW50IQERQQIoBGRhdGEhACEBECEBHCAAQAFBAigIVHJhbnNmZXJAA0ECKARmcm9tIQEUQQIoAnRvIQEUQQIoBmFtb3VudCEBEUABQQIAAEAAKARudWxs
file BlockStorage_0/dump-block-0.json: fail
compare-dumps dumpDirA dumpDirB
exit status 1

So there are two state differences in genesis block. Contract -1 is native Management, it stores contract states by 0x08 prefix, f563ea40bc283d4d0e05c48ea305b3f2a07340ef and cf76e28bd0062c4a478ee35561011319f3cfa4d2 are Neo and Gas token contracts hashes correspondingly, and the resulting contract states differ from NeoGo at declared events field:
image

Also, getcontractstate call to NeoC# RPC node gives us the following result (Transfer events are missing in the declaration):

anna@kiwi:~/Documents/GitProjects/nspcc-dev/neo-go$ curl -d '{ "jsonrpc": "2.0", "id": 1, "method": "getcontractstate", "params": ["0xd2a4cff31913016155e38e474a2c06d08be276cf"] }' localhost:10332 | json_pp
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1159    0  1042  100   117  11336   1272 --:--:-- --:--:-- --:--:-- 12736
{
   "id" : 1,
   "jsonrpc" : "2.0",
   "result" : {
      "hash" : "0xd2a4cff31913016155e38e474a2c06d08be276cf",
      "id" : -6,
      "manifest" : {
         "abi" : {
            "events" : [],
            "methods" : [
               {
                  "name" : "balanceOf",
                  "offset" : 0,
                  "parameters" : [
                     {
                        "name" : "account",
                        "type" : "Hash160"
                     }
                  ],
                  "returntype" : "Integer",
                  "safe" : true
               },
               {
                  "name" : "decimals",
                  "offset" : 7,
                  "parameters" : [],
                  "returntype" : "Integer",
                  "safe" : true
               },
               {
                  "name" : "symbol",
                  "offset" : 14,
                  "parameters" : [],
                  "returntype" : "String",
                  "safe" : true
               },
               {
                  "name" : "totalSupply",
                  "offset" : 21,
                  "parameters" : [],
                  "returntype" : "Integer",
                  "safe" : true
               },
               {
                  "name" : "transfer",
                  "offset" : 28,
                  "parameters" : [
                     {
                        "name" : "from",
                        "type" : "Hash160"
                     },
                     {
                        "name" : "to",
                        "type" : "Hash160"
                     },
                     {
                        "name" : "amount",
                        "type" : "Integer"
                     },
                     {
                        "name" : "data",
                        "type" : "Any"
                     }
                  ],
                  "returntype" : "Boolean",
                  "safe" : false
               }
            ]
         },
         "extra" : null,
         "features" : {},
         "groups" : [],
         "name" : "GasToken",
         "permissions" : [
            {
               "contract" : "*",
               "methods" : "*"
            }
         ],
         "supportedstandards" : [
            "NEP-17"
         ],
         "trusts" : []
      },
      "nef" : {
         "checksum" : 2663858513,
         "compiler" : "neo-core-v3.0",
         "magic" : 860243278,
         "script" : "EEEa93tnQBBBGvd7Z0AQQRr3e2dAEEEa93tnQBBBGvd7Z0A=",
         "source" : "",
         "tokens" : []
      },
      "updatecounter" : 0
   }
}

To Reproduce
Steps to reproduce the behavior:

  1. Start NeoC# node with RpcServer plugin and StatesDumper plugin;
  2. Check the state dumps of genesis block;
  3. Check the result of getcontractstate RPC call for Neo or Gas native contracts.

Expected behavior
Both Neo and Gas should have proper events declared in the manifest.

Platform:

(Optional) Additional context
This bug is critical for 3.7, we should fix it before the release.

@AnnaShaleva AnnaShaleva added the bug Used to tag confirmed bugs label Apr 11, 2024
@roman-khimov roman-khimov added this to the v3.7.0 milestone Apr 11, 2024
AnnaShaleva added a commit that referenced this issue Apr 12, 2024
Take into account event attributes declared onto the base class for
native contracts. Close #3194.

Signed-off-by: Anna Shaleva <shaleva.ann@nspcc.ru>
AnnaShaleva added a commit that referenced this issue Apr 12, 2024
Take into account event attributes declared onto the base class for
native contracts. Close #3194.

Signed-off-by: Anna Shaleva <shaleva.ann@nspcc.ru>
AnnaShaleva added a commit that referenced this issue Apr 12, 2024
Take into account event attributes declared onto the base class for
native contracts. Close #3194.

Signed-off-by: Anna Shaleva <shaleva.ann@nspcc.ru>
shargon added a commit that referenced this issue Apr 16, 2024
* SmartContract: fix native NEP-17 manifest construction

Take into account event attributes declared onto the base class for
native contracts. Close #3194.

Signed-off-by: Anna Shaleva <shaleva.ann@nspcc.ru>

* SmartContract: add UT to check native contract states

Ensure that contract states generated with all hardforks enabled match
the expected values.

Signed-off-by: Anna Shaleva <shaleva.ann@nspcc.ru>

* Update tests/Neo.UnitTests/SmartContract/Native/UT_NativeContract.cs

* Update tests/Neo.UnitTests/SmartContract/Native/UT_NativeContract.cs

---------

Signed-off-by: Anna Shaleva <shaleva.ann@nspcc.ru>
Co-authored-by: Shargon <shargon@gmail.com>
Co-authored-by: Jimmy <jinghui@wayne.edu>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Used to tag confirmed bugs
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants