Skip to content

Conversation

shargon
Copy link
Member

@shargon shargon commented Jul 2, 2025

Description

Implement NEP-25 neo-project/proposals#160 (review)
Replace of #3272

Type of change

  • Optimization (the change is only an optimization)
  • Style (the change is only a code style for better maintenance or standard purpose)
  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • This change requires a documentation update

How Has This Been Tested?

  • Test A
  • Test B

Test Configuration:

Checklist:

  • My code follows the style guidelines of this project
  • I have performed a self-review of my code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published in downstream modules

@superboyiii superboyiii mentioned this pull request Jul 24, 2025
@shargon shargon marked this pull request as ready for review July 30, 2025 09:15
ajara87
ajara87 previously approved these changes Jul 31, 2025
shargon and others added 5 commits August 3, 2025 11:53
- Document all implemented features and components
- Add usage examples for different type definitions
- Confirm backward compatibility with NEP-14
- Mark implementation as complete and tested
- Update FromStackItem_ShouldHandleNullFields test to include all 8 fields
- Update ToStackItem_ShouldProduceNullFields test to expect 8 fields
- Tests now match the actual ExtendedType implementation which uses 8 fields
@shargon
Copy link
Member Author

shargon commented Sep 8, 2025

@neo-project/core ready to review again

@shargon
Copy link
Member Author

shargon commented Sep 16, 2025

Ping @neo-project/core

cschuchardt88
cschuchardt88 previously approved these changes Sep 17, 2025
Copy link
Member

@cschuchardt88 cschuchardt88 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, your style is getting 💯 times better 👍 . Good call on RestServer.

@shargon
Copy link
Member Author

shargon commented Sep 18, 2025

Copy link
Contributor

@roman-khimov roman-khimov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing semantic checks is still the main problem.

