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

[New] RestServer Plugin #3390

Open
wants to merge 34 commits into
base: master
Choose a base branch
from

Conversation

cschuchardt88
Copy link
Member

@cschuchardt88 cschuchardt88 commented Jul 2, 2024

Description

In this section you will learn about RestServer plugin and how it works.

Checkout the docs in ./docs/RestServer folder.

Dependencies

  • Microsoft.AspNetCore.JsonPatch.dll Required
  • Microsoft.AspNetCore.Mvc.NewtonsoftJson.dll Required
  • Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer.dll Required
  • Microsoft.AspNetCore.Mvc.Versioning.dll Required
  • Microsoft.OpenApi.dll Required
  • Newtonsoft.Json.Bson.dll Required
  • Newtonsoft.Json.dll Required
  • System.ServiceProcess.ServiceController.dll linux maybe
  • Microsoft.AspNetCore.Mvc.Versioning.dll Required
  • Microsoft.AspNetCore.Mvc.Versioning.dll Required
  • Microsoft.AspNetCore.Mvc.Versioning.dll Required
  • Microsoft.OpenApi.dll Swagger (optional)
  • Swashbuckle.AspNetCore.Swagger.dll Swagger (optional)
  • Swashbuckle.AspNetCore.SwaggerGen.dll Swagger (optional)
  • Swashbuckle.AspNetCore.SwaggerUI.dll Swagger (optional)
  • Swashbuckle.AspNetCore.Newtonsoft.dll Swagger (optional)
  • RestServer.xml Swagger UI (optional)

In Docker

RestServer
|   |   |-- Microsoft.AspNetCore.JsonPatch.dll
|   |   |-- Microsoft.AspNetCore.Mvc.NewtonsoftJson.dll
|   |   |-- Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer.dll
|   |   |-- Microsoft.AspNetCore.Mvc.Versioning.dll
|   |   |-- Microsoft.OpenApi.dll
|   |   |-- Neo.ConsoleService.dll
|   |   |-- Newtonsoft.Json.Bson.dll
|   |   |-- Newtonsoft.Json.dll
|   |   |-- RestServer.deps.json
|   |   |-- RestServer.dll
|   |   |-- RestServer.pdb
|   |   |-- RestServer.xml
|   |   |-- Swashbuckle.AspNetCore.Newtonsoft.dll
|   |   |-- Swashbuckle.AspNetCore.Swagger.dll
|   |   |-- Swashbuckle.AspNetCore.SwaggerGen.dll
|   |   |-- Swashbuckle.AspNetCore.SwaggerUI.dll
|   |   |-- System.ServiceProcess.ServiceController.dll
|   |   |-- config.json
|   |   `-- runtimes
|   |       `-- win
|   |           `-- lib
|   |               `-- net6.0
|   |                   `-- System.ServiceProcess.ServiceController.dll

These files go in the same directory as the RestServer.dll. In neo-cli
plugins/RestServer/ folder.

Response Headers

Name Value(s) Description
server neo-cli/3.6.0 RestServer/3.6.0 neo-cli and RestServer version.

JSON Serializer

RestServer uses custom Newtonsoft Json Converters to serialize controller action
responses and route parameters.

One Way Binding - Write only.

  • Neo.SmartContract.ContractState
  • Neo.SmartContract.NefFile
  • Neo.SmartContract.MethodToken
  • Neo.SmartContract.Native.TrimmedBlock
  • Neo.SmartContract.Manifest.ContractAbi
  • Neo.SmartContract.Manifest.ContractGroup
  • Neo.SmartContract.Manifest.ContractManifest
  • Neo.SmartContract.Manifest.ContractPermission
  • Neo.SmartContract.Manifest.ContractPermissionDescriptor
  • Neo.Network.P2P.Payloads.Block
  • Neo.Network.P2P.Payloads.Header
  • Neo.Network.P2P.Payloads.Signer
  • Neo.Network.P2P.Payloads.TransactionAttribute
  • Neo.Network.P2P.Payloads.Transaction
  • Neo.Network.P2P.Payloads.Witness

Two Way Binding - Read & Write

  • System.Guid
  • System.ReadOnlyMemory<T>
  • Neo.BigDecimal
  • Neo.UInt160
  • Neo.UInt256
  • Neo.Cryptography.ECC.ECPoint
  • Neo.VM.Types.Array
  • Neo.VM.Types.Boolean
  • Neo.VM.Types.Buffer
  • Neo.VM.Types.ByteString
  • Neo.VM.Types.Integer
  • Neo.VM.Types.InteropInterface
  • Neo.VM.Types.Null
  • Neo.VM.Types.Map
  • Neo.VM.Types.Pointer
  • Neo.VM.Types.StackItem
  • Neo.VM.Types.Struct

Remote Endpoints

Parametes {hash} can be any Neo N3 address or scripthash; {address} can be any Neo N3 address only; {number} and {index} can be any uint32.

Parameter Examples

  • {hash} - 0xef4073a0f2b305a38ec4050e4d3d28bc40ea63f5 or NiHURyS83nX2mpxtA7xq84cGxVbHojj5Wc
  • {address} - NiHURyS83nX2mpxtA7xq84cGxVbHojj5Wc
  • {number} - 1
  • {index} - 2500000

Paths

  • Utils
    • [GET] /api/v1/utils/{hash}/address
    • [GET] /api/v1/utils/{address}/scripthash
    • [GET] /api/v1/utils/{hash}/{address}/validate
  • Node
    • [GET] /api/v1/node/peers
    • [GET] /api/v1/node/plugins
    • [GET] /api/v1/node/settings
  • Ledger
    • [GET] /api/v1/ledger/neo/accounts
    • [GET] /api/v1/ledger/gas/accounts
    • [GET] /api/v1/ledger/blocks?page={number}&size={number}
    • [GET] /api/v1/ledger/blocks/height
    • [GET] /api/v1/ledger/blocks/{index}
    • [GET] /api/v1/ledger/blocks/{index}/header
    • [GET] /api/v1/ledger/blocks/{index}/witness
    • [GET] /api/v1/ledger/blocks/{index}/transactions?page={number}&size={number}
    • [GET] /api/v1/ledger/transactions/{hash}
    • [GET] /api/v1/ledger/transactions/{hash}/witnesses
    • [GET] /api/v1/ledger/transactions/{hash}/signers
    • [GET] /api/v1/ledger/transactions/{hash}/attributes
    • [GET] /api/v1/ledger/memorypool?page={number}&size={number}
    • [GET] /api/v1/ledger/memorypool/verified?page={number}&size={number}
    • [GET] /api/v1/ledger/memorypool/unverified?page={number}&size={number}
    • [GET] /api/v1/ledger/memorypool/count
  • Tokens
    • [GET] /api/v1/tokens/balanceof/{address}
    • NFTs
      • [GET] /api/v1/tokens/nep-11?page={number}&size={number}
      • [GET] /api/v1/tokens/nep-11/count
      • [GET] /api/v1/tokens/nep-11/{hash}/balanceof/{address}
    • NEP-17
      • [GET] /api/v1/tokens/nep-17?page={number}&size={number}
      • [GET] /api/v1/tokens/nep-17/count
      • [GET] /api/v1/tokens/nep-17/{hash}/balanceof/{address}
  • Contracts
    • [GET] /api/v1/contracts?page={number}&size={number}
    • [GET] /api/v1/contracts/count
    • [GET] /api/v1/contracts/{hash}
    • [GET] /api/v1/contracts/{hash}/abi
    • [GET] /api/v1/contracts/{hash}/manifest
    • [GET] /api/v1/contracts/{hash}/nef
    • [GET] /api/v1/contracts/{hash}/storage

image

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?

By @superboyiii from neo-project/neo-modules#839

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
Copy link
Member

superboyiii commented Jul 8, 2024

All contractstates are missing updatecounter in Contracts collections. Maybe need make result as contracts.ToJson().
6f65ec516137424101eb0bd44811430

throw new QueryParameterNotFoundException(nameof(method));
try
{
var engine = ScriptHelper.InvokeMethod(_neosystem.Settings, _neosystem.StoreView, contracts.Hash, method, contractParameters, out var script);
Copy link
Member

Choose a reason for hiding this comment

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

Need supporting signer account and scope like what invokefunction did, or methods can't pass verifywitness.

Copy link
Member Author

Choose a reason for hiding this comment

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

image

@Jim8y
Copy link
Contributor

Jim8y commented Jul 27, 2024

@cschuchardt88 conflict

@superboyiii
Copy link
Member

superboyiii commented Aug 8, 2024

ff5dbfcd28b2a52b49f4f023314bb84
result[0] of BalanceOf can be type of any.
97eeb99fd9029e21071b57bf1c27162
@cschuchardt88

@cschuchardt88
Copy link
Member Author

@superboyiii Where are we with this?

@cschuchardt88
Copy link
Member Author

cschuchardt88 commented Oct 13, 2024

@superboyiii did you test the missing features? I added the features you required. Just let me know if it good...because I limited it.

@superboyiii
Copy link
Member

I will.

@NGDAdmin
Copy link
Collaborator

NGDAdmin commented Nov 7, 2024

@cschuchardt88 Need resolve conflict

@superboyiii
Copy link
Member

superboyiii commented Nov 7, 2024

@cschuchardt88 Wallet module is missing? Still can see it in readme but I can't find it.

@cschuchardt88
Copy link
Member Author

I ended up removing it, because of security reason with pathing. Everyone had problem with that in when it was in other repo

@superboyiii
Copy link
Member

I tried to invoke transfer but it failed.
1731052464202

public static ApplicationEngine InvokeMethod(ProtocolSettings protocolSettings, DataCache snapshot, UInt160 scriptHash, string method, ContractParameter[] args, Signer[]? signers, out byte[] script)
{
using var scriptBuilder = new ScriptBuilder();
scriptBuilder.EmitDynamicCall(scriptHash, method, CallFlags.ReadOnly, args);
Copy link
Member

@superboyiii superboyiii Nov 8, 2024

Choose a reason for hiding this comment

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

You always set CallFlags as ReadOnly, this doesn't make sense. As it invokes without wallet or broadcasting any real transaction, we can make it always as CallFlags.All.

Copy link
Member Author

Choose a reason for hiding this comment

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

OK ill change that. This was written way back when i didnt know much.

@superboyiii
Copy link
Member

superboyiii commented Nov 8, 2024

Even change it to CallFlags.All. The result stack is still incorrect. It should be true, but shows false.

Rest request:

{
  "contractParameters": [
    {
      "type": "Hash160",
      "value": "0x1b8515876a42de583dcb6ed10d09b2f0ace498c0"
    },
    {
      "type": "Hash160",
      "value": "0xe7916bb3f0054ccf1c47733dd9452ffe980499ba"
    },
    {
      "type": "Integer",
      "value": "100000000"
    },
    {
      "type": "String",
      "value": null
    }
  ],
  "signers": [
    {
      "account": "0x1b8515876a42de583dcb6ed10d09b2f0ace498c0",
      "scopes": "Global",
      "allowedContracts": [],
      "allowedGroups": [],
      "rules": []
    }
  ]
}

Rest result:
c57eefc0086e53b3ed878e14d9324bb

Rpc request:

{
  "jsonrpc": "2.0",
  "method": "invokefunction",
  "params": [
    "0xd2a4cff31913016155e38e474a2c06d08be276cf",
    "transfer",
    [
      {
        "type": "Hash160",
        "value": "0x1b8515876a42de583dcb6ed10d09b2f0ace498c0"
      },
      {
        "type": "Hash160",
        "value": "0xe7916bb3f0054ccf1c47733dd9452ffe980499ba"
      },
      {
        "type": "Integer",
        "value": "100000000"
      },
      {
        "type": "String",
        "value": "test"
      }
    ],
    [
      {
        "account": "NdUL5oDPD159KeFpD5A9zw5xNF1xLX6nLT",
        "scopes": "CalledByEntry"
      }
    ],
        false
  ],
  "id": 3
}

Rpc result:
612ee8c350be886d8d061e6e0d9ce52
The same params.

@cschuchardt88
Copy link
Member Author

Even change it to CallFlags.All. The result stack is still incorrect. It should be true, but shows false.

Oops i didnt pass in transaction.

@superboyiii
Copy link
Member

@cschuchardt88 Need make result stack return correct value.

@cschuchardt88
Copy link
Member Author

Ok should be fixed now.

@superboyiii
Copy link
Member

superboyiii commented Nov 27, 2024

Ok should be fixed now.

Still NOT CORRECT
http://localhost:10339/api/v1/contracts/0xd2a4cff31913016155e38e474a2c06d08be276cf/invoke?method=transfer

{
  "contractParameters": [
    {
      "type": "Hash160",
      "value": "0x1b8515876a42de583dcb6ed10d09b2f0ace498c0"
    },
    {
      "type": "Hash160",
      "value": "0x1b8515876a42de583dcb6ed10d09b2f0ace498c0"
    },
    {
      "type": "Integer",
      "value": "100000000"
    },
    {
      "type": "String",
      "value": null
    }
  ],
  "signers": [
    {
      "account": "0x1b8515876a42de583dcb6ed10d09b2f0ace498c0",
      "scopes": "CalledByEntry",
      "allowedContracts": [],
      "allowedGroups": [],
      "rules": []
    }
  ]
}

860088a05ec97e4aed29f1c8778b1ac

@cschuchardt88
Copy link
Member Author

cschuchardt88 commented Nov 27, 2024

@superboyiii
image
works for me. You sure that account has 1.00000000 gas? On testnet it has enough. but on mainnet there isnt enough.

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.

4 participants