if (ExtendedReturnType != null)
{
item.Add(ExtendedReturnType.ToStackItem(referenceCounter));
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like a bit inconsistent encoding, we add NULL stackitem for missing NamedTypes, but do not add it for missing ExtendedReturnType. Should work both ways, but I'd prefer some unified approach to new fields. Same thing with other types.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's solved now


internal StackItem ToStackItem(IReferenceCounter referenceCounter, Struct array)
{
array.Add((byte)Type);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you think of using map type for stack item encoding? Array-based encoding always requires 8 elements, but in practice the most typical number of active elements is 2 (type+smth), more rarely 3, in a map that'd be 4-6 stack items. I'm a little concerned about big manifests (like in #3802).

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

var startIndex = 0;
Type = (ContractParameterType)(byte)array[startIndex++].GetInteger();
if (!Enum.IsDefined(typeof(ContractParameterType), Type)) throw new FormatException("Incorrect Type");
if (Type == ContractParameterType.Void) throw new FormatException("Void Type is not allowed in NEP-25");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NEP-25 technically doesn't forbid that, the type can be used as method return type. In which case ExtendedType is useless as it can't contain any other data but the same type, but still valid.

if (!Enum.IsDefined(typeof(ContractParameterType), Type)) throw new FormatException();
NamedType = array[startIndex++].GetString();

if (array[startIndex++] is Integer length)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Optional, but what if array[startIndex++] is a map, for example?

{
Fields = null;
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The question is more about semantic checks, almost all fields are optional, but not all combinations of fields are valid. This is described in NEP-25 and both deserialization methods should check for it.

@superboyiii
Copy link
Member

superboyiii commented Sep 19, 2025

Need a hardfork. So many incompatible data are there. Compared full mainnet node sync with #4167 and #4043, here's the result.
b1808e77-62a9-421c-a53c-5bcb9939a6cf
One example on block 124997:
#4043

        {
            "id": -1,
            "state": "Added",
            "key": "/////wjlVEyOhJwxayqxHd7JYpHT91F6Vw==",
            "value": "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Y291bnQhARRBAigEbWV0YSEBEkECKA1sb2NrZWRDb250ZW50IQESQQIoCXJveWFsdGllcyEBEkECKARkYXRhIQAhARIhArMCIABBBSgMZ2V0Um95YWx0aWVzQAFBAigHdG9rZW5JZCEBEiEBEiECzgIgAEEFKAt3aXRoZHJhd0ZlZUABQQIoB2FjY291bnQhARQhARAhAtoCIABBBSgNZ2V0RmVlQmFsYW5jZUAAIQAhAmADIABBBSgKZ2V0TWludEZlZUAAIQERIQKUAyAAQQUoCnNldE1pbnRGZWVAAUECKANmZWUhAREhAv8AIQKfAyAAQQUoGWdldExvY2tlZENvbnRlbnRWaWV3Q291bnRAAUECKAd0b2tlbklkIQESIQERIQLMAyAAQQUoEGdldExvY2tlZENvbnRlbnRAAUECKAd0b2tlbklkIQESIQESIQLWAyAAQQUoFHNldEF1dGhvcml6ZWRBZGRyZXNzQAJBAigHYWRkcmVzcyEBFEECKAphdXRob3JpemVkIQEQIQL/ACECGQQgAEEFKBVzZXRXaGl0ZWxpc3RlZEFkZHJlc3NAAkECKAdhZGRyZXNzIQEUQQIoCmF1dGhvcml6ZWQhARAhAv8AIQJYBSAAQQUoC3VwZGF0ZVBhdXNlQAFBAigGc3RhdHVzIQEQIQEQIQKXBiAAQQUoBnZlcmlmeUAAIQEQIQLABiAAQQUoDWlzV2hpdGVsaXN0ZWRAACEBECECLwcgAEEFKAhpc1BhdXNlZEAAIQEQIQKeByAAQQUoBnVwZGF0ZUACQQIoBnNjcmlwdCEBEkECKAhtYW5pZmVzdCEBEiEC/wAhAroHIABBBSgHZGVzdHJveUAAIQL/ACEC8AcgAEEFKAtfaW5pdGlhbGl6ZUAAIQL/ACECuAwgAEAGQQIoCFRyYW5zZmVyQARBAigJZnJvbV9hZGRyIQBBAigHdG9fYWRkciEAQQIoBmFtb3VudCEBEUECKAd0b2tlbklkIQESQQIoBm5vdGlmeUABQQIoBXN0YXRlIQBBAigKQXV0aG9yaXplZEADQQIoCmF1dGhvcml6ZWQhARRBAigEdHlwZSEBEUECKANhZGQhARBBAigQTWludEZlZVdpdGhkcmF3bkACQQIoCWZyb21fYWRkciEBFEECKAV2YWx1ZSEBEUECKA5NaW50RmVlVXBkYXRlZEACQQIoCWZyb21fYWRkciEBFEECKAV2YWx1ZSEBEUECKBFVbmxvY2tJbmNyZW1lbnRlZEACQQIoB3Rva2VuSWQhARJBAigHY291bnRlciEBEQBAAUECAABAAChxeyJBdXRob3IiOiJNYXRoaWFzIEVuemVuc2JlcmdlciwgVmluY2VudCBHZW5lc3RlIiwiRW1haWwiOiJoZWxsb0BnaG9zdG1hcmtldC5pbyIsIkRlc2NyaXB0aW9uIjoiR2hvc3RNYXJrZXQgTkZUIn0="
        }

#4167

        {
            "id": -1,
            "state": "Added",
            "key": "/////wjlVEyOhJwxayqxHd7JYpHT91F6Vw==",
            "value": "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Y291bnQhARRBAigEbWV0YSEBEkECKA1sb2NrZWRDb250ZW50IQESQQIoCXJveWFsdGllcyEBEkECKARkYXRhIQAhARIhArMCIABBBSgMZ2V0Um95YWx0aWVzQAFBAigHdG9rZW5JZCEBEiEBEiECzgIgAEEFKAt3aXRoZHJhd0ZlZUABQQIoB2FjY291bnQhARQhARAhAtoCIABBBSgNZ2V0RmVlQmFsYW5jZUAAIQAhAmADIABBBSgKZ2V0TWludEZlZUAAIQERIQKUAyAAQQUoCnNldE1pbnRGZWVAAUECKANmZWUhAREhAv8AIQKfAyAAQQUoGWdldExvY2tlZENvbnRlbnRWaWV3Q291bnRAAUECKAd0b2tlbklkIQESIQERIQLMAyAAQQUoEGdldExvY2tlZENvbnRlbnRAAUECKAd0b2tlbklkIQESIQESIQLWAyAAQQUoFHNldEF1dGhvcml6ZWRBZGRyZXNzQAJBAigHYWRkcmVzcyEBFEECKAphdXRob3JpemVkIQEQIQL/ACECGQQgAEEFKBVzZXRXaGl0ZWxpc3RlZEFkZHJlc3NAAkECKAdhZGRyZXNzIQEUQQIoCmF1dGhvcml6ZWQhARAhAv8AIQJYBSAAQQUoC3VwZGF0ZVBhdXNlQAFBAigGc3RhdHVzIQEQIQEQIQKXBiAAQQUoBnZlcmlmeUAAIQEQIQLABiAAQQUoDWlzV2hpdGVsaXN0ZWRAACEBECECLwcgAEEFKAhpc1BhdXNlZEAAIQEQIQKeByAAQQUoBnVwZGF0ZUACQQIoBnNjcmlwdCEBEkECKAhtYW5pZmVzdCEBEiEC/wAhAroHIABBBSgHZGVzdHJveUAAIQL/ACEC8AcgAEEFKAtfaW5pdGlhbGl6ZUAAIQL/ACECuAwgAEAGQQIoCFRyYW5zZmVyQARBAigJZnJvbV9hZGRyIQBBAigHdG9fYWRkciEAQQIoBmFtb3VudCEBEUECKAd0b2tlbklkIQESQQIoBm5vdGlmeUABQQIoBXN0YXRlIQBBAigKQXV0aG9yaXplZEADQQIoCmF1dGhvcml6ZWQhARRBAigEdHlwZSEBEUECKANhZGQhARBBAigQTWludEZlZVdpdGhkcmF3bkACQQIoCWZyb21fYWRkciEBFEECKAV2YWx1ZSEBEUECKA5NaW50RmVlVXBkYXRlZEACQQIoCWZyb21fYWRkciEBFEECKAV2YWx1ZSEBEUECKBFVbmxvY2tJbmNyZW1lbnRlZEACQQIoB3Rva2VuSWQhARJBAigHY291bnRlciEBEUABQQIAAEAAKHF7IkF1dGhvciI6Ik1hdGhpYXMgRW56ZW5zYmVyZ2VyLCBWaW5jZW50IEdlbmVzdGUiLCJFbWFpbCI6ImhlbGxvQGdob3N0bWFya2V0LmlvIiwiRGVzY3JpcHRpb24iOiJHaG9zdE1hcmtldCBORlQifQ=="
        }

@roman-khimov
Copy link
Contributor

I think that's related to #4043 (comment), if we're to not encode missing fields at all stack item representation will be the same for old (NEP-14) manifests.

This was referenced Oct 3, 2025
@shargon
Copy link
Member Author

shargon commented Oct 3, 2025

Optional, but what if array[startIndex++] is a map, for example?

Done

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants