diff --git a/src/neo/NeoSystem.cs b/src/neo/NeoSystem.cs index e9e8335bb4..b837426d45 100644 --- a/src/neo/NeoSystem.cs +++ b/src/neo/NeoSystem.cs @@ -2,12 +2,10 @@ using Neo.Consensus; using Neo.Ledger; using Neo.Network.P2P; -using Neo.Network.RPC; using Neo.Persistence; using Neo.Plugins; using Neo.Wallets; using System; -using System.Net; namespace Neo { @@ -24,7 +22,6 @@ public class NeoSystem : IDisposable public IActorRef LocalNode { get; } internal IActorRef TaskManager { get; } public IActorRef Consensus { get; private set; } - public RpcServer RpcServer { get; private set; } private readonly IStore store; private ChannelsConfig start_message = null; @@ -47,7 +44,6 @@ public void Dispose() { foreach (var p in Plugin.Plugins) p.Dispose(); - RpcServer?.Dispose(); EnsureStoped(LocalNode); // Dispose will call ActorSystem.Terminate() ActorSystem.Dispose(); @@ -90,13 +86,6 @@ public void StartNode(ChannelsConfig config) } } - public void StartRpc(IPAddress bindAddress, int port, Wallet wallet = null, string sslCert = null, string password = null, - string[] trustedAuthorities = null, long maxGasInvoke = default) - { - RpcServer = new RpcServer(this, wallet, maxGasInvoke); - RpcServer.Start(bindAddress, port, sslCert, password, trustedAuthorities); - } - internal void SuspendNodeStartup() { suspend = true; diff --git a/src/neo/Network/RPC/ContractClient.cs b/src/neo/Network/RPC/ContractClient.cs deleted file mode 100644 index 45fb31d267..0000000000 --- a/src/neo/Network/RPC/ContractClient.cs +++ /dev/null @@ -1,66 +0,0 @@ -using Neo.Network.P2P.Payloads; -using Neo.Network.RPC.Models; -using Neo.SmartContract; -using Neo.SmartContract.Manifest; -using Neo.VM; -using Neo.Wallets; - -namespace Neo.Network.RPC -{ - /// - /// Contract related operations through RPC API - /// - public class ContractClient - { - protected readonly RpcClient rpcClient; - - /// - /// ContractClient Constructor - /// - /// the RPC client to call NEO RPC methods - public ContractClient(RpcClient rpc) - { - rpcClient = rpc; - } - - /// - /// Use RPC method to test invoke operation. - /// - /// contract script hash - /// contract operation - /// operation arguments - /// - public RpcInvokeResult TestInvoke(UInt160 scriptHash, string operation, params object[] args) - { - byte[] script = scriptHash.MakeScript(operation, args); - return rpcClient.InvokeScript(script); - } - - /// - /// Deploy Contract, return signed transaction - /// - /// contract script - /// contract manifest - /// sender KeyPair - /// transaction NetworkFee, set to be 0 if you don't need higher priority - /// - public Transaction CreateDeployContractTx(byte[] contractScript, ContractManifest manifest, KeyPair key, long networkFee = 0) - { - byte[] script; - using (ScriptBuilder sb = new ScriptBuilder()) - { - sb.EmitSysCall(InteropService.Neo_Contract_Create, contractScript, manifest.ToString()); - script = sb.ToArray(); - } - - UInt160 sender = Contract.CreateSignatureRedeemScript(key.PublicKey).ToScriptHash(); - Transaction tx = new TransactionManager(rpcClient, sender) - .MakeTransaction(script, null, null, networkFee) - .AddSignature(key) - .Sign() - .Tx; - - return tx; - } - } -} diff --git a/src/neo/Network/RPC/Helper.cs b/src/neo/Network/RPC/Helper.cs deleted file mode 100644 index 5c5c82e329..0000000000 --- a/src/neo/Network/RPC/Helper.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Numerics; - -namespace Neo.Network.RPC -{ - internal static class Helper - { - /// - /// Convert decimal amount to BigInteger: amount * 10 ^ decimals - /// - /// float value - /// token decimals - /// - public static BigInteger ToBigInteger(this decimal amount, uint decimals) - { - BigInteger factor = BigInteger.Pow(10, (int)decimals); - var (numerator, denominator) = Fraction(amount); - if (factor < denominator) - { - throw new OverflowException("The decimal places is too long."); - } - - BigInteger res = factor * numerator / denominator; - return res; - } - - private static (BigInteger numerator, BigInteger denominator) Fraction(decimal d) - { - int[] bits = decimal.GetBits(d); - BigInteger numerator = (1 - ((bits[3] >> 30) & 2)) * - unchecked(((BigInteger)(uint)bits[2] << 64) | - ((BigInteger)(uint)bits[1] << 32) | - (uint)bits[0]); - BigInteger denominator = BigInteger.Pow(10, (bits[3] >> 16) & 0xff); - return (numerator, denominator); - } - } -} diff --git a/src/neo/Network/RPC/Models/RpcBlock.cs b/src/neo/Network/RPC/Models/RpcBlock.cs deleted file mode 100644 index 1ff485f96e..0000000000 --- a/src/neo/Network/RPC/Models/RpcBlock.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Neo.IO.Json; -using Neo.Network.P2P.Payloads; - -namespace Neo.Network.RPC.Models -{ - public class RpcBlock - { - public Block Block { get; set; } - - public int Confirmations { get; set; } - - public UInt256 NextBlockHash { get; set; } - - public JObject ToJson() - { - JObject json = Block.ToJson(); - json["confirmations"] = Confirmations; - if (NextBlockHash != null) - { - json["nextblockhash"] = NextBlockHash.ToString(); - } - return json; - } - - public static RpcBlock FromJson(JObject json) - { - RpcBlock block = new RpcBlock(); - block.Block = Block.FromJson(json); - block.Confirmations = (int)json["confirmations"].AsNumber(); - if (json["nextblockhash"] != null) - { - block.NextBlockHash = UInt256.Parse(json["nextblockhash"].AsString()); - } - return block; - } - } -} diff --git a/src/neo/Network/RPC/Models/RpcBlockHeader.cs b/src/neo/Network/RPC/Models/RpcBlockHeader.cs deleted file mode 100644 index 5346dffd91..0000000000 --- a/src/neo/Network/RPC/Models/RpcBlockHeader.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Neo.IO.Json; -using Neo.Network.P2P.Payloads; - -namespace Neo.Network.RPC.Models -{ - public class RpcBlockHeader - { - public Header Header { get; set; } - - public int Confirmations { get; set; } - - public UInt256 NextBlockHash { get; set; } - - public JObject ToJson() - { - JObject json = Header.ToJson(); - json["confirmations"] = Confirmations; - if (NextBlockHash != null) - { - json["nextblockhash"] = NextBlockHash.ToString(); - } - return json; - } - - public static RpcBlockHeader FromJson(JObject json) - { - RpcBlockHeader block = new RpcBlockHeader(); - block.Header = Header.FromJson(json); - block.Confirmations = (int)json["confirmations"].AsNumber(); - if (json["nextblockhash"] != null) - { - block.NextBlockHash = UInt256.Parse(json["nextblockhash"].AsString()); - } - return block; - } - } -} diff --git a/src/neo/Network/RPC/Models/RpcInvokeResult.cs b/src/neo/Network/RPC/Models/RpcInvokeResult.cs deleted file mode 100644 index a9c5f04c48..0000000000 --- a/src/neo/Network/RPC/Models/RpcInvokeResult.cs +++ /dev/null @@ -1,60 +0,0 @@ -using Neo.IO.Json; -using Neo.SmartContract; -using System.Linq; - -namespace Neo.Network.RPC.Models -{ - public class RpcInvokeResult - { - public string Script { get; set; } - - public string State { get; set; } - - public string GasConsumed { get; set; } - - public ContractParameter[] Stack { get; set; } - - public JObject ToJson() - { - JObject json = new JObject(); - json["script"] = Script; - json["state"] = State; - json["gas_consumed"] = GasConsumed; - json["stack"] = new JArray(Stack.Select(p => p.ToJson())); - return json; - } - - public static RpcInvokeResult FromJson(JObject json) - { - RpcInvokeResult invokeScriptResult = new RpcInvokeResult(); - invokeScriptResult.Script = json["script"].AsString(); - invokeScriptResult.State = json["state"].AsString(); - invokeScriptResult.GasConsumed = json["gas_consumed"].AsString(); - invokeScriptResult.Stack = ((JArray)json["stack"]).Select(p => ContractParameter.FromJson(p)).ToArray(); - return invokeScriptResult; - } - } - - public class RpcStack - { - public string Type { get; set; } - - public string Value { get; set; } - - public JObject ToJson() - { - JObject json = new JObject(); - json["type"] = Type; - json["value"] = Value; - return json; - } - - public static RpcStack FromJson(JObject json) - { - RpcStack stackJson = new RpcStack(); - stackJson.Type = json["type"].AsString(); - stackJson.Value = json["value"].AsString(); - return stackJson; - } - } -} diff --git a/src/neo/Network/RPC/Models/RpcNep5Balances.cs b/src/neo/Network/RPC/Models/RpcNep5Balances.cs deleted file mode 100644 index 74fe7be729..0000000000 --- a/src/neo/Network/RPC/Models/RpcNep5Balances.cs +++ /dev/null @@ -1,57 +0,0 @@ -using Neo.IO.Json; -using System.Linq; -using System.Numerics; - -namespace Neo.Network.RPC.Models -{ - public class RpcNep5Balances - { - public string Address { get; set; } - - public RpcNep5Balance[] Balances { get; set; } - - public JObject ToJson() - { - JObject json = new JObject(); - json["address"] = Address; - json["balance"] = Balances.Select(p => p.ToJson()).ToArray(); - return json; - } - - public static RpcNep5Balances FromJson(JObject json) - { - RpcNep5Balances nep5Balance = new RpcNep5Balances(); - nep5Balance.Address = json["address"].AsString(); - //List listBalance = new List(); - nep5Balance.Balances = ((JArray)json["balance"]).Select(p => RpcNep5Balance.FromJson(p)).ToArray(); - return nep5Balance; - } - } - - public class RpcNep5Balance - { - public UInt160 AssetHash { get; set; } - - public BigInteger Amount { get; set; } - - public uint LastUpdatedBlock { get; set; } - - public JObject ToJson() - { - JObject json = new JObject(); - json["asset_hash"] = AssetHash.ToString(); - json["amount"] = Amount.ToString(); - json["last_updated_block"] = LastUpdatedBlock.ToString(); - return json; - } - - public static RpcNep5Balance FromJson(JObject json) - { - RpcNep5Balance balance = new RpcNep5Balance(); - balance.AssetHash = UInt160.Parse(json["asset_hash"].AsString()); - balance.Amount = BigInteger.Parse(json["amount"].AsString()); - balance.LastUpdatedBlock = uint.Parse(json["last_updated_block"].AsString()); - return balance; - } - } -} diff --git a/src/neo/Network/RPC/Models/RpcNep5TokenInfo.cs b/src/neo/Network/RPC/Models/RpcNep5TokenInfo.cs deleted file mode 100644 index 0f251a5a37..0000000000 --- a/src/neo/Network/RPC/Models/RpcNep5TokenInfo.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Numerics; - -namespace Neo.Network.RPC.Models -{ - public class RpcNep5TokenInfo - { - public string Name { get; set; } - - public string Symbol { get; set; } - - public uint Decimals { get; set; } - - public BigInteger TotalSupply { get; set; } - } -} diff --git a/src/neo/Network/RPC/Models/RpcPeers.cs b/src/neo/Network/RPC/Models/RpcPeers.cs deleted file mode 100644 index fac73842de..0000000000 --- a/src/neo/Network/RPC/Models/RpcPeers.cs +++ /dev/null @@ -1,55 +0,0 @@ -using Neo.IO.Json; -using System.Linq; - -namespace Neo.Network.RPC.Models -{ - public class RpcPeers - { - public RpcPeer[] Unconnected { get; set; } - - public RpcPeer[] Bad { get; set; } - - public RpcPeer[] Connected { get; set; } - - public JObject ToJson() - { - JObject json = new JObject(); - json["unconnected"] = new JArray(Unconnected.Select(p => p.ToJson())); - json["bad"] = new JArray(Bad.Select(p => p.ToJson())); - json["connected"] = new JArray(Connected.Select(p => p.ToJson())); - return json; - } - - public static RpcPeers FromJson(JObject json) - { - RpcPeers result = new RpcPeers(); - result.Unconnected = ((JArray)json["unconnected"]).Select(p => RpcPeer.FromJson(p)).ToArray(); - result.Bad = ((JArray)json["bad"]).Select(p => RpcPeer.FromJson(p)).ToArray(); - result.Connected = ((JArray)json["connected"]).Select(p => RpcPeer.FromJson(p)).ToArray(); - return result; - } - } - - public class RpcPeer - { - public string Address { get; set; } - - public int Port { get; set; } - - public JObject ToJson() - { - JObject json = new JObject(); - json["address"] = Address; - json["port"] = Port; - return json; - } - - public static RpcPeer FromJson(JObject json) - { - RpcPeer peer = new RpcPeer(); - peer.Address = json["address"].AsString(); - peer.Port = int.Parse(json["port"].AsString()); - return peer; - } - } -} diff --git a/src/neo/Network/RPC/Models/RpcPlugin.cs b/src/neo/Network/RPC/Models/RpcPlugin.cs deleted file mode 100644 index db03f70eb3..0000000000 --- a/src/neo/Network/RPC/Models/RpcPlugin.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Neo.IO.Json; -using System.Linq; - -namespace Neo.Network.RPC.Models -{ - public class RpcPlugin - { - public string Name { get; set; } - - public string Version { get; set; } - - public string[] Interfaces { get; set; } - - public JObject ToJson() - { - JObject json = new JObject(); - json["name"] = Name; - json["version"] = Version; - json["interfaces"] = new JArray(Interfaces.Select(p => (JObject)p)); - return json; - } - - public static RpcPlugin FromJson(JObject json) - { - RpcPlugin plugin = new RpcPlugin(); - plugin.Name = json["name"].AsString(); - plugin.Version = json["version"].AsString(); - plugin.Interfaces = ((JArray)json["interfaces"]).Select(p => p.AsString()).ToArray(); - return plugin; - } - } -} diff --git a/src/neo/Network/RPC/Models/RpcRawMemPool.cs b/src/neo/Network/RPC/Models/RpcRawMemPool.cs deleted file mode 100644 index c5ebd63419..0000000000 --- a/src/neo/Network/RPC/Models/RpcRawMemPool.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Neo.IO.Json; -using System.Linq; - -namespace Neo.Network.RPC.Models -{ - public class RpcRawMemPool - { - public uint Height { get; set; } - - public string[] Verified { get; set; } - - public string[] UnVerified { get; set; } - - public JObject ToJson() - { - JObject json = new JObject(); - json["height"] = Height; - json["verified"] = new JArray(Verified.Select(p => (JObject)p)); - json["unverified"] = new JArray(UnVerified.Select(p => (JObject)p)); - return json; - } - - public static RpcRawMemPool FromJson(JObject json) - { - RpcRawMemPool rawMemPool = new RpcRawMemPool(); - rawMemPool.Height = uint.Parse(json["height"].AsString()); - rawMemPool.Verified = ((JArray)json["verified"]).Select(p => p.AsString()).ToArray(); - rawMemPool.UnVerified = ((JArray)json["unverified"]).Select(p => p.AsString()).ToArray(); - return rawMemPool; - } - } -} diff --git a/src/neo/Network/RPC/Models/RpcRequest.cs b/src/neo/Network/RPC/Models/RpcRequest.cs deleted file mode 100644 index 1970adedbf..0000000000 --- a/src/neo/Network/RPC/Models/RpcRequest.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Neo.IO.Json; -using System.Linq; - -namespace Neo.Network.RPC.Models -{ - public class RpcRequest - { - public int Id { get; set; } - - public string Jsonrpc { get; set; } - - public string Method { get; set; } - - public JObject[] Params { get; set; } - - public static RpcRequest FromJson(JObject json) - { - return new RpcRequest - { - Id = (int)json["id"].AsNumber(), - Jsonrpc = json["jsonrpc"].AsString(), - Method = json["method"].AsString(), - Params = ((JArray)json["params"]).ToArray() - }; - } - - public JObject ToJson() - { - var json = new JObject(); - json["id"] = Id; - json["jsonrpc"] = Jsonrpc; - json["method"] = Method; - json["params"] = new JArray(Params); - return json; - } - } -} diff --git a/src/neo/Network/RPC/Models/RpcResponse.cs b/src/neo/Network/RPC/Models/RpcResponse.cs deleted file mode 100644 index e4ebcaed1b..0000000000 --- a/src/neo/Network/RPC/Models/RpcResponse.cs +++ /dev/null @@ -1,72 +0,0 @@ -using Neo.IO.Json; - -namespace Neo.Network.RPC.Models -{ - public class RpcResponse - { - public int? Id { get; set; } - - public string Jsonrpc { get; set; } - - public RpcResponseError Error { get; set; } - - public JObject Result { get; set; } - - public string RawResponse { get; set; } - - public static RpcResponse FromJson(JObject json) - { - var response = new RpcResponse - { - Id = (int?)json["id"]?.AsNumber(), - Jsonrpc = json["jsonrpc"].AsString(), - Result = json["result"] - }; - - if (json["error"] != null) - { - response.Error = RpcResponseError.FromJson(json["error"]); - } - - return response; - } - - public JObject ToJson() - { - var json = new JObject(); - json["id"] = Id; - json["jsonrpc"] = Jsonrpc; - json["error"] = Error.ToJson(); - json["result"] = Result; - return json; - } - } - - public class RpcResponseError - { - public int Code { get; set; } - - public string Message { get; set; } - - public JObject Data { get; set; } - - public static RpcResponseError FromJson(JObject json) - { - return new RpcResponseError - { - Code = (int)json["code"].AsNumber(), - Message = json["message"].AsString(), - Data = json["data"], - }; - } - - public JObject ToJson() - { - var json = new JObject(); - json["code"] = Code; - json["message"] = Message; - json["data"] = Data; - return json; - } - } -} diff --git a/src/neo/Network/RPC/Models/RpcTransaction.cs b/src/neo/Network/RPC/Models/RpcTransaction.cs deleted file mode 100644 index 48b1e19bd4..0000000000 --- a/src/neo/Network/RPC/Models/RpcTransaction.cs +++ /dev/null @@ -1,49 +0,0 @@ -using Neo.IO.Json; -using Neo.Network.P2P.Payloads; -using Neo.VM; - -namespace Neo.Network.RPC.Models -{ - public class RpcTransaction - { - public Transaction Transaction { get; set; } - - public UInt256 BlockHash { get; set; } - - public int? Confirmations { get; set; } - - public uint? BlockTime { get; set; } - - public VMState? VMState { get; set; } - - public JObject ToJson() - { - JObject json = Transaction.ToJson(); - if (Confirmations != null) - { - json["blockhash"] = BlockHash.ToString(); - json["confirmations"] = Confirmations; - json["blocktime"] = BlockTime; - if (VMState != null) - { - json["vmState"] = VMState; - } - } - return json; - } - - public static RpcTransaction FromJson(JObject json) - { - RpcTransaction transaction = new RpcTransaction(); - transaction.Transaction = Transaction.FromJson(json); - if (json["confirmations"] != null) - { - transaction.BlockHash = UInt256.Parse(json["blockhash"].AsString()); - transaction.Confirmations = (int)json["confirmations"].AsNumber(); - transaction.BlockTime = (uint)json["blocktime"].AsNumber(); - transaction.VMState = json["vmState"]?.TryGetEnum(); - } - return transaction; - } - } -} diff --git a/src/neo/Network/RPC/Models/RpcValidateAddressResult.cs b/src/neo/Network/RPC/Models/RpcValidateAddressResult.cs deleted file mode 100644 index 5e0a704797..0000000000 --- a/src/neo/Network/RPC/Models/RpcValidateAddressResult.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Neo.IO.Json; - -namespace Neo.Network.RPC.Models -{ - public class RpcValidateAddressResult - { - public string Address { get; set; } - - public bool IsValid { get; set; } - - public JObject ToJson() - { - JObject json = new JObject(); - json["address"] = Address; - json["isvalid"] = IsValid; - return json; - } - - public static RpcValidateAddressResult FromJson(JObject json) - { - RpcValidateAddressResult validateAddress = new RpcValidateAddressResult(); - validateAddress.Address = json["address"].AsString(); - validateAddress.IsValid = json["isvalid"].AsBoolean(); - return validateAddress; - } - } -} diff --git a/src/neo/Network/RPC/Models/RpcValidator.cs b/src/neo/Network/RPC/Models/RpcValidator.cs deleted file mode 100644 index f3116ed2e4..0000000000 --- a/src/neo/Network/RPC/Models/RpcValidator.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Neo.IO.Json; -using System.Numerics; - -namespace Neo.Network.RPC.Models -{ - public class RpcValidator - { - public string PublicKey { get; set; } - - public BigInteger Votes { get; set; } - - public bool Active { get; set; } - - public JObject ToJson() - { - JObject json = new JObject(); - json["publickey"] = PublicKey; - json["votes"] = Votes.ToString(); - json["active"] = Active; - return json; - } - - public static RpcValidator FromJson(JObject json) - { - RpcValidator validator = new RpcValidator(); - validator.PublicKey = json["publickey"].AsString(); - validator.Votes = BigInteger.Parse(json["votes"].AsString()); - validator.Active = json["active"].AsBoolean(); - return validator; - } - } -} diff --git a/src/neo/Network/RPC/Models/RpcVersion.cs b/src/neo/Network/RPC/Models/RpcVersion.cs deleted file mode 100644 index 8163875b64..0000000000 --- a/src/neo/Network/RPC/Models/RpcVersion.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Neo.IO.Json; - -namespace Neo.Network.RPC.Models -{ - public class RpcVersion - { - public int TcpPort { get; set; } - - public int WsPort { get; set; } - - public uint Nonce { get; set; } - - public string UserAgent { get; set; } - - public JObject ToJson() - { - JObject json = new JObject(); - json["topPort"] = TcpPort.ToString(); - json["wsPort"] = WsPort.ToString(); - json["nonce"] = Nonce.ToString(); - json["useragent"] = UserAgent; - return json; - } - - public static RpcVersion FromJson(JObject json) - { - RpcVersion version = new RpcVersion(); - version.TcpPort = int.Parse(json["tcpPort"].AsString()); - version.WsPort = int.Parse(json["wsPort"].AsString()); - version.Nonce = uint.Parse(json["nonce"].AsString()); - version.UserAgent = json["useragent"].AsString(); - return version; - } - } -} diff --git a/src/neo/Network/RPC/Nep5API.cs b/src/neo/Network/RPC/Nep5API.cs deleted file mode 100644 index 619c755280..0000000000 --- a/src/neo/Network/RPC/Nep5API.cs +++ /dev/null @@ -1,122 +0,0 @@ -using Neo.Network.P2P.Payloads; -using Neo.Network.RPC.Models; -using Neo.SmartContract; -using Neo.VM; -using Neo.Wallets; -using System.Linq; -using System.Numerics; -using static Neo.Helper; - -namespace Neo.Network.RPC -{ - /// - /// Call NEP5 methods with RPC API - /// - public class Nep5API : ContractClient - { - /// - /// Nep5API Constructor - /// - /// the RPC client to call NEO RPC methods - public Nep5API(RpcClient rpcClient) : base(rpcClient) { } - - /// - /// Get balance of NEP5 token - /// - /// contract script hash - /// account script hash - /// - public BigInteger BalanceOf(UInt160 scriptHash, UInt160 account) - { - BigInteger balance = TestInvoke(scriptHash, "balanceOf", account).Stack.Single().ToStackItem().GetBigInteger(); - return balance; - } - - /// - /// Get name of NEP5 token - /// - /// contract script hash - /// - public string Name(UInt160 scriptHash) - { - return TestInvoke(scriptHash, "name").Stack.Single().ToStackItem().GetString(); - } - - /// - /// Get symbol of NEP5 token - /// - /// contract script hash - /// - public string Symbol(UInt160 scriptHash) - { - return TestInvoke(scriptHash, "symbol").Stack.Single().ToStackItem().GetString(); - } - - /// - /// Get decimals of NEP5 token - /// - /// contract script hash - /// - public uint Decimals(UInt160 scriptHash) - { - return (uint)TestInvoke(scriptHash, "decimals").Stack.Single().ToStackItem().GetBigInteger(); - } - - /// - /// Get total supply of NEP5 token - /// - /// contract script hash - /// - public BigInteger TotalSupply(UInt160 scriptHash) - { - return TestInvoke(scriptHash, "totalSupply").Stack.Single().ToStackItem().GetBigInteger(); - } - - /// - /// Get token information in one rpc call - /// - /// contract script hash - /// - public RpcNep5TokenInfo GetTokenInfo(UInt160 scriptHash) - { - byte[] script = Concat(scriptHash.MakeScript("name"), - scriptHash.MakeScript("symbol"), - scriptHash.MakeScript("decimals"), - scriptHash.MakeScript("totalSupply")); - - var result = rpcClient.InvokeScript(script).Stack; - - return new RpcNep5TokenInfo - { - Name = result[0].ToStackItem().GetString(), - Symbol = result[1].ToStackItem().GetString(), - Decimals = (uint)result[2].ToStackItem().GetBigInteger(), - TotalSupply = result[3].ToStackItem().GetBigInteger() - }; - } - - /// - /// Create NEP5 token transfer transaction - /// - /// contract script hash - /// from KeyPair - /// to account script hash - /// transfer amount - /// netwotk fee, set to be 0 will auto calculate the least fee - /// - public Transaction CreateTransferTx(UInt160 scriptHash, KeyPair fromKey, UInt160 to, BigInteger amount, long networkFee = 0) - { - var sender = Contract.CreateSignatureRedeemScript(fromKey.PublicKey).ToScriptHash(); - Cosigner[] cosigners = new[] { new Cosigner { Scopes = WitnessScope.CalledByEntry, Account = sender } }; - - byte[] script = scriptHash.MakeScript("transfer", sender, to, amount); - Transaction tx = new TransactionManager(rpcClient, sender) - .MakeTransaction(script, null, cosigners, networkFee) - .AddSignature(fromKey) - .Sign() - .Tx; - - return tx; - } - } -} diff --git a/src/neo/Network/RPC/PolicyAPI.cs b/src/neo/Network/RPC/PolicyAPI.cs deleted file mode 100644 index 1b401cd7e5..0000000000 --- a/src/neo/Network/RPC/PolicyAPI.cs +++ /dev/null @@ -1,57 +0,0 @@ -using Neo.SmartContract.Native; -using Neo.VM; -using System.Linq; - -namespace Neo.Network.RPC -{ - /// - /// Get Policy info by RPC API - /// - public class PolicyAPI : ContractClient - { - readonly UInt160 scriptHash = NativeContract.Policy.Hash; - - /// - /// PolicyAPI Constructor - /// - /// the RPC client to call NEO RPC methods - public PolicyAPI(RpcClient rpcClient) : base(rpcClient) { } - - /// - /// Get Max Transactions Count Per Block - /// - /// - public uint GetMaxTransactionsPerBlock() - { - return (uint)TestInvoke(scriptHash, "getMaxTransactionsPerBlock").Stack.Single().ToStackItem().GetBigInteger(); - } - - /// - /// Get Max Block Size - /// - /// - public uint GetMaxBlockSize() - { - return (uint)TestInvoke(scriptHash, "getMaxBlockSize").Stack.Single().ToStackItem().GetBigInteger(); - } - - /// - /// Get Network Fee Per Byte - /// - /// - public long GetFeePerByte() - { - return (long)TestInvoke(scriptHash, "getFeePerByte").Stack.Single().ToStackItem().GetBigInteger(); - } - - /// - /// Get Ploicy Blocked Accounts - /// - /// - public UInt160[] GetBlockedAccounts() - { - var result = (VM.Types.Array)TestInvoke(scriptHash, "getBlockedAccounts").Stack.Single().ToStackItem(); - return result.Select(p => new UInt160(p.GetSpan().ToArray())).ToArray(); - } - } -} diff --git a/src/neo/Network/RPC/RpcClient.cs b/src/neo/Network/RPC/RpcClient.cs deleted file mode 100644 index 0721efcb33..0000000000 --- a/src/neo/Network/RPC/RpcClient.cs +++ /dev/null @@ -1,313 +0,0 @@ -using Neo.IO; -using Neo.IO.Json; -using Neo.Ledger; -using Neo.Network.P2P.Payloads; -using Neo.Network.RPC.Models; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Http; -using System.Text; -using System.Threading.Tasks; - -namespace Neo.Network.RPC -{ - /// - /// The RPC client to call NEO RPC methods - /// - public class RpcClient : IDisposable - { - private readonly HttpClient httpClient; - - public RpcClient(string url) - { - httpClient = new HttpClient() { BaseAddress = new Uri(url) }; - } - - public RpcClient(HttpClient client) - { - httpClient = client; - } - - public void Dispose() - { - httpClient?.Dispose(); - } - - public async Task SendAsync(RpcRequest request) - { - var requestJson = request.ToJson().ToString(); - using (var result = await httpClient.PostAsync(httpClient.BaseAddress, new StringContent(requestJson, Encoding.UTF8))) - { - var content = await result.Content.ReadAsStringAsync(); - var response = RpcResponse.FromJson(JObject.Parse(content)); - response.RawResponse = content; - - if (response.Error != null) - { - throw new RpcException(response.Error.Code, response.Error.Message); - } - - return response; - } - } - - public RpcResponse Send(RpcRequest request) - { - try - { - return SendAsync(request).Result; - } - catch (AggregateException ex) - { - throw ex.GetBaseException(); - } - } - - public virtual JObject RpcSend(string method, params JObject[] paraArgs) - { - var request = new RpcRequest - { - Id = 1, - Jsonrpc = "2.0", - Method = method, - Params = paraArgs.Select(p => p).ToArray() - }; - return Send(request).Result; - } - - /// - /// Returns the hash of the tallest block in the main chain. - /// - public string GetBestBlockHash() - { - return RpcSend("getbestblockhash").AsString(); - } - - /// - /// Returns the hash of the tallest block in the main chain. - /// The serialized information of the block is returned, represented by a hexadecimal string. - /// - public string GetBlockHex(string hashOrIndex) - { - if (int.TryParse(hashOrIndex, out int index)) - { - return RpcSend("getblock", index).AsString(); - } - return RpcSend("getblock", hashOrIndex).AsString(); - } - - /// - /// Returns the hash of the tallest block in the main chain. - /// - public RpcBlock GetBlock(string hashOrIndex) - { - if (int.TryParse(hashOrIndex, out int index)) - { - return RpcBlock.FromJson(RpcSend("getblock", index, true)); - } - return RpcBlock.FromJson(RpcSend("getblock", hashOrIndex, true)); - } - - /// - /// Gets the number of blocks in the main chain. - /// - public uint GetBlockCount() - { - return (uint)RpcSend("getblockcount").AsNumber(); - } - - /// - /// Returns the hash value of the corresponding block, based on the specified index. - /// - public string GetBlockHash(int index) - { - return RpcSend("getblockhash", index).AsString(); - } - - /// - /// Returns the corresponding block header information according to the specified script hash. - /// - public string GetBlockHeaderHex(string hashOrIndex) - { - if (int.TryParse(hashOrIndex, out int index)) - { - return RpcSend("getblockheader", index).AsString(); - } - return RpcSend("getblockheader", hashOrIndex).AsString(); - } - - /// - /// Returns the corresponding block header information according to the specified script hash. - /// - public RpcBlockHeader GetBlockHeader(string hashOrIndex) - { - if (int.TryParse(hashOrIndex, out int index)) - { - return RpcBlockHeader.FromJson(RpcSend("getblockheader", index, true)); - } - return RpcBlockHeader.FromJson(RpcSend("getblockheader", hashOrIndex, true)); - } - - /// - /// Returns the system fees of the block, based on the specified index. - /// - public string GetBlockSysFee(int height) - { - return RpcSend("getblocksysfee", height).AsString(); - } - - /// - /// Gets the current number of connections for the node. - /// - public int GetConnectionCount() - { - return (int)RpcSend("getconnectioncount").AsNumber(); - } - - /// - /// Queries contract information, according to the contract script hash. - /// - public ContractState GetContractState(string hash) - { - return ContractState.FromJson(RpcSend("getcontractstate", hash)); - } - - /// - /// Gets the list of nodes that the node is currently connected/disconnected from. - /// - public RpcPeers GetPeers() - { - return RpcPeers.FromJson(RpcSend("getpeers")); - } - - /// - /// Obtains the list of unconfirmed transactions in memory. - /// - public string[] GetRawMempool() - { - return ((JArray)RpcSend("getrawmempool")).Select(p => p.AsString()).ToArray(); - } - - /// - /// Obtains the list of unconfirmed transactions in memory. - /// shouldGetUnverified = true - /// - public RpcRawMemPool GetRawMempoolBoth() - { - return RpcRawMemPool.FromJson(RpcSend("getrawmempool", true)); - } - - /// - /// Returns the corresponding transaction information, based on the specified hash value. - /// - public string GetRawTransactionHex(string txid) - { - return RpcSend("getrawtransaction", txid).AsString(); - } - - /// - /// Returns the corresponding transaction information, based on the specified hash value. - /// verbose = true - /// - public RpcTransaction GetRawTransaction(string txid) - { - return RpcTransaction.FromJson(RpcSend("getrawtransaction", txid, true)); - } - - /// - /// Returns the stored value, according to the contract script hash and the stored key. - /// - public string GetStorage(string script_hash, string key) - { - return RpcSend("getstorage", script_hash, key).AsString(); - } - - /// - /// Returns the block index in which the transaction is found. - /// - public uint GetTransactionHeight(string txid) - { - return uint.Parse(RpcSend("gettransactionheight", txid).AsString()); - } - - /// - /// Returns the current NEO consensus nodes information and voting status. - /// - public RpcValidator[] GetValidators() - { - return ((JArray)RpcSend("getvalidators")).Select(p => RpcValidator.FromJson(p)).ToArray(); - } - - /// - /// Returns the version information about the queried node. - /// - public RpcVersion GetVersion() - { - return RpcVersion.FromJson(RpcSend("getversion")); - } - - /// - /// Returns the result after calling a smart contract at scripthash with the given operation and parameters. - /// This RPC call does not affect the blockchain in any way. - /// - public RpcInvokeResult InvokeFunction(string address, string function, RpcStack[] stacks) - { - return RpcInvokeResult.FromJson(RpcSend("invokefunction", address, function, stacks.Select(p => p.ToJson()).ToArray())); - } - - /// - /// Returns the result after passing a script through the VM. - /// This RPC call does not affect the blockchain in any way. - /// - public RpcInvokeResult InvokeScript(byte[] script, params UInt160[] scriptHashesForVerifying) - { - List parameters = new List - { - script.ToHexString() - }; - parameters.AddRange(scriptHashesForVerifying.Select(p => (JObject)p.ToString())); - return RpcInvokeResult.FromJson(RpcSend("invokescript", parameters.ToArray())); - } - - /// - /// Returns a list of plugins loaded by the node. - /// - public RpcPlugin[] ListPlugins() - { - return ((JArray)RpcSend("listplugins")).Select(p => RpcPlugin.FromJson(p)).ToArray(); - } - - /// - /// Broadcasts a serialized transaction over the NEO network. - /// - public bool SendRawTransaction(byte[] rawTransaction) - { - return RpcSend("sendrawtransaction", rawTransaction.ToHexString()).AsBoolean(); - } - - /// - /// Broadcasts a transaction over the NEO network. - /// - public bool SendRawTransaction(Transaction transaction) - { - return SendRawTransaction(transaction.ToArray()); - } - - /// - /// Broadcasts a serialized block over the NEO network. - /// - public bool SubmitBlock(byte[] block) - { - return RpcSend("submitblock", block.ToHexString()).AsBoolean(); - } - - /// - /// Verifies that the address is a correct NEO address. - /// - public RpcValidateAddressResult ValidateAddress(string address) - { - return RpcValidateAddressResult.FromJson(RpcSend("validateaddress", address)); - } - } -} diff --git a/src/neo/Network/RPC/RpcException.cs b/src/neo/Network/RPC/RpcException.cs deleted file mode 100644 index b5030750ca..0000000000 --- a/src/neo/Network/RPC/RpcException.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace Neo.Network.RPC -{ - public class RpcException : Exception - { - public RpcException(int code, string message) : base(message) - { - HResult = code; - } - } -} diff --git a/src/neo/Network/RPC/RpcServer.cs b/src/neo/Network/RPC/RpcServer.cs deleted file mode 100644 index e2137d517c..0000000000 --- a/src/neo/Network/RPC/RpcServer.cs +++ /dev/null @@ -1,667 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Compression; -using System.Linq; -using System.Net; -using System.Net.Security; -using System.Security.Cryptography.X509Certificates; -using System.Text; -using System.Threading.Tasks; -using Akka.Actor; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.ResponseCompression; -using Microsoft.AspNetCore.Server.Kestrel.Https; -using Microsoft.Extensions.DependencyInjection; -using Neo.IO; -using Neo.IO.Json; -using Neo.Ledger; -using Neo.Network.P2P; -using Neo.Network.P2P.Payloads; -using Neo.Persistence; -using Neo.Plugins; -using Neo.SmartContract; -using Neo.SmartContract.Native; -using Neo.VM; -using Neo.Wallets; - -namespace Neo.Network.RPC -{ - public sealed class RpcServer : IDisposable - { - private class CheckWitnessHashes : IVerifiable - { - private readonly UInt160[] _scriptHashesForVerifying; - public Witness[] Witnesses { get; set; } - public int Size { get; } - - public CheckWitnessHashes(UInt160[] scriptHashesForVerifying) - { - _scriptHashesForVerifying = scriptHashesForVerifying; - } - - public void Serialize(BinaryWriter writer) - { - throw new NotImplementedException(); - } - - public void Deserialize(BinaryReader reader) - { - throw new NotImplementedException(); - } - - public void DeserializeUnsigned(BinaryReader reader) - { - throw new NotImplementedException(); - } - - public UInt160[] GetScriptHashesForVerifying(StoreView snapshot) - { - return _scriptHashesForVerifying; - } - - public void SerializeUnsigned(BinaryWriter writer) - { - throw new NotImplementedException(); - } - } - - public Wallet Wallet { get; set; } - public long MaxGasInvoke { get; } - - private IWebHost host; - private readonly NeoSystem system; - - public RpcServer(NeoSystem system, Wallet wallet = null, long maxGasInvoke = default) - { - this.system = system; - this.Wallet = wallet; - this.MaxGasInvoke = maxGasInvoke; - } - - private static JObject CreateErrorResponse(JObject id, int code, string message, JObject data = null) - { - JObject response = CreateResponse(id); - response["error"] = new JObject(); - response["error"]["code"] = code; - response["error"]["message"] = message; - if (data != null) - response["error"]["data"] = data; - return response; - } - - private static JObject CreateResponse(JObject id) - { - JObject response = new JObject(); - response["jsonrpc"] = "2.0"; - response["id"] = id; - return response; - } - - public void Dispose() - { - if (host != null) - { - host.Dispose(); - host = null; - } - } - - private JObject GetInvokeResult(byte[] script, IVerifiable checkWitnessHashes = null) - { - using ApplicationEngine engine = ApplicationEngine.Run(script, checkWitnessHashes, extraGAS: MaxGasInvoke); - JObject json = new JObject(); - json["script"] = script.ToHexString(); - json["state"] = engine.State; - json["gas_consumed"] = engine.GasConsumed.ToString(); - try - { - json["stack"] = new JArray(engine.ResultStack.Select(p => p.ToParameter().ToJson())); - } - catch (InvalidOperationException) - { - json["stack"] = "error: recursive reference"; - } - return json; - } - - private static JObject GetRelayResult(RelayResultReason reason, UInt256 hash) - { - if (reason == RelayResultReason.Succeed) - { - var ret = new JObject(); - ret["hash"] = hash.ToString(); - return ret; - } - else - { - throw new RpcException(-500, reason.ToString()); - } - } - - private JObject Process(string method, JArray _params) - { - switch (method) - { - case "getbestblockhash": - { - return GetBestBlockHash(); - } - case "getblock": - { - JObject key = _params[0]; - bool verbose = _params.Count >= 2 && _params[1].AsBoolean(); - return GetBlock(key, verbose); - } - case "getblockcount": - { - return GetBlockCount(); - } - case "getblockhash": - { - uint height = uint.Parse(_params[0].AsString()); - return GetBlockHash(height); - } - case "getblockheader": - { - JObject key = _params[0]; - bool verbose = _params.Count >= 2 && _params[1].AsBoolean(); - return GetBlockHeader(key, verbose); - } - case "getblocksysfee": - { - uint height = uint.Parse(_params[0].AsString()); - return GetBlockSysFee(height); - } - case "getconnectioncount": - { - return GetConnectionCount(); - } - case "getcontractstate": - { - UInt160 script_hash = UInt160.Parse(_params[0].AsString()); - return GetContractState(script_hash); - } - case "getpeers": - { - return GetPeers(); - } - case "getrawmempool": - { - bool shouldGetUnverified = _params.Count >= 1 && _params[0].AsBoolean(); - return GetRawMemPool(shouldGetUnverified); - } - case "getrawtransaction": - { - UInt256 hash = UInt256.Parse(_params[0].AsString()); - bool verbose = _params.Count >= 2 && _params[1].AsBoolean(); - return GetRawTransaction(hash, verbose); - } - case "getstorage": - { - UInt160 script_hash = UInt160.Parse(_params[0].AsString()); - byte[] key = _params[1].AsString().HexToBytes(); - return GetStorage(script_hash, key); - } - case "gettransactionheight": - { - UInt256 hash = UInt256.Parse(_params[0].AsString()); - return GetTransactionHeight(hash); - } - case "getvalidators": - { - return GetValidators(); - } - case "getversion": - { - return GetVersion(); - } - case "invokefunction": - { - UInt160 script_hash = UInt160.Parse(_params[0].AsString()); - string operation = _params[1].AsString(); - ContractParameter[] args = _params.Count >= 3 ? ((JArray)_params[2]).Select(p => ContractParameter.FromJson(p)).ToArray() : new ContractParameter[0]; - return InvokeFunction(script_hash, operation, args); - } - case "invokescript": - { - byte[] script = _params[0].AsString().HexToBytes(); - CheckWitnessHashes checkWitnessHashes = null; - if (_params.Count > 1) - { - UInt160[] scriptHashesForVerifying = _params.Skip(1).Select(u => UInt160.Parse(u.AsString())).ToArray(); - checkWitnessHashes = new CheckWitnessHashes(scriptHashesForVerifying); - } - return GetInvokeResult(script, checkWitnessHashes); - } - case "listplugins": - { - return ListPlugins(); - } - case "sendrawtransaction": - { - Transaction tx = _params[0].AsString().HexToBytes().AsSerializable(); - return SendRawTransaction(tx); - } - case "submitblock": - { - Block block = _params[0].AsString().HexToBytes().AsSerializable(); - return SubmitBlock(block); - } - case "validateaddress": - { - string address = _params[0].AsString(); - return ValidateAddress(address); - } - default: - throw new RpcException(-32601, "Method not found"); - } - } - - private async Task ProcessAsync(HttpContext context) - { - context.Response.Headers["Access-Control-Allow-Origin"] = "*"; - context.Response.Headers["Access-Control-Allow-Methods"] = "GET, POST"; - context.Response.Headers["Access-Control-Allow-Headers"] = "Content-Type"; - context.Response.Headers["Access-Control-Max-Age"] = "31536000"; - if (context.Request.Method != "GET" && context.Request.Method != "POST") return; - JObject request = null; - if (context.Request.Method == "GET") - { - string jsonrpc = context.Request.Query["jsonrpc"]; - string id = context.Request.Query["id"]; - string method = context.Request.Query["method"]; - string _params = context.Request.Query["params"]; - if (!string.IsNullOrEmpty(id) && !string.IsNullOrEmpty(method) && !string.IsNullOrEmpty(_params)) - { - try - { - _params = Encoding.UTF8.GetString(Convert.FromBase64String(_params)); - } - catch (FormatException) { } - request = new JObject(); - if (!string.IsNullOrEmpty(jsonrpc)) - request["jsonrpc"] = jsonrpc; - request["id"] = id; - request["method"] = method; - request["params"] = JObject.Parse(_params); - } - } - else if (context.Request.Method == "POST") - { - using (StreamReader reader = new StreamReader(context.Request.Body)) - { - try - { - request = JObject.Parse(reader); - } - catch (FormatException) { } - } - } - JObject response; - if (request == null) - { - response = CreateErrorResponse(null, -32700, "Parse error"); - } - else if (request is JArray array) - { - if (array.Count == 0) - { - response = CreateErrorResponse(request["id"], -32600, "Invalid Request"); - } - else - { - response = array.Select(p => ProcessRequest(context, p)).Where(p => p != null).ToArray(); - } - } - else - { - response = ProcessRequest(context, request); - } - if (response == null || (response as JArray)?.Count == 0) return; - context.Response.ContentType = "application/json-rpc"; - await context.Response.WriteAsync(response.ToString(), Encoding.UTF8); - } - - private JObject ProcessRequest(HttpContext context, JObject request) - { - if (!request.ContainsProperty("id")) return null; - if (!request.ContainsProperty("method") || !request.ContainsProperty("params") || !(request["params"] is JArray)) - { - return CreateErrorResponse(request["id"], -32600, "Invalid Request"); - } - JObject result = null; - try - { - string method = request["method"].AsString(); - JArray _params = (JArray)request["params"]; - foreach (IRpcPlugin plugin in Plugin.RpcPlugins) - plugin.PreProcess(context, method, _params); - foreach (IRpcPlugin plugin in Plugin.RpcPlugins) - { - result = plugin.OnProcess(context, method, _params); - if (result != null) break; - } - if (result == null) - result = Process(method, _params); - foreach (IRpcPlugin plugin in Plugin.RpcPlugins) - plugin.PostProcess(context, method, _params, result); - } - catch (FormatException) - { - return CreateErrorResponse(request["id"], -32602, "Invalid params"); - } - catch (IndexOutOfRangeException) - { - return CreateErrorResponse(request["id"], -32602, "Invalid params"); - } - catch (Exception ex) - { -#if DEBUG - return CreateErrorResponse(request["id"], ex.HResult, ex.Message, ex.StackTrace); -#else - return CreateErrorResponse(request["id"], ex.HResult, ex.Message); -#endif - } - JObject response = CreateResponse(request["id"]); - response["result"] = result; - return response; - } - - public void Start(IPAddress bindAddress, int port, string sslCert = null, string password = null, string[] trustedAuthorities = null) - { - host = new WebHostBuilder().UseKestrel(options => options.Listen(bindAddress, port, listenOptions => - { - if (string.IsNullOrEmpty(sslCert)) return; - listenOptions.UseHttps(sslCert, password, httpsConnectionAdapterOptions => - { - if (trustedAuthorities is null || trustedAuthorities.Length == 0) - return; - httpsConnectionAdapterOptions.ClientCertificateMode = ClientCertificateMode.RequireCertificate; - httpsConnectionAdapterOptions.ClientCertificateValidation = (cert, chain, err) => - { - if (err != SslPolicyErrors.None) - return false; - X509Certificate2 authority = chain.ChainElements[chain.ChainElements.Count - 1].Certificate; - return trustedAuthorities.Contains(authority.Thumbprint); - }; - }); - })) - .Configure(app => - { - app.UseResponseCompression(); - app.Run(ProcessAsync); - }) - .ConfigureServices(services => - { - services.AddResponseCompression(options => - { - // options.EnableForHttps = false; - options.Providers.Add(); - options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Append("application/json-rpc"); - }); - - services.Configure(options => - { - options.Level = CompressionLevel.Fastest; - }); - }) - .Build(); - - host.Start(); - } - - private JObject GetBestBlockHash() - { - return Blockchain.Singleton.CurrentBlockHash.ToString(); - } - - private JObject GetBlock(JObject key, bool verbose) - { - Block block; - if (key is JNumber) - { - uint index = uint.Parse(key.AsString()); - block = Blockchain.Singleton.GetBlock(index); - } - else - { - UInt256 hash = UInt256.Parse(key.AsString()); - block = Blockchain.Singleton.View.GetBlock(hash); - } - if (block == null) - throw new RpcException(-100, "Unknown block"); - if (verbose) - { - JObject json = block.ToJson(); - json["confirmations"] = Blockchain.Singleton.Height - block.Index + 1; - UInt256 hash = Blockchain.Singleton.GetNextBlockHash(block.Hash); - if (hash != null) - json["nextblockhash"] = hash.ToString(); - return json; - } - return block.ToArray().ToHexString(); - } - - private JObject GetBlockCount() - { - return Blockchain.Singleton.Height + 1; - } - - private JObject GetBlockHash(uint height) - { - if (height <= Blockchain.Singleton.Height) - { - return Blockchain.Singleton.GetBlockHash(height).ToString(); - } - throw new RpcException(-100, "Invalid Height"); - } - - private JObject GetBlockHeader(JObject key, bool verbose) - { - Header header; - if (key is JNumber) - { - uint height = uint.Parse(key.AsString()); - header = Blockchain.Singleton.GetHeader(height); - } - else - { - UInt256 hash = UInt256.Parse(key.AsString()); - header = Blockchain.Singleton.View.GetHeader(hash); - } - if (header == null) - throw new RpcException(-100, "Unknown block"); - - if (verbose) - { - JObject json = header.ToJson(); - json["confirmations"] = Blockchain.Singleton.Height - header.Index + 1; - UInt256 hash = Blockchain.Singleton.GetNextBlockHash(header.Hash); - if (hash != null) - json["nextblockhash"] = hash.ToString(); - return json; - } - - return header.ToArray().ToHexString(); - } - - private JObject GetBlockSysFee(uint height) - { - if (height <= Blockchain.Singleton.Height) - using (ApplicationEngine engine = NativeContract.GAS.TestCall("getSysFeeAmount", height)) - { - return engine.ResultStack.Peek().GetBigInteger().ToString(); - } - throw new RpcException(-100, "Invalid Height"); - } - - private JObject GetConnectionCount() - { - return LocalNode.Singleton.ConnectedCount; - } - - private JObject GetContractState(UInt160 script_hash) - { - ContractState contract = Blockchain.Singleton.View.Contracts.TryGet(script_hash); - return contract?.ToJson() ?? throw new RpcException(-100, "Unknown contract"); - } - - private JObject GetPeers() - { - JObject json = new JObject(); - json["unconnected"] = new JArray(LocalNode.Singleton.GetUnconnectedPeers().Select(p => - { - JObject peerJson = new JObject(); - peerJson["address"] = p.Address.ToString(); - peerJson["port"] = p.Port; - return peerJson; - })); - json["bad"] = new JArray(); //badpeers has been removed - json["connected"] = new JArray(LocalNode.Singleton.GetRemoteNodes().Select(p => - { - JObject peerJson = new JObject(); - peerJson["address"] = p.Remote.Address.ToString(); - peerJson["port"] = p.ListenerTcpPort; - return peerJson; - })); - return json; - } - - private JObject GetRawMemPool(bool shouldGetUnverified) - { - if (!shouldGetUnverified) - return new JArray(Blockchain.Singleton.MemPool.GetVerifiedTransactions().Select(p => (JObject)p.Hash.ToString())); - - JObject json = new JObject(); - json["height"] = Blockchain.Singleton.Height; - Blockchain.Singleton.MemPool.GetVerifiedAndUnverifiedTransactions( - out IEnumerable verifiedTransactions, - out IEnumerable unverifiedTransactions); - json["verified"] = new JArray(verifiedTransactions.Select(p => (JObject)p.Hash.ToString())); - json["unverified"] = new JArray(unverifiedTransactions.Select(p => (JObject)p.Hash.ToString())); - return json; - } - - private JObject GetRawTransaction(UInt256 hash, bool verbose) - { - Transaction tx = Blockchain.Singleton.GetTransaction(hash); - if (tx == null) - throw new RpcException(-100, "Unknown transaction"); - if (verbose) - { - JObject json = tx.ToJson(); - TransactionState txState = Blockchain.Singleton.View.Transactions.TryGet(hash); - if (txState != null) - { - Header header = Blockchain.Singleton.GetHeader(txState.BlockIndex); - json["blockhash"] = header.Hash.ToString(); - json["confirmations"] = Blockchain.Singleton.Height - header.Index + 1; - json["blocktime"] = header.Timestamp; - json["vmState"] = txState.VMState; - } - return json; - } - return tx.ToArray().ToHexString(); - } - - private JObject GetStorage(UInt160 script_hash, byte[] key) - { - StorageItem item = Blockchain.Singleton.View.Storages.TryGet(new StorageKey - { - ScriptHash = script_hash, - Key = key - }) ?? new StorageItem(); - return item.Value?.ToHexString(); - } - - private JObject GetTransactionHeight(UInt256 hash) - { - uint? height = Blockchain.Singleton.View.Transactions.TryGet(hash)?.BlockIndex; - if (height.HasValue) return height.Value; - throw new RpcException(-100, "Unknown transaction"); - } - - private JObject GetValidators() - { - using (SnapshotView snapshot = Blockchain.Singleton.GetSnapshot()) - { - var validators = NativeContract.NEO.GetValidators(snapshot); - return NativeContract.NEO.GetRegisteredValidators(snapshot).Select(p => - { - JObject validator = new JObject(); - validator["publickey"] = p.PublicKey.ToString(); - validator["votes"] = p.Votes.ToString(); - validator["active"] = validators.Contains(p.PublicKey); - return validator; - }).ToArray(); - } - } - - private JObject GetVersion() - { - JObject json = new JObject(); - json["tcpPort"] = LocalNode.Singleton.ListenerTcpPort; - json["wsPort"] = LocalNode.Singleton.ListenerWsPort; - json["nonce"] = LocalNode.Nonce; - json["useragent"] = LocalNode.UserAgent; - return json; - } - - private JObject InvokeFunction(UInt160 script_hash, string operation, ContractParameter[] args) - { - byte[] script; - using (ScriptBuilder sb = new ScriptBuilder()) - { - script = sb.EmitAppCall(script_hash, operation, args).ToArray(); - } - return GetInvokeResult(script); - } - - private JObject ListPlugins() - { - return new JArray(Plugin.Plugins - .OrderBy(u => u.Name) - .Select(u => new JObject - { - ["name"] = u.Name, - ["version"] = u.Version.ToString(), - ["interfaces"] = new JArray(u.GetType().GetInterfaces() - .Select(p => p.Name) - .Where(p => p.EndsWith("Plugin")) - .Select(p => (JObject)p)) - })); - } - - private JObject SendRawTransaction(Transaction tx) - { - RelayResultReason reason = system.Blockchain.Ask(tx).Result; - return GetRelayResult(reason, tx.Hash); - } - - private JObject SubmitBlock(Block block) - { - RelayResultReason reason = system.Blockchain.Ask(block).Result; - return GetRelayResult(reason, block.Hash); - } - - private JObject ValidateAddress(string address) - { - JObject json = new JObject(); - UInt160 scriptHash; - try - { - scriptHash = address.ToScriptHash(); - } - catch - { - scriptHash = null; - } - json["address"] = address; - json["isvalid"] = scriptHash != null; - return json; - } - } -} diff --git a/src/neo/Network/RPC/TransactionManager.cs b/src/neo/Network/RPC/TransactionManager.cs deleted file mode 100644 index 7841ba8527..0000000000 --- a/src/neo/Network/RPC/TransactionManager.cs +++ /dev/null @@ -1,226 +0,0 @@ -using Neo.Cryptography.ECC; -using Neo.IO; -using Neo.Network.P2P.Payloads; -using Neo.Network.RPC.Models; -using Neo.SmartContract; -using Neo.SmartContract.Native; -using Neo.VM; -using Neo.Wallets; -using System; - -namespace Neo.Network.RPC -{ - /// - /// This class helps to create transaction with RPC API. - /// - public class TransactionManager - { - private readonly RpcClient rpcClient; - private readonly PolicyAPI policyAPI; - private readonly Nep5API nep5API; - private readonly UInt160 sender; - - /// - /// The Transaction context to manage the witnesses - /// - private ContractParametersContext context; - - /// - /// The Transaction managed by this class - /// - public Transaction Tx { get; private set; } - - /// - /// TransactionManager Constructor - /// - /// the RPC client to call NEO RPC API - /// the account script hash of sender - public TransactionManager(RpcClient rpc, UInt160 sender) - { - rpcClient = rpc; - policyAPI = new PolicyAPI(rpc); - nep5API = new Nep5API(rpc); - this.sender = sender; - } - - /// - /// Create an unsigned Transaction object with given parameters. - /// - /// Transaction Script - /// Transaction Attributes - /// Transaction Cosigners - /// Transaction NetworkFee, will set to estimate value(with only basic signatures) when networkFee is 0 - /// - public TransactionManager MakeTransaction(byte[] script, TransactionAttribute[] attributes = null, Cosigner[] cosigners = null, long networkFee = 0) - { - var random = new Random(); - uint height = rpcClient.GetBlockCount() - 1; - Tx = new Transaction - { - Version = 0, - Nonce = (uint)random.Next(), - Script = script, - Sender = sender, - ValidUntilBlock = height + Transaction.MaxValidUntilBlockIncrement, - Attributes = attributes ?? new TransactionAttribute[0], - Cosigners = cosigners ?? new Cosigner[0], - Witnesses = new Witness[0] - }; - - // Add witness hashes parameter to pass CheckWitness - UInt160[] hashes = Tx.GetScriptHashesForVerifying(null); - RpcInvokeResult result = rpcClient.InvokeScript(script, hashes); - Tx.SystemFee = Math.Max(long.Parse(result.GasConsumed) - ApplicationEngine.GasFree, 0); - if (Tx.SystemFee > 0) - { - long d = (long)NativeContract.GAS.Factor; - long remainder = Tx.SystemFee % d; - if (remainder > 0) - Tx.SystemFee += d - remainder; - else if (remainder < 0) - Tx.SystemFee -= remainder; - } - - context = new ContractParametersContext(Tx); - - // set networkfee to estimate value when networkFee is 0 - Tx.NetworkFee = networkFee == 0 ? EstimateNetworkFee() : networkFee; - - var gasBalance = nep5API.BalanceOf(NativeContract.GAS.Hash, sender); - if (gasBalance >= Tx.SystemFee + Tx.NetworkFee) return this; - throw new InvalidOperationException($"Insufficient GAS in address: {sender.ToAddress()}"); - } - - /// - /// Estimate NetworkFee, assuming the witnesses are basic Signature Contract - /// - private long EstimateNetworkFee() - { - long networkFee = 0; - UInt160[] hashes = Tx.GetScriptHashesForVerifying(null); - int size = Transaction.HeaderSize + Tx.Attributes.GetVarSize() + Tx.Script.GetVarSize() + IO.Helper.GetVarSize(hashes.Length); - - // assume the hashes are single Signature - foreach (var hash in hashes) - { - size += 166; - networkFee += ApplicationEngine.OpCodePrices[OpCode.PUSHBYTES64] + ApplicationEngine.OpCodePrices[OpCode.PUSHBYTES33] + InteropService.GetPrice(InteropService.Neo_Crypto_ECDsaVerify, null); - } - - networkFee += size * policyAPI.GetFeePerByte(); - return networkFee; - } - - /// - /// Calculate NetworkFee with context items - /// - private long CalculateNetworkFee() - { - long networkFee = 0; - UInt160[] hashes = Tx.GetScriptHashesForVerifying(null); - int size = Transaction.HeaderSize + Tx.Attributes.GetVarSize() + Tx.Script.GetVarSize() + IO.Helper.GetVarSize(hashes.Length); - foreach (UInt160 hash in hashes) - { - byte[] witness_script = context.GetScript(hash); - if (witness_script is null || witness_script.Length == 0) - { - try - { - witness_script = rpcClient.GetContractState(hash.ToString())?.Script; - } - catch { } - } - - if (witness_script is null) continue; - - networkFee += Wallet.CalculateNetWorkFee(witness_script, ref size); - } - networkFee += size * policyAPI.GetFeePerByte(); - return networkFee; - } - - /// - /// Add Signature - /// - /// The KeyPair to sign transction - /// - public TransactionManager AddSignature(KeyPair key) - { - var contract = Contract.CreateSignatureContract(key.PublicKey); - - byte[] signature = Tx.Sign(key); - if (!context.AddSignature(contract, key.PublicKey, signature)) - { - throw new Exception("AddSignature failed!"); - } - - return this; - } - - /// - /// Add Multi-Signature - /// - /// The KeyPair to sign transction - /// The least count of signatures needed for multiple signature contract - /// The Public Keys construct the multiple signature contract - public TransactionManager AddMultiSig(KeyPair key, int m, params ECPoint[] publicKeys) - { - Contract contract = Contract.CreateMultiSigContract(m, publicKeys); - - byte[] signature = Tx.Sign(key); - if (!context.AddSignature(contract, key.PublicKey, signature)) - { - throw new Exception("AddMultiSig failed!"); - } - - return this; - } - - /// - /// Add Witness with contract - /// - /// The witness verification contract - /// The witness invocation parameters - public TransactionManager AddWitness(Contract contract, params object[] parameters) - { - if (!context.Add(contract, parameters)) - { - throw new Exception("AddWitness failed!"); - }; - return this; - } - - /// - /// Add Witness with scriptHash - /// - /// The witness verification contract hash - /// The witness invocation parameters - public TransactionManager AddWitness(UInt160 scriptHash, params object[] parameters) - { - var contract = Contract.Create(scriptHash); - return AddWitness(contract, parameters); - } - - /// - /// Verify Witness count and add witnesses - /// - public TransactionManager Sign() - { - // Verify witness count - if (!context.Completed) - { - throw new Exception($"Please add signature or witness first!"); - } - - // Calculate NetworkFee - long leastNetworkFee = CalculateNetworkFee(); - if (Tx.NetworkFee < leastNetworkFee) - { - throw new InvalidOperationException("Insufficient NetworkFee"); - } - - Tx.Witnesses = context.GetWitnesses(); - return this; - } - } -} diff --git a/src/neo/Network/RPC/WalletAPI.cs b/src/neo/Network/RPC/WalletAPI.cs deleted file mode 100644 index e1ab3b777f..0000000000 --- a/src/neo/Network/RPC/WalletAPI.cs +++ /dev/null @@ -1,192 +0,0 @@ -using Neo.Ledger; -using Neo.Network.P2P.Payloads; -using Neo.Network.RPC.Models; -using Neo.SmartContract; -using Neo.SmartContract.Native; -using Neo.VM; -using Neo.Wallets; -using System; -using System.Linq; -using System.Numerics; -using System.Threading.Tasks; - -namespace Neo.Network.RPC -{ - /// - /// Wallet Common APIs - /// - public class WalletAPI - { - private readonly RpcClient rpcClient; - private readonly Nep5API nep5API; - - /// - /// WalletAPI Constructor - /// - /// the RPC client to call NEO RPC methods - public WalletAPI(RpcClient rpc) - { - rpcClient = rpc; - nep5API = new Nep5API(rpc); - } - - /// - /// Get unclaimed gas with address, scripthash or public key string - /// - /// address, scripthash or public key string - /// Example: address ("AV556nYUwyJKNv8Xy7hVMLQnkmKPukw6x5"), scripthash ("0x6a38cd693b615aea24dd00de12a9f5836844da91"), public key ("02f9ec1fd0a98796cf75b586772a4ddd41a0af07a1dbdf86a7238f74fb72503575") - /// - public decimal GetUnclaimedGas(string account) - { - UInt160 accountHash = Utility.GetScriptHash(account); - return GetUnclaimedGas(accountHash); - } - - /// - /// Get unclaimed gas - /// - /// account scripthash - /// - public decimal GetUnclaimedGas(UInt160 account) - { - UInt160 scriptHash = NativeContract.NEO.Hash; - BigInteger balance = nep5API.TestInvoke(scriptHash, "unclaimedGas", account, rpcClient.GetBlockCount() - 1) - .Stack.Single().ToStackItem().GetBigInteger(); - return ((decimal)balance) / (long)NativeContract.GAS.Factor; - } - - /// - /// Get Neo Balance - /// - /// address, scripthash or public key string - /// Example: address ("AV556nYUwyJKNv8Xy7hVMLQnkmKPukw6x5"), scripthash ("0x6a38cd693b615aea24dd00de12a9f5836844da91"), public key ("02f9ec1fd0a98796cf75b586772a4ddd41a0af07a1dbdf86a7238f74fb72503575") - /// - public uint GetNeoBalance(string account) - { - BigInteger balance = GetTokenBalance(NativeContract.NEO.Hash.ToString(), account); - return (uint)balance; - } - - /// - /// Get Gas Balance - /// - /// address, scripthash or public key string - /// Example: address ("AV556nYUwyJKNv8Xy7hVMLQnkmKPukw6x5"), scripthash ("0x6a38cd693b615aea24dd00de12a9f5836844da91"), public key ("02f9ec1fd0a98796cf75b586772a4ddd41a0af07a1dbdf86a7238f74fb72503575") - /// - public decimal GetGasBalance(string account) - { - BigInteger balance = GetTokenBalance(NativeContract.GAS.Hash.ToString(), account); - return ((decimal)balance) / (long)NativeContract.GAS.Factor; - } - - /// - /// Get token balance with string parameters - /// - /// token script hash, Example: "0x43cf98eddbe047e198a3e5d57006311442a0ca15"(NEO) - /// address, scripthash or public key string - /// Example: address ("AV556nYUwyJKNv8Xy7hVMLQnkmKPukw6x5"), scripthash ("0x6a38cd693b615aea24dd00de12a9f5836844da91"), public key ("02f9ec1fd0a98796cf75b586772a4ddd41a0af07a1dbdf86a7238f74fb72503575") - /// - public BigInteger GetTokenBalance(string tokenHash, string account) - { - UInt160 scriptHash = Utility.GetScriptHash(tokenHash); - UInt160 accountHash = Utility.GetScriptHash(account); - return nep5API.BalanceOf(scriptHash, accountHash); - } - - /// - /// The GAS is claimed when doing NEO transfer - /// This function will transfer NEO balance from account to itself - /// - /// wif or private key - /// Example: WIF ("KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p"), PrivateKey ("450d6c2a04b5b470339a745427bae6828400cf048400837d73c415063835e005") - /// The transaction sended - public Transaction ClaimGas(string key) - { - KeyPair keyPair = Utility.GetKeyPair(key); - return ClaimGas(keyPair); - } - - /// - /// The GAS is claimed when doing NEO transfer - /// This function will transfer NEO balance from account to itself - /// - /// keyPair - /// The transaction sended - public Transaction ClaimGas(KeyPair keyPair) - { - UInt160 toHash = Contract.CreateSignatureRedeemScript(keyPair.PublicKey).ToScriptHash(); - BigInteger balance = nep5API.BalanceOf(NativeContract.NEO.Hash, toHash); - Transaction transaction = nep5API.CreateTransferTx(NativeContract.NEO.Hash, keyPair, toHash, balance); - rpcClient.SendRawTransaction(transaction); - return transaction; - } - - /// - /// Transfer NEP5 token balance, with common data types - /// - /// nep5 token script hash, Example: scripthash ("0x6a38cd693b615aea24dd00de12a9f5836844da91") - /// wif or private key - /// Example: WIF ("KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p"), PrivateKey ("450d6c2a04b5b470339a745427bae6828400cf048400837d73c415063835e005") - /// address or account script hash - /// token amount - /// netwotk fee, set to be 0 will auto calculate the least fee - /// - public Transaction Transfer(string tokenHash, string fromKey, string toAddress, decimal amount, decimal networkFee = 0) - { - UInt160 scriptHash = Utility.GetScriptHash(tokenHash); - var decimals = nep5API.Decimals(scriptHash); - - KeyPair from = Utility.GetKeyPair(fromKey); - UInt160 to = Utility.GetScriptHash(toAddress); - BigInteger amountInteger = amount.ToBigInteger(decimals); - BigInteger networkFeeInteger = networkFee.ToBigInteger(NativeContract.GAS.Decimals); - return Transfer(scriptHash, from, to, amountInteger, (long)networkFeeInteger); - } - - /// - /// Transfer NEP5 token balance - /// - /// contract script hash - /// from KeyPair - /// to account script hash - /// transfer amount - /// netwotk fee, set to be 0 will auto calculate the least fee - /// - public Transaction Transfer(UInt160 scriptHash, KeyPair from, UInt160 to, BigInteger amountInteger, BigInteger networkFeeInteger = default) - { - Transaction transaction = nep5API.CreateTransferTx(scriptHash, from, to, amountInteger, (long)networkFeeInteger); - rpcClient.SendRawTransaction(transaction); - return transaction; - } - - /// - /// Wait until the transaction is observable block chain - /// - /// the transaction to observe - /// TimeoutException throws after "timeout" seconds - /// the Transaction state, including vmState and blockhash - public async Task WaitTransaction(Transaction transaction, int timeout = 60) - { - DateTime deadline = DateTime.UtcNow.AddSeconds(timeout); - RpcTransaction rpcTx = null; - while (rpcTx == null || rpcTx.Confirmations == null) - { - if (deadline < DateTime.UtcNow) - { - throw new TimeoutException(); - } - - try - { - rpcTx = rpcClient.GetRawTransaction(transaction.Hash.ToString()); - if (rpcTx == null || rpcTx.Confirmations == null) - { - await Task.Delay((int)Blockchain.MillisecondsPerBlock / 2); - } - } - catch (Exception) { } - } - return rpcTx; - } - } -} diff --git a/src/neo/Plugins/IRpcPlugin.cs b/src/neo/Plugins/IRpcPlugin.cs deleted file mode 100644 index 92e7a0fa48..0000000000 --- a/src/neo/Plugins/IRpcPlugin.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Microsoft.AspNetCore.Http; -using Neo.IO.Json; - -namespace Neo.Plugins -{ - public interface IRpcPlugin - { - void PreProcess(HttpContext context, string method, JArray _params); - JObject OnProcess(HttpContext context, string method, JArray _params); - void PostProcess(HttpContext context, string method, JArray _params, JObject result); - } -} diff --git a/src/neo/Plugins/Plugin.cs b/src/neo/Plugins/Plugin.cs index 918a1e4ae3..36adac6a77 100644 --- a/src/neo/Plugins/Plugin.cs +++ b/src/neo/Plugins/Plugin.cs @@ -14,7 +14,6 @@ public abstract class Plugin : IDisposable public static readonly List Plugins = new List(); internal static readonly List Loggers = new List(); internal static readonly Dictionary Storages = new Dictionary(); - internal static readonly List RpcPlugins = new List(); internal static readonly List PersistencePlugins = new List(); internal static readonly List P2PPlugins = new List(); internal static readonly List TxObserverPlugins = new List(); @@ -52,7 +51,6 @@ protected Plugin() if (this is ILogPlugin logger) Loggers.Add(logger); if (this is IStoragePlugin storage) Storages.Add(Name, storage); if (this is IP2PPlugin p2p) P2PPlugins.Add(p2p); - if (this is IRpcPlugin rpc) RpcPlugins.Add(rpc); if (this is IPersistencePlugin persistence) PersistencePlugins.Add(persistence); if (this is IMemoryPoolTxObserverPlugin txObserver) TxObserverPlugins.Add(txObserver); diff --git a/src/neo/Utility.cs b/src/neo/Utility.cs index b6402a91c6..984422512e 100644 --- a/src/neo/Utility.cs +++ b/src/neo/Utility.cs @@ -1,65 +1,11 @@ using Microsoft.Extensions.Configuration; -using Neo.Cryptography.ECC; using Neo.Plugins; -using Neo.SmartContract; -using Neo.Wallets; using System; namespace Neo { public static class Utility { - /// - /// Parse WIF or private key hex string to KeyPair - /// - /// WIF or private key hex string - /// Example: WIF ("KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p"), PrivateKey ("450d6c2a04b5b470339a745427bae6828400cf048400837d73c415063835e005") - /// - public static KeyPair GetKeyPair(string key) - { - if (string.IsNullOrEmpty(key)) { throw new ArgumentNullException(nameof(key)); } - if (key.StartsWith("0x")) { key = key.Substring(2); } - - if (key.Length == 52) - { - return new KeyPair(Wallet.GetPrivateKeyFromWIF(key)); - } - else if (key.Length == 64) - { - return new KeyPair(key.HexToBytes()); - } - - throw new FormatException(); - } - - /// - /// Parse address, scripthash or public key string to UInt160 - /// - /// account address, scripthash or public key string - /// Example: address ("AV556nYUwyJKNv8Xy7hVMLQnkmKPukw6x5"), scripthash ("0x6a38cd693b615aea24dd00de12a9f5836844da91"), public key ("02f9ec1fd0a98796cf75b586772a4ddd41a0af07a1dbdf86a7238f74fb72503575") - /// - public static UInt160 GetScriptHash(string account) - { - if (string.IsNullOrEmpty(account)) { throw new ArgumentNullException(nameof(account)); } - if (account.StartsWith("0x")) { account = account.Substring(2); } - - if (account.Length == 34) - { - return Wallets.Helper.ToScriptHash(account); - } - else if (account.Length == 40) - { - return UInt160.Parse(account); - } - else if (account.Length == 66) - { - var pubKey = ECPoint.Parse(account, ECCurve.Secp256r1); - return Contract.CreateSignatureRedeemScript(pubKey).ToScriptHash(); - } - - throw new FormatException(); - } - /// /// Load configuration with different Environment Variable /// diff --git a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcBlock.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcBlock.cs deleted file mode 100644 index 860eafa076..0000000000 --- a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcBlock.cs +++ /dev/null @@ -1,29 +0,0 @@ -using FluentAssertions; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Neo.Network.P2P.Payloads; -using Neo.Network.RPC.Models; -using System; - -namespace Neo.UnitTests.Network.RPC.Models -{ - [TestClass] - public class UT_RpcBlock - { - [TestMethod] - public void TestToJson() - { - var rpcBlock = new RpcBlock(); - var block = new Block(); - TestUtils.SetupBlockWithValues(block, UInt256.Zero, out UInt256 _, out UInt160 _, out ulong _, out uint _, out Witness _, out Transaction[] _, 1); - rpcBlock.Block = block; - var json = rpcBlock.ToJson(); - json["previousblockhash"].AsString().Should().Be("0x0000000000000000000000000000000000000000000000000000000000000000"); - json.Should().NotBeNull(); - - rpcBlock.Confirmations = 1; - rpcBlock.NextBlockHash = UInt256.Zero; - json = rpcBlock.ToJson(); - json["confirmations"].AsNumber().Should().Be(1); - } - } -} diff --git a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcBlockHeader.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcBlockHeader.cs deleted file mode 100644 index 85a604d3e8..0000000000 --- a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcBlockHeader.cs +++ /dev/null @@ -1,29 +0,0 @@ -using FluentAssertions; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Neo.Network.P2P.Payloads; -using Neo.Network.RPC.Models; -using System; - -namespace Neo.UnitTests.Network.RPC.Models -{ - [TestClass] - public class UT_RpcBlockHeader - { - [TestMethod] - public void TestToJson() - { - var rpcBlockHeader = new RpcBlockHeader(); - var header = new Header(); - TestUtils.SetupHeaderWithValues(header, UInt256.Zero, out UInt256 _, out UInt160 _, out ulong _, out uint _, out Witness _); - rpcBlockHeader.Header = header; - var json = rpcBlockHeader.ToJson(); - json["previousblockhash"].AsString().Should().Be("0x0000000000000000000000000000000000000000000000000000000000000000"); - json.Should().NotBeNull(); - - rpcBlockHeader.Confirmations = 1; - rpcBlockHeader.NextBlockHash = UInt256.Zero; - json = rpcBlockHeader.ToJson(); - json["confirmations"].AsNumber().Should().Be(1); - } - } -} diff --git a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcNep5Balance.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcNep5Balance.cs deleted file mode 100644 index 9131db811a..0000000000 --- a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcNep5Balance.cs +++ /dev/null @@ -1,66 +0,0 @@ -using FluentAssertions; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Neo.IO.Json; -using Neo.Network.RPC.Models; -using System.Numerics; - -namespace Neo.UnitTests.Network.RPC.Models -{ - [TestClass] - public class UT_RpcNep5Balance - { - private RpcNep5Balance balance; - - [TestInitialize] - public void Setup() - { - balance = new RpcNep5Balance(); - } - - [TestMethod] - public void TestAssetHash() - { - balance.AssetHash = UInt160.Zero; - balance.AssetHash.Should().Be(UInt160.Zero); - } - - [TestMethod] - public void TestAmount() - { - balance.Amount = BigInteger.Zero; - balance.Amount.Should().Be(BigInteger.Zero); - } - - [TestMethod] - public void TestLastUpdatedBlock() - { - balance.LastUpdatedBlock = 0; - balance.LastUpdatedBlock.Should().Be(0); - } - - [TestMethod] - public void TestToJson() - { - balance.AssetHash = UInt160.Zero; - balance.Amount = BigInteger.Zero; - balance.LastUpdatedBlock = 0; - var json = balance.ToJson(); - json["asset_hash"].AsString().Should().Be("0x0000000000000000000000000000000000000000"); - json["amount"].AsNumber().Should().Be(0); - json["last_updated_block"].AsNumber().Should().Be(0); - } - - [TestMethod] - public void TestFromJson() - { - var json = new JObject(); - json["asset_hash"] = "0x0000000000000000000000000000000000000000"; - json["amount"] = "0"; - json["last_updated_block"] = "0"; - var rpcNep5Balance = RpcNep5Balance.FromJson(json); - rpcNep5Balance.AssetHash.Should().Be(UInt160.Zero); - rpcNep5Balance.Amount.Should().Be(BigInteger.Zero); - rpcNep5Balance.LastUpdatedBlock.Should().Be(0); - } - } -} diff --git a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcNep5Balances.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcNep5Balances.cs deleted file mode 100644 index 57601626ab..0000000000 --- a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcNep5Balances.cs +++ /dev/null @@ -1,66 +0,0 @@ -using FluentAssertions; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Neo.IO.Json; -using Neo.Network.RPC.Models; -using System.Numerics; - -namespace Neo.UnitTests.Network.RPC.Models -{ - [TestClass] - public class UT_RpcNep5Balances - { - private RpcNep5Balances balances; - - [TestInitialize] - public void Setup() - { - balances = new RpcNep5Balances() - { - Address = "abc", - Balances = new RpcNep5Balance[] { - new RpcNep5Balance() - { - AssetHash = UInt160.Zero, - Amount = BigInteger.Zero, - LastUpdatedBlock = 0 - }, - new RpcNep5Balance() - { - AssetHash = UInt160.Parse("0xa400ff00ff00ff00ff00ff00ff00ff00ff00ff01"), - Amount = new BigInteger(1), - LastUpdatedBlock = 1 - } - } - }; - } - - [TestMethod] - public void TestAddress() - { - balances.Address.Should().Be("abc"); - } - - [TestMethod] - public void TestBalances() - { - balances.Balances.Length.Should().Be(2); - } - - [TestMethod] - public void TestToJson() - { - var json = balances.ToJson(); - json["address"].AsString().Should().Be("abc"); - ((JArray)json["balance"]).Count.Should().Be(2); - } - - [TestMethod] - public void TestFromJson() - { - var json = balances.ToJson(); - var rpcNep5Balances = RpcNep5Balances.FromJson(json); - rpcNep5Balances.Address.Should().Be("abc"); - rpcNep5Balances.Balances.Length.Should().Be(2); - } - } -} diff --git a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcPeer.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcPeer.cs deleted file mode 100644 index b5c5044d13..0000000000 --- a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcPeer.cs +++ /dev/null @@ -1,23 +0,0 @@ -using FluentAssertions; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Neo.Network.RPC.Models; - -namespace Neo.UnitTests.Network.RPC.Models -{ - [TestClass] - public class UT_RpcPeer - { - [TestMethod] - public void TestToJson() - { - var rpcPeer = new RpcPeer() - { - Address = "abc", - Port = 800 - }; - var json = rpcPeer.ToJson(); - json["address"].AsString().Should().Be("abc"); - json["port"].AsNumber().Should().Be(800); - } - } -} diff --git a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcPeers.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcPeers.cs deleted file mode 100644 index cb6f6ff611..0000000000 --- a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcPeers.cs +++ /dev/null @@ -1,44 +0,0 @@ -using FluentAssertions; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Neo.IO.Json; -using Neo.Network.RPC.Models; - -namespace Neo.UnitTests.Network.RPC.Models -{ - [TestClass] - public class UT_RpcPeers - { - [TestMethod] - public void TestToJson() - { - var rpcPeers = new RpcPeers() - { - Unconnected = new RpcPeer[] { - new RpcPeer() - { - Address = "Unconnected", - Port = 600 - } - }, - Bad = new RpcPeer[] { - new RpcPeer() - { - Address = "Bad", - Port = 700 - } - }, - Connected = new RpcPeer[] { - new RpcPeer() - { - Address = "Connected", - Port = 800 - } - } - }; - var json = rpcPeers.ToJson(); - ((JArray)json["unconnected"]).Count.Should().Be(1); - ((JArray)json["bad"]).Count.Should().Be(1); - ((JArray)json["connected"]).Count.Should().Be(1); - } - } -} diff --git a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcRawMemPool.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcRawMemPool.cs deleted file mode 100644 index e8cb9bad7e..0000000000 --- a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcRawMemPool.cs +++ /dev/null @@ -1,29 +0,0 @@ -using FluentAssertions; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Neo.Network.RPC.Models; - -namespace Neo.UnitTests.Network.RPC.Models -{ - [TestClass] - public class UT_RpcRawMemPool - { - [TestMethod] - public void TestToJson() - { - var pool = new RpcRawMemPool - { - Height = 1, - Verified = new string[] { - "a", "b" - }, - UnVerified = new string[] { - "c", "d" - } - }; - var json = pool.ToJson(); - json["height"].AsNumber().Should().Be(1); - json["verified"].AsString().Should().Be("a,b"); - json["unverified"].AsString().Should().Be("c,d"); - } - } -} diff --git a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcRequest.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcRequest.cs deleted file mode 100644 index 8f2a3b4f74..0000000000 --- a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcRequest.cs +++ /dev/null @@ -1,31 +0,0 @@ -using FluentAssertions; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Neo.IO.Json; -using Neo.Network.RPC.Models; - -namespace Neo.UnitTests.Network.RPC.Models -{ - [TestClass] - public class UT_RpcRequest - { - [TestMethod] - public void TestFromJson() - { - var req = new RpcRequest() - { - Id = 1, - Jsonrpc = "myrpc", - Method = "get", - Params = new JObject[] { - new JBoolean(true) - } - }; - var json = req.ToJson(); - var rpcRequest = RpcRequest.FromJson(json); - rpcRequest.Jsonrpc.Should().Be("myrpc"); - rpcRequest.Method.Should().Be("get"); - rpcRequest.Id.Should().Be(1); - rpcRequest.Params.Length.Should().Be(1); - } - } -} diff --git a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcResponse.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcResponse.cs deleted file mode 100644 index 5c90eed92d..0000000000 --- a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcResponse.cs +++ /dev/null @@ -1,34 +0,0 @@ -using FluentAssertions; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Neo.IO.Json; -using Neo.Network.RPC.Models; - -namespace Neo.UnitTests.Network.RPC.Models -{ - [TestClass] - public class UT_RpcResponse - { - [TestMethod] - public void TestToJson() - { - var error = new RpcResponseError() - { - Code = 0, - Message = "msg", - Data = new JBoolean(true) - }; - var rep = new RpcResponse() - { - Id = 1, - Jsonrpc = "rpc", - Error = error, - Result = new JBoolean(true) - }; - var json = rep.ToJson(); - json["id"].AsNumber().Should().Be(1); - json["jsonrpc"].AsString().Should().Be("rpc"); - json["error"].AsString().Should().Be(error.ToJson().AsString()); - json["result"].AsBoolean().Should().BeTrue(); - } - } -} diff --git a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcVersion.cs b/tests/neo.UnitTests/Network/RPC/Models/UT_RpcVersion.cs deleted file mode 100644 index cbb9603907..0000000000 --- a/tests/neo.UnitTests/Network/RPC/Models/UT_RpcVersion.cs +++ /dev/null @@ -1,27 +0,0 @@ -using FluentAssertions; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Neo.Network.RPC.Models; - -namespace Neo.UnitTests.Network.RPC.Models -{ - [TestClass] - public class UT_RpcVersion - { - [TestMethod] - public void TestToJson() - { - var version = new RpcVersion() - { - TcpPort = 800, - WsPort = 900, - Nonce = 1, - UserAgent = "agent" - }; - var json = version.ToJson(); - json["topPort"].AsNumber().Should().Be(800); - json["wsPort"].AsNumber().Should().Be(900); - json["nonce"].AsNumber().Should().Be(1); - json["useragent"].AsString().Should().Be("agent"); - } - } -} diff --git a/tests/neo.UnitTests/Network/RPC/UT_ContractClient.cs b/tests/neo.UnitTests/Network/RPC/UT_ContractClient.cs deleted file mode 100644 index 13a02b5b9d..0000000000 --- a/tests/neo.UnitTests/Network/RPC/UT_ContractClient.cs +++ /dev/null @@ -1,59 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Moq; -using Neo.Network.RPC; -using Neo.SmartContract; -using Neo.SmartContract.Manifest; -using Neo.SmartContract.Native; -using Neo.VM; -using Neo.Wallets; - -namespace Neo.UnitTests.Network.RPC -{ - [TestClass] - public class UT_ContractClient - { - Mock rpcClientMock; - KeyPair keyPair1; - UInt160 sender; - - [TestInitialize] - public void TestSetup() - { - keyPair1 = new KeyPair(Wallet.GetPrivateKeyFromWIF("KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p")); - sender = Contract.CreateSignatureRedeemScript(keyPair1.PublicKey).ToScriptHash(); - rpcClientMock = UT_TransactionManager.MockRpcClient(sender, new byte[0]); - } - - [TestMethod] - public void TestInvoke() - { - byte[] testScript = NativeContract.GAS.Hash.MakeScript("balanceOf", UInt160.Zero); - UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.ByteArray, Value = "00e057eb481b".HexToBytes() }); - - ContractClient contractClient = new ContractClient(rpcClientMock.Object); - var result = contractClient.TestInvoke(NativeContract.GAS.Hash, "balanceOf", UInt160.Zero); - - Assert.AreEqual(30000000000000L, (long)result.Stack[0].ToStackItem().GetBigInteger()); - } - - [TestMethod] - public void TestDeployContract() - { - byte[] script; - var manifest = ContractManifest.CreateDefault(new byte[1].ToScriptHash()); - manifest.Features = ContractFeatures.HasStorage | ContractFeatures.Payable; - using (ScriptBuilder sb = new ScriptBuilder()) - { - sb.EmitSysCall(InteropService.Neo_Contract_Create, new byte[1], manifest.ToString()); - script = sb.ToArray(); - } - - UT_TransactionManager.MockInvokeScript(rpcClientMock, script, new ContractParameter()); - - ContractClient contractClient = new ContractClient(rpcClientMock.Object); - var result = contractClient.CreateDeployContractTx(new byte[1], manifest, keyPair1); - - Assert.IsNotNull(result); - } - } -} diff --git a/tests/neo.UnitTests/Network/RPC/UT_Helper.cs b/tests/neo.UnitTests/Network/RPC/UT_Helper.cs deleted file mode 100644 index cb791fa6ce..0000000000 --- a/tests/neo.UnitTests/Network/RPC/UT_Helper.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Neo.Network.RPC; -using System; -using System.Numerics; - -namespace Neo.UnitTests.Network.RPC -{ - [TestClass] - public class UT_Helper - { - [TestMethod] - public void TestToBigInteger() - { - decimal amount = 1.23456789m; - uint decimals = 9; - var result = amount.ToBigInteger(decimals); - Assert.AreEqual(1234567890, result); - - amount = 1.23456789m; - decimals = 18; - result = amount.ToBigInteger(decimals); - Assert.AreEqual(BigInteger.Parse("1234567890000000000"), result); - - amount = 1.23456789m; - decimals = 4; - Assert.ThrowsException(() => result = amount.ToBigInteger(decimals)); - } - } -} diff --git a/tests/neo.UnitTests/Network/RPC/UT_Nep5API.cs b/tests/neo.UnitTests/Network/RPC/UT_Nep5API.cs deleted file mode 100644 index 48fd711638..0000000000 --- a/tests/neo.UnitTests/Network/RPC/UT_Nep5API.cs +++ /dev/null @@ -1,112 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Moq; -using Neo.Network.RPC; -using Neo.SmartContract; -using Neo.SmartContract.Native; -using Neo.VM; -using Neo.Wallets; -using System.Linq; -using System.Numerics; - -namespace Neo.UnitTests.Network.RPC -{ - [TestClass] - public class UT_Nep5API - { - Mock rpcClientMock; - KeyPair keyPair1; - UInt160 sender; - Nep5API nep5API; - - [TestInitialize] - public void TestSetup() - { - keyPair1 = new KeyPair(Wallet.GetPrivateKeyFromWIF("KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p")); - sender = Contract.CreateSignatureRedeemScript(keyPair1.PublicKey).ToScriptHash(); - rpcClientMock = UT_TransactionManager.MockRpcClient(sender, new byte[0]); - nep5API = new Nep5API(rpcClientMock.Object); - } - - [TestMethod] - public void TestBalanceOf() - { - byte[] testScript = NativeContract.GAS.Hash.MakeScript("balanceOf", UInt160.Zero); - UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(10000) }); - - var balance = nep5API.BalanceOf(NativeContract.GAS.Hash, UInt160.Zero); - Assert.AreEqual(10000, (int)balance); - } - - [TestMethod] - public void TestGetName() - { - byte[] testScript = NativeContract.GAS.Hash.MakeScript("name"); - UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.String, Value = NativeContract.GAS.Name }); - - var result = nep5API.Name(NativeContract.GAS.Hash); - Assert.AreEqual(NativeContract.GAS.Name, result); - } - - [TestMethod] - public void TestGetSymbol() - { - byte[] testScript = NativeContract.GAS.Hash.MakeScript("symbol"); - UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.String, Value = NativeContract.GAS.Symbol }); - - var result = nep5API.Symbol(NativeContract.GAS.Hash); - Assert.AreEqual(NativeContract.GAS.Symbol, result); - } - - [TestMethod] - public void TestGetDecimals() - { - byte[] testScript = NativeContract.GAS.Hash.MakeScript("decimals"); - UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(NativeContract.GAS.Decimals) }); - - var result = nep5API.Decimals(NativeContract.GAS.Hash); - Assert.AreEqual(NativeContract.GAS.Decimals, (byte)result); - } - - [TestMethod] - public void TestGetTotalSupply() - { - byte[] testScript = NativeContract.GAS.Hash.MakeScript("totalSupply"); - UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1_00000000) }); - - var result = nep5API.TotalSupply(NativeContract.GAS.Hash); - Assert.AreEqual(1_00000000, (int)result); - } - - [TestMethod] - public void TestGetTokenInfo() - { - UInt160 scriptHash = NativeContract.GAS.Hash; - byte[] testScript = scriptHash.MakeScript("name") - .Concat(scriptHash.MakeScript("symbol")) - .Concat(scriptHash.MakeScript("decimals")) - .Concat(scriptHash.MakeScript("totalSupply")) - .ToArray(); ; - UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, - new ContractParameter { Type = ContractParameterType.String, Value = NativeContract.GAS.Name }, - new ContractParameter { Type = ContractParameterType.String, Value = NativeContract.GAS.Symbol }, - new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(NativeContract.GAS.Decimals) }, - new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1_00000000) }); - - var result = nep5API.GetTokenInfo(NativeContract.GAS.Hash); - Assert.AreEqual(NativeContract.GAS.Name, result.Name); - Assert.AreEqual(NativeContract.GAS.Symbol, result.Symbol); - Assert.AreEqual(8, (int)result.Decimals); - Assert.AreEqual(1_00000000, (int)result.TotalSupply); - } - - [TestMethod] - public void TestTransfer() - { - byte[] testScript = NativeContract.GAS.Hash.MakeScript("transfer", sender, UInt160.Zero, new BigInteger(1_00000000)); - UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter()); - - var result = nep5API.CreateTransferTx(NativeContract.GAS.Hash, keyPair1, UInt160.Zero, new BigInteger(1_00000000)); - Assert.IsNotNull(result); - } - } -} diff --git a/tests/neo.UnitTests/Network/RPC/UT_PolicyAPI.cs b/tests/neo.UnitTests/Network/RPC/UT_PolicyAPI.cs deleted file mode 100644 index 6b6c449111..0000000000 --- a/tests/neo.UnitTests/Network/RPC/UT_PolicyAPI.cs +++ /dev/null @@ -1,69 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Moq; -using Neo.Network.RPC; -using Neo.SmartContract; -using Neo.SmartContract.Native; -using Neo.VM; -using Neo.Wallets; -using System.Numerics; - -namespace Neo.UnitTests.Network.RPC -{ - [TestClass] - public class UT_PolicyAPI - { - Mock rpcClientMock; - KeyPair keyPair1; - UInt160 sender; - PolicyAPI policyAPI; - - [TestInitialize] - public void TestSetup() - { - keyPair1 = new KeyPair(Wallet.GetPrivateKeyFromWIF("KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p")); - sender = Contract.CreateSignatureRedeemScript(keyPair1.PublicKey).ToScriptHash(); - rpcClientMock = UT_TransactionManager.MockRpcClient(sender, new byte[0]); - policyAPI = new PolicyAPI(rpcClientMock.Object); - } - - [TestMethod] - public void TestGetMaxTransactionsPerBlock() - { - byte[] testScript = NativeContract.Policy.Hash.MakeScript("getMaxTransactionsPerBlock"); - UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(512) }); - - var result = policyAPI.GetMaxTransactionsPerBlock(); - Assert.AreEqual(512u, result); - } - - [TestMethod] - public void TestGetMaxBlockSize() - { - byte[] testScript = NativeContract.Policy.Hash.MakeScript("getMaxBlockSize"); - UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1024u * 256u) }); - - var result = policyAPI.GetMaxBlockSize(); - Assert.AreEqual(1024u * 256u, result); - } - - [TestMethod] - public void TestGetFeePerByte() - { - byte[] testScript = NativeContract.Policy.Hash.MakeScript("getFeePerByte"); - UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1000) }); - - var result = policyAPI.GetFeePerByte(); - Assert.AreEqual(1000L, result); - } - - [TestMethod] - public void TestGetBlockedAccounts() - { - byte[] testScript = NativeContract.Policy.Hash.MakeScript("getBlockedAccounts"); - UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Array, Value = new[] { new ContractParameter { Type = ContractParameterType.Hash160, Value = UInt160.Zero } } }); - - var result = policyAPI.GetBlockedAccounts(); - Assert.AreEqual(UInt160.Zero, result[0]); - } - } -} diff --git a/tests/neo.UnitTests/Network/RPC/UT_RpcClient.cs b/tests/neo.UnitTests/Network/RPC/UT_RpcClient.cs deleted file mode 100644 index a8b212fe37..0000000000 --- a/tests/neo.UnitTests/Network/RPC/UT_RpcClient.cs +++ /dev/null @@ -1,568 +0,0 @@ -using FluentAssertions; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Moq; -using Moq.Protected; -using Neo.IO; -using Neo.IO.Json; -using Neo.Ledger; -using Neo.Network.P2P.Payloads; -using Neo.Network.RPC; -using Neo.Network.RPC.Models; -using Neo.SmartContract; -using Neo.SmartContract.Manifest; -using Neo.VM; -using System; -using System.Linq; -using System.Net; -using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; - -namespace Neo.UnitTests.Network.RPC -{ - [TestClass] - public class UT_RpcClient - { - RpcClient rpc; - Mock handlerMock; - - [TestInitialize] - public void TestSetup() - { - handlerMock = new Mock(MockBehavior.Strict); - - // use real http client with mocked handler here - var httpClient = new HttpClient(handlerMock.Object) - { - BaseAddress = new Uri("http://seed1.neo.org:10331"), - }; - - rpc = new RpcClient(httpClient); - } - - private void MockResponse(string content) - { - handlerMock.Protected() - // Setup the PROTECTED method to mock - .Setup>( - "SendAsync", - ItExpr.IsAny(), - ItExpr.IsAny() - ) - // prepare the expected response of the mocked http call - .ReturnsAsync(new HttpResponseMessage() - { - StatusCode = HttpStatusCode.OK, - Content = new StringContent(content), - }) - .Verifiable(); - } - - private JObject CreateErrorResponse(JObject id, int code, string message, JObject data = null) - { - JObject response = CreateResponse(id); - response["error"] = new JObject(); - response["error"]["code"] = code; - response["error"]["message"] = message; - if (data != null) - response["error"]["data"] = data; - return response; - } - - private JObject CreateResponse(JObject id) - { - JObject response = new JObject(); - response["jsonrpc"] = "2.0"; - response["id"] = id; - return response; - } - - [TestMethod] - public void TestErrorResponse() - { - JObject response = CreateErrorResponse(null, -32700, "Parse error"); - MockResponse(response.ToString()); - try - { - var result = rpc.GetBlockHex("773dd2dae4a9c9275290f89b56e67d7363ea4826dfd4fc13cc01cf73a44b0d0e"); - } - catch (RpcException ex) - { - Assert.AreEqual(-32700, ex.HResult); - Assert.AreEqual("Parse error", ex.Message); - } - } - - [TestMethod] - public void TestGetBestBlockHash() - { - JObject response = CreateResponse(1); - response["result"] = "000000002deadfa82cbc4682f5800"; - MockResponse(response.ToString()); - - var result = rpc.GetBestBlockHash(); - Assert.AreEqual("000000002deadfa82cbc4682f5800", result); - } - - [TestMethod] - public void TestGetBlockHex() - { - JObject response = CreateResponse(1); - response["result"] = "000000002deadfa82cbc4682f5800"; - MockResponse(response.ToString()); - - var result = rpc.GetBlockHex("773dd2dae4a9c9275290f89b56e67d7363ea4826dfd4fc13cc01cf73a44b0d0e"); - Assert.AreEqual("000000002deadfa82cbc4682f5800", result); - } - - [TestMethod] - public void TestGetBlock() - { - // create block - var block = new Block(); - TestUtils.SetupBlockWithValues(block, UInt256.Zero, out _, out UInt160 _, out ulong _, out uint _, out Witness _, out Transaction[] _, 0); - - block.Transactions = new[] - { - TestUtils.GetTransaction(), - TestUtils.GetTransaction(), - TestUtils.GetTransaction() - }; - - JObject json = block.ToJson(); - json["confirmations"] = 20; - JObject response = CreateResponse(1); - response["result"] = json; - MockResponse(response.ToString()); - - var result = rpc.GetBlock("773dd2dae4a9c9275290f89b56e67d7363ea4826dfd4fc13cc01cf73a44b0d0e"); - Assert.AreEqual(block.Hash.ToString(), result.Block.Hash.ToString()); - Assert.IsNull(result.NextBlockHash); - Assert.AreEqual(20, result.Confirmations); - Assert.AreEqual(block.Transactions.Length, result.Block.Transactions.Length); - Assert.AreEqual(block.Transactions[0].Hash.ToString(), result.Block.Transactions[0].Hash.ToString()); - - // verbose with confirmations - json["confirmations"] = 20; - json["nextblockhash"] = "773dd2dae4a9c9275290f89b56e67d7363ea4826dfd4fc13cc01cf73a44b0d0e"; - MockResponse(response.ToString()); - result = rpc.GetBlock("773dd2dae4a9c9275290f89b56e67d7363ea4826dfd4fc13cc01cf73a44b0d0e"); - Assert.AreEqual(block.Hash.ToString(), result.Block.Hash.ToString()); - Assert.AreEqual(20, result.Confirmations); - Assert.AreEqual("0x773dd2dae4a9c9275290f89b56e67d7363ea4826dfd4fc13cc01cf73a44b0d0e", result.NextBlockHash.ToString()); - Assert.AreEqual(block.Transactions.Length, result.Block.Transactions.Length); - Assert.AreEqual(block.Transactions[0].Hash.ToString(), result.Block.Transactions[0].Hash.ToString()); - } - - [TestMethod] - public void TestGetBlockCount() - { - JObject response = CreateResponse(1); - response["result"] = 100; - MockResponse(response.ToString()); - - var result = rpc.GetBlockCount(); - Assert.AreEqual(100u, result); - } - - [TestMethod] - public void TestGetBlockHash() - { - JObject response = CreateResponse(1); - response["result"] = "0x4c1e879872344349067c3b1a30781eeb4f9040d3795db7922f513f6f9660b9b2"; - MockResponse(response.ToString()); - - var result = rpc.GetBlockHash(100); - Assert.AreEqual("0x4c1e879872344349067c3b1a30781eeb4f9040d3795db7922f513f6f9660b9b2", result); - } - - [TestMethod] - public void TestGetBlockHeaderHex() - { - JObject response = CreateResponse(1); - response["result"] = "0x4c1e879872344349067c3b1a30781eeb4f9040d3795db7922f513f6f9660b9b2"; - MockResponse(response.ToString()); - - var result = rpc.GetBlockHeaderHex("100"); - Assert.AreEqual("0x4c1e879872344349067c3b1a30781eeb4f9040d3795db7922f513f6f9660b9b2", result); - } - - [TestMethod] - public void TestGetBlockHeader() - { - Header header = new Header(); - TestUtils.SetupHeaderWithValues(header, UInt256.Zero, out UInt256 _, out UInt160 _, out ulong _, out uint _, out Witness _); - - JObject json = header.ToJson(); - json["confirmations"] = 20; - JObject response = CreateResponse(1); - response["result"] = json; - MockResponse(response.ToString()); - - var result = rpc.GetBlockHeader("100"); - Assert.AreEqual(header.Hash.ToString(), result.Header.Hash.ToString()); - Assert.IsNull(result.NextBlockHash); - Assert.AreEqual(20, result.Confirmations); - - json["confirmations"] = 20; - json["nextblockhash"] = "4c1e879872344349067c3b1a30781eeb4f9040d3795db7922f513f6f9660b9b2"; - MockResponse(response.ToString()); - result = rpc.GetBlockHeader("100"); - Assert.AreEqual(header.Hash.ToString(), result.Header.Hash.ToString()); - Assert.AreEqual(20, result.Confirmations); - } - - [TestMethod] - public void TestGetBlockSysFee() - { - JObject response = CreateResponse(1); - response["result"] = "195500"; - MockResponse(response.ToString()); - - var result = rpc.GetBlockSysFee(100); - Assert.AreEqual("195500", result); - } - - [TestMethod] - public void TestGetConnectionCount() - { - JObject response = CreateResponse(1); - response["result"] = 9; - MockResponse(response.ToString()); - - var result = rpc.GetConnectionCount(); - Assert.AreEqual(9, result); - } - - [TestMethod] - public void TestGetContractState() - { - byte[] script; - using (var sb = new ScriptBuilder()) - { - sb.EmitSysCall(InteropService.System_Runtime_GetInvocationCounter); - script = sb.ToArray(); - } - - ContractState state = new ContractState - { - Script = new byte[] { (byte)OpCode.DROP, (byte)OpCode.DROP }.Concat(script).ToArray(), - Manifest = ContractManifest.CreateDefault(UInt160.Parse("0xa400ff00ff00ff00ff00ff00ff00ff00ff00ff01")) - }; - - JObject response = CreateResponse(1); - response["result"] = state.ToJson(); - MockResponse(response.ToString()); - - var result = rpc.GetContractState("17694b31cc7ee215cea2ded146e0b2b28768fc46"); - - Assert.AreEqual(state.Script.ToHexString(), result.Script.ToHexString()); - Assert.AreEqual(state.Manifest.Abi.EntryPoint.Name, result.Manifest.Abi.EntryPoint.Name); - } - - [TestMethod] - public void TestGetPeers() - { - JObject response = CreateResponse(1); - response["result"] = JObject.Parse(@"{ - ""unconnected"": [ - { - ""address"": ""::ffff:70.73.16.236"", - ""port"": 10333 - }, - { - ""address"": ""::ffff:82.95.77.148"", - ""port"": 10333 - }, - { - ""address"": ""::ffff:49.50.215.166"", - ""port"": 10333 - } - ], - ""bad"": [], - ""connected"": [ - { - ""address"": ""::ffff:139.219.106.33"", - ""port"": 10333 - }, - { - ""address"": ""::ffff:47.88.53.224"", - ""port"": 10333 - } - ] - }"); - MockResponse(response.ToString()); - - var result = rpc.GetPeers(); - Assert.AreEqual("::ffff:139.219.106.33", result.Connected[0].Address); - Assert.AreEqual("::ffff:82.95.77.148", result.Unconnected[1].Address); - } - - [TestMethod] - public void TestGetRawMempool() - { - JObject response = CreateResponse(1); - response["result"] = JObject.Parse(@"[ - ""0x9786cce0dddb524c40ddbdd5e31a41ed1f6b5c8a683c122f627ca4a007a7cf4e"", - ""0xb488ad25eb474f89d5ca3f985cc047ca96bc7373a6d3da8c0f192722896c1cd7"", - ""0xf86f6f2c08fbf766ebe59dc84bc3b8829f1053f0a01deb26bf7960d99fa86cd6"" - ]"); - MockResponse(response.ToString()); - - var result = rpc.GetRawMempool(); - Assert.AreEqual("0xb488ad25eb474f89d5ca3f985cc047ca96bc7373a6d3da8c0f192722896c1cd7", result[1]); - } - - [TestMethod] - public void TestGetRawMempoolBoth() - { - JObject json = new JObject(); - json["height"] = 65535; - json["verified"] = new JArray(new[] { "0x9786cce0dddb524c40ddbdd5e31a41ed1f6b5c8a683c122f627ca4a007a7cf4e" }.Select(p => (JObject)p)); - json["unverified"] = new JArray(new[] { "0xb488ad25eb474f89d5ca3f985cc047ca96bc7373a6d3da8c0f192722896c1cd7", "0xf86f6f2c08fbf766ebe59dc84bc3b8829f1053f0a01deb26bf7960d99fa86cd6" }.Select(p => (JObject)p)); - - JObject response = CreateResponse(1); - response["result"] = json; - MockResponse(response.ToString()); - - var result = rpc.GetRawMempoolBoth(); - Assert.AreEqual(65535u, result.Height); - Assert.AreEqual("0x9786cce0dddb524c40ddbdd5e31a41ed1f6b5c8a683c122f627ca4a007a7cf4e", result.Verified[0]); - Assert.AreEqual("0xf86f6f2c08fbf766ebe59dc84bc3b8829f1053f0a01deb26bf7960d99fa86cd6", result.UnVerified[1]); - } - - [TestMethod] - public void TestGetRawTransactionHex() - { - var json = TestUtils.GetTransaction().ToArray().ToHexString(); - - JObject response = CreateResponse(1); - response["result"] = json; - MockResponse(response.ToString()); - - //var result = rpc.GetRawTransactionHex("0x9786cce0dddb524c40ddbdd5e31a41ed1f6b5c8a683c122f627ca4a007a7cf4e"); - var result = rpc.GetRawTransactionHex(TestUtils.GetTransaction().Hash.ToString()); - Assert.AreEqual(json, result); - } - - [TestMethod] - public void TestGetRawTransaction() - { - var transaction = TestUtils.GetTransaction(); - JObject json = transaction.ToJson(); - JObject response = CreateResponse(1); - response["result"] = json; - MockResponse(response.ToString()); - - var result = rpc.GetRawTransaction("0x9786cce0dddb524c40ddbdd5e31a41ed1f6b5c8a683c122f627ca4a007a7cf4e"); - Assert.AreEqual(transaction.Hash, result.Transaction.Hash); - Assert.AreEqual(json.ToString(), result.ToJson().ToString()); - - // make the code compatible with the old version - json["blockhash"] = UInt256.Zero.ToString(); - json["confirmations"] = 100; - json["blocktime"] = 10; - MockResponse(response.ToString()); - - result = rpc.GetRawTransaction("0x9786cce0dddb524c40ddbdd5e31a41ed1f6b5c8a683c122f627ca4a007a7cf4e"); - Assert.AreEqual(transaction.Hash, result.Transaction.Hash); - Assert.AreEqual(100, result.Confirmations); - Assert.AreEqual(null, result.VMState); - Assert.AreEqual(json.ToString(), result.ToJson().ToString()); - - json["vmState"] = VMState.HALT; - MockResponse(response.ToString()); - - result = rpc.GetRawTransaction("0x9786cce0dddb524c40ddbdd5e31a41ed1f6b5c8a683c122f627ca4a007a7cf4e"); - Assert.AreEqual(transaction.Hash, result.Transaction.Hash); - Assert.AreEqual(100, result.Confirmations); - Assert.AreEqual(VMState.HALT, result.VMState); - Assert.AreEqual(json.ToString(), result.ToJson().ToString()); - } - - [TestMethod] - public void TestGetStorage() - { - JObject json = "4c696e"; - JObject response = CreateResponse(1); - response["result"] = json; - MockResponse(response.ToString()); - - var result = rpc.GetStorage("03febccf81ac85e3d795bc5cbd4e84e907812aa3", "5065746572"); - Assert.AreEqual("4c696e", result); - } - - [TestMethod] - public void TestGetTransactionHeight() - { - JObject json = 10000; - JObject response = CreateResponse(1); - response["result"] = json; - MockResponse(response.ToString()); - - var result = rpc.GetTransactionHeight("9c909e1e3ba03290553a68d862e002c7a21ba302e043fc492fe069bf6a134d29"); - Assert.AreEqual(json.ToString(), result.ToString()); - } - - [TestMethod] - public void TestGetValidators() - { - JObject json = JObject.Parse(@"[ - { - ""publickey"": ""02486fd15702c4490a26703112a5cc1d0923fd697a33406bd5a1c00e0013b09a70"", - ""votes"": ""46632420"", - ""active"": true - }, - { - ""publickey"": ""024c7b7fb6c310fccf1ba33b082519d82964ea93868d676662d4a59ad548df0e7d"", - ""votes"": ""46632420"", - ""active"": true - } - ]"); - JObject response = CreateResponse(1); - response["result"] = json; - MockResponse(response.ToString()); - - var result = rpc.GetValidators(); - Assert.AreEqual(((JArray)json)[0].ToString(), (result[0]).ToJson().ToString()); - } - - [TestMethod] - public void TestGetVersion() - { - JObject json = new JObject(); - json["tcpPort"] = 30001; - json["wsPort"] = 30002; - json["nonce"] = 1546258664; - json["useragent"] = "/NEO:2.7.5/"; - - var json1 = JObject.Parse(@"{ - ""tcpPort"": 30001, - ""wsPort"": 30002, - ""nonce"": 1546258664, - ""useragent"": ""/NEO:2.7.5/"" - }"); - Assert.AreEqual(json.ToString(), json1.ToString()); - - JObject response = CreateResponse(1); - response["result"] = json; - MockResponse(response.ToString()); - - var result = rpc.GetVersion(); - Assert.AreEqual(30001, result.TcpPort); - Assert.AreEqual("/NEO:2.7.5/", result.UserAgent); - } - - [TestMethod] - public void TestInvokeFunction() - { - JObject json = JObject.Parse(@" - { - ""script"": ""1426ae7c6c9861ec418468c1f0fdc4a7f2963eb89151c10962616c616e63654f6667be39e7b562f60cbfe2aebca375a2e5ee28737caf"", - ""state"": ""HALT"", - ""gas_consumed"": ""0.311"", - ""stack"": [ - { - ""type"": ""ByteArray"", - ""value"": ""262bec084432"" - } - ] - }"); - JObject response = CreateResponse(1); - response["result"] = json; - MockResponse(response.ToString()); - - var result = rpc.InvokeFunction("af7c7328eee5a275a3bcaee2bf0cf662b5e739be", "balanceOf", new[] { new RpcStack { Type = "Hash160", Value = "91b83e96f2a7c4fdf0c1688441ec61986c7cae26" } }); - Assert.AreEqual(json.ToString(), result.ToJson().ToString()); - } - - [TestMethod] - public void TestInvokeScript() - { - JObject json = JObject.Parse(@" - { - ""script"": ""1426ae7c6c9861ec418468c1f0fdc4a7f2963eb89151c10962616c616e63654f6667be39e7b562f60cbfe2aebca375a2e5ee28737caf"", - ""state"": ""HALT"", - ""gas_consumed"": ""0.311"", - ""stack"": [ - { - ""type"": ""ByteArray"", - ""value"": ""262bec084432"" - } - ] - }"); - JObject response = CreateResponse(1); - response["result"] = json; - MockResponse(response.ToString()); - - var result = rpc.InvokeScript("00046e616d656724058e5e1b6008847cd662728549088a9ee82191".HexToBytes()); - Assert.AreEqual(json.ToString(), result.ToJson().ToString()); - } - - [TestMethod] - public void TestListPlugins() - { - JObject json = JObject.Parse(@"[{ - ""name"": ""SimplePolicyPlugin"", - ""version"": ""2.10.1.0"", - ""interfaces"": [ - ""ILogPlugin"", - ""IPolicyPlugin"" - ] - }]"); - JObject response = CreateResponse(1); - response["result"] = json; - MockResponse(response.ToString()); - - var result = rpc.ListPlugins(); - Assert.AreEqual(((JArray)json)[0].ToString(), result[0].ToJson().ToString()); - } - - [TestMethod] - public void TestSendRawTransaction() - { - JObject json = true; - JObject response = CreateResponse(1); - response["result"] = json; - MockResponse(response.ToString()); - - var result = rpc.SendRawTransaction("80000001195876cb34364dc38b730077156c6bc3a7fc570044a66fbfeeea56f71327e8ab0000029b7cffdaa674beae0f930ebe6085af9093e5fe56b34a5c220ccdcf6efc336fc500c65eaf440000000f9a23e06f74cf86b8827a9108ec2e0f89ad956c9b7cffdaa674beae0f930ebe6085af9093e5fe56b34a5c220ccdcf6efc336fc50092e14b5e00000030aab52ad93f6ce17ca07fa88fc191828c58cb71014140915467ecd359684b2dc358024ca750609591aa731a0b309c7fb3cab5cd0836ad3992aa0a24da431f43b68883ea5651d548feb6bd3c8e16376e6e426f91f84c58232103322f35c7819267e721335948d385fae5be66e7ba8c748ac15467dcca0693692dac".HexToBytes()); - Assert.AreEqual(json.ToString(), ((JObject)result).ToString()); - } - - [TestMethod] - public void TestSubmitBlock() - { - JObject json = true; - JObject response = CreateResponse(1); - response["result"] = json; - MockResponse(response.ToString()); - - var result = rpc.SubmitBlock("03febccf81ac85e3d795bc5cbd4e84e907812aa3".HexToBytes()); - Assert.AreEqual(json.ToString(), ((JObject)result).ToString()); - } - - [TestMethod] - public void TestValidateAddress() - { - JObject json = new JObject(); - json["address"] = "AQVh2pG732YvtNaxEGkQUei3YA4cvo7d2i"; - json["isvalid"] = false; - JObject response = CreateResponse(1); - response["result"] = json; - MockResponse(response.ToString()); - - var result = rpc.ValidateAddress("AQVh2pG732YvtNaxEGkQUei3YA4cvo7d2i"); - Assert.AreEqual(json.ToString(), result.ToJson().ToString()); - } - - [TestMethod] - public void TestConstructorByUrlAndDispose() - { - //dummy url for test - var client = new RpcClient("http://www.xxx.yyy"); - Action action = () => client.Dispose(); - action.Should().NotThrow(); - } - } -} diff --git a/tests/neo.UnitTests/Network/RPC/UT_RpcServer.cs b/tests/neo.UnitTests/Network/RPC/UT_RpcServer.cs deleted file mode 100644 index cfdfe7fbd8..0000000000 --- a/tests/neo.UnitTests/Network/RPC/UT_RpcServer.cs +++ /dev/null @@ -1,47 +0,0 @@ -using FluentAssertions; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Neo.Network.RPC; -using System; -using System.Net; - -namespace Neo.UnitTests.Network.RPC -{ - [TestClass] - public class UT_RpcServer - { - private RpcServer server; - - [TestInitialize] - public void Setup() - { - server = new RpcServer(TestBlockchain.TheNeoSystem); - } - - [TestCleanup] - public void TestDispose() - { - server.Dispose(); - } - - [TestMethod] - public void TestWallet() - { - var wallet = TestUtils.GenerateTestWallet(); - server.Wallet = wallet; - server.Wallet.Should().Be(wallet); - } - - [TestMethod] - public void TestMaxGasInvoke() - { - server.MaxGasInvoke.Should().Be(0); - } - - [TestMethod] - public void TestStart() - { - Action action = () => server.Start(IPAddress.Parse("127.0.0.1"), 8999); - action.Should().NotThrow(); - } - } -} diff --git a/tests/neo.UnitTests/Network/RPC/UT_TransactionManager.cs b/tests/neo.UnitTests/Network/RPC/UT_TransactionManager.cs deleted file mode 100644 index 6fb69800cb..0000000000 --- a/tests/neo.UnitTests/Network/RPC/UT_TransactionManager.cs +++ /dev/null @@ -1,193 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Moq; -using Neo.Cryptography; -using Neo.IO; -using Neo.IO.Json; -using Neo.Ledger; -using Neo.Network.P2P; -using Neo.Network.P2P.Payloads; -using Neo.Network.RPC; -using Neo.Network.RPC.Models; -using Neo.SmartContract; -using Neo.SmartContract.Native; -using Neo.VM; -using Neo.Wallets; -using System; -using System.Linq; -using System.Numerics; - -namespace Neo.UnitTests.Network.RPC -{ - [TestClass] - public class UT_TransactionManager - { - TransactionManager txManager; - Mock rpcClientMock; - KeyPair keyPair1; - KeyPair keyPair2; - UInt160 sender; - - [TestInitialize] - public void TestSetup() - { - keyPair1 = new KeyPair(Wallet.GetPrivateKeyFromWIF("KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p")); - keyPair2 = new KeyPair(Wallet.GetPrivateKeyFromWIF("L2LGkrwiNmUAnWYb1XGd5mv7v2eDf6P4F3gHyXSrNJJR4ArmBp7Q")); - sender = Contract.CreateSignatureRedeemScript(keyPair1.PublicKey).ToScriptHash(); - rpcClientMock = MockRpcClient(sender, new byte[1]); - } - - public static Mock MockRpcClient(UInt160 sender, byte[] script) - { - var mockRpc = new Mock(MockBehavior.Strict, "http://seed1.neo.org:10331"); - - // MockHeight - mockRpc.Setup(p => p.RpcSend("getblockcount")).Returns(100).Verifiable(); - - // MockGasBalance - byte[] balanceScript = NativeContract.GAS.Hash.MakeScript("balanceOf", sender); - var balanceResult = new ContractParameter() { Type = ContractParameterType.Integer, Value = BigInteger.Parse("10000000000000000") }; - - MockInvokeScript(mockRpc, balanceScript, balanceResult); - - // MockFeePerByte - byte[] policyScript = NativeContract.Policy.Hash.MakeScript("getFeePerByte"); - var policyResult = new ContractParameter() { Type = ContractParameterType.Integer, Value = BigInteger.Parse("1000") }; - - MockInvokeScript(mockRpc, policyScript, policyResult); - - // MockGasConsumed - var result = new ContractParameter(); - MockInvokeScript(mockRpc, script, result); - - return mockRpc; - } - - public static void MockInvokeScript(Mock mockClient, byte[] script, params ContractParameter[] parameters) - { - var result = new RpcInvokeResult() - { - Stack = parameters, - GasConsumed = "100", - Script = script.ToHexString(), - State = "" - }; - - mockClient.Setup(p => p.RpcSend("invokescript", It.Is(j => j[0].AsString() == script.ToHexString()))) - .Returns(result.ToJson()) - .Verifiable(); - } - - [TestMethod] - public void TestMakeTransaction() - { - txManager = new TransactionManager(rpcClientMock.Object, sender); - - TransactionAttribute[] attributes = new TransactionAttribute[1] - { - new TransactionAttribute - { - Usage = TransactionAttributeUsage.Url, - Data = "53616d706c6555726c".HexToBytes() // "SampleUrl" - } - }; - - byte[] script = new byte[1]; - txManager.MakeTransaction(script, attributes, null, 60000); - - var tx = txManager.Tx; - Assert.AreEqual("53616d706c6555726c", tx.Attributes[0].Data.ToHexString()); - Assert.AreEqual(0, tx.SystemFee % (long)NativeContract.GAS.Factor); - Assert.AreEqual(60000, tx.NetworkFee); - } - - [TestMethod] - public void TestSign() - { - txManager = new TransactionManager(rpcClientMock.Object, sender); - - TransactionAttribute[] attributes = new TransactionAttribute[1] - { - new TransactionAttribute - { - Usage = TransactionAttributeUsage.Url, - Data = "53616d706c6555726c".HexToBytes() // "SampleUrl" - } - }; - - byte[] script = new byte[1]; - txManager.MakeTransaction(script, attributes) - .AddSignature(keyPair1) - .Sign(); - - // get signature from Witnesses - var tx = txManager.Tx; - byte[] signature = tx.Witnesses[0].InvocationScript.Skip(1).ToArray(); - - Assert.IsTrue(Crypto.VerifySignature(tx.GetHashData(), signature, keyPair1.PublicKey.EncodePoint(false).Skip(1).ToArray())); - - // duplicate sign should not add new witness - txManager.AddSignature(keyPair1).Sign(); - Assert.AreEqual(1, txManager.Tx.Witnesses.Length); - - // throw exception when the KeyPair is wrong - Assert.ThrowsException(() => txManager.AddSignature(keyPair2)); - } - - [TestMethod] - public void TestSignMulti() - { - txManager = new TransactionManager(rpcClientMock.Object, sender); - - var multiContract = Contract.CreateMultiSigContract(2, keyPair1.PublicKey, keyPair2.PublicKey); - - // Cosigner needs multi signature - Cosigner[] cosigners = new Cosigner[1] - { - new Cosigner - { - Account = multiContract.ScriptHash, - Scopes = WitnessScope.Global - } - }; - - byte[] script = new byte[1]; - txManager.MakeTransaction(script, null, cosigners, 0_10000000) - .AddMultiSig(keyPair1, 2, keyPair1.PublicKey, keyPair2.PublicKey) - .AddMultiSig(keyPair2, 2, keyPair1.PublicKey, keyPair2.PublicKey) - .AddSignature(keyPair1) - .Sign(); - - var snapshot = Blockchain.Singleton.GetSnapshot(); - - var tx = txManager.Tx; - Assert.IsTrue(tx.VerifyWitnesses(snapshot, tx.NetworkFee)); - } - - [TestMethod] - public void TestAddWitness() - { - txManager = new TransactionManager(rpcClientMock.Object, sender); - - // Cosigner as contract scripthash - Cosigner[] cosigners = new Cosigner[1] - { - new Cosigner - { - Account = UInt160.Zero, - Scopes = WitnessScope.Global - } - }; - - byte[] script = new byte[1]; - txManager.MakeTransaction(script, null, cosigners, 0_10000000); - txManager.AddWitness(UInt160.Zero); - txManager.AddSignature(keyPair1); - txManager.Sign(); - - var tx = txManager.Tx; - Assert.AreEqual(2, tx.Witnesses.Length); - Assert.AreEqual(0, tx.Witnesses[0].VerificationScript.Length); - Assert.AreEqual(0, tx.Witnesses[0].InvocationScript.Length); - } - } -} diff --git a/tests/neo.UnitTests/Network/RPC/UT_WalletAPI.cs b/tests/neo.UnitTests/Network/RPC/UT_WalletAPI.cs deleted file mode 100644 index bba6a787e1..0000000000 --- a/tests/neo.UnitTests/Network/RPC/UT_WalletAPI.cs +++ /dev/null @@ -1,116 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Moq; -using Neo.IO.Json; -using Neo.Network.P2P.Payloads; -using Neo.Network.RPC; -using Neo.Network.RPC.Models; -using Neo.SmartContract; -using Neo.SmartContract.Native; -using Neo.VM; -using Neo.Wallets; -using System.Numerics; - -namespace Neo.UnitTests.Network.RPC -{ - [TestClass] - public class UT_WalletAPI - { - Mock rpcClientMock; - KeyPair keyPair1; - string address1; - UInt160 sender; - WalletAPI walletAPI; - - [TestInitialize] - public void TestSetup() - { - keyPair1 = new KeyPair(Wallet.GetPrivateKeyFromWIF("KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p")); - sender = Contract.CreateSignatureRedeemScript(keyPair1.PublicKey).ToScriptHash(); - address1 = Neo.Wallets.Helper.ToAddress(sender); - rpcClientMock = UT_TransactionManager.MockRpcClient(sender, new byte[0]); - walletAPI = new WalletAPI(rpcClientMock.Object); - } - - [TestMethod] - public void TestGetUnclaimedGas() - { - byte[] testScript = NativeContract.NEO.Hash.MakeScript("unclaimedGas", sender, 99); - UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1_10000000) }); - - var balance = walletAPI.GetUnclaimedGas(address1); - Assert.AreEqual(1.1m, balance); - } - - [TestMethod] - public void TestGetNeoBalance() - { - byte[] testScript = NativeContract.NEO.Hash.MakeScript("balanceOf", sender); - UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1_00000000) }); - - var balance = walletAPI.GetNeoBalance(address1); - Assert.AreEqual(1_00000000u, balance); - } - - [TestMethod] - public void TestGetGasBalance() - { - byte[] testScript = NativeContract.GAS.Hash.MakeScript("balanceOf", sender); - UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1_10000000) }); - - var balance = walletAPI.GetGasBalance(address1); - Assert.AreEqual(1.1m, balance); - } - - [TestMethod] - public void TestGetTokenBalance() - { - byte[] testScript = UInt160.Zero.MakeScript("balanceOf", sender); - UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1_10000000) }); - - var balance = walletAPI.GetTokenBalance(UInt160.Zero.ToString(), address1); - Assert.AreEqual(1_10000000, balance); - } - - [TestMethod] - public void TestClaimGas() - { - byte[] balanceScript = NativeContract.NEO.Hash.MakeScript("balanceOf", sender); - UT_TransactionManager.MockInvokeScript(rpcClientMock, balanceScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1_00000000) }); - - byte[] testScript = NativeContract.NEO.Hash.MakeScript("transfer", sender, sender, new BigInteger(1_00000000)); - UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1_10000000) }); - - rpcClientMock.Setup(p => p.RpcSend("sendrawtransaction", It.IsAny())).Returns(true); - - var tranaction = walletAPI.ClaimGas(keyPair1.Export()); - Assert.AreEqual(testScript.ToHexString(), tranaction.Script.ToHexString()); - } - - [TestMethod] - public void TestTransfer() - { - byte[] decimalsScript = NativeContract.GAS.Hash.MakeScript("decimals"); - UT_TransactionManager.MockInvokeScript(rpcClientMock, decimalsScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(8) }); - - byte[] testScript = NativeContract.GAS.Hash.MakeScript("transfer", sender, UInt160.Zero, NativeContract.GAS.Factor * 100); - UT_TransactionManager.MockInvokeScript(rpcClientMock, testScript, new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1_10000000) }); - - rpcClientMock.Setup(p => p.RpcSend("sendrawtransaction", It.IsAny())).Returns(true); - - var tranaction = walletAPI.Transfer(NativeContract.GAS.Hash.ToString(), keyPair1.Export(), UInt160.Zero.ToAddress(), 100, 1.1m); - Assert.AreEqual(testScript.ToHexString(), tranaction.Script.ToHexString()); - } - - [TestMethod] - public void TestWaitTransaction() - { - Transaction transaction = TestUtils.GetTransaction(); - rpcClientMock.Setup(p => p.RpcSend("getrawtransaction", It.Is(j => j[0].AsString() == transaction.Hash.ToString()))) - .Returns(new RpcTransaction { Transaction = transaction, VMState = VMState.HALT, BlockHash = UInt256.Zero, BlockTime = 100, Confirmations = 1 }.ToJson()); - - var tx = walletAPI.WaitTransaction(transaction).Result; - Assert.AreEqual(VMState.HALT, tx.VMState); - Assert.AreEqual(UInt256.Zero, tx.BlockHash); - } - } -} diff --git a/tests/neo.UnitTests/UT_NeoSystem.cs b/tests/neo.UnitTests/UT_NeoSystem.cs index 1ed00464fa..5e440d8374 100644 --- a/tests/neo.UnitTests/UT_NeoSystem.cs +++ b/tests/neo.UnitTests/UT_NeoSystem.cs @@ -25,8 +25,5 @@ public void Setup() [TestMethod] public void TestGetConsensus() => neoSystem.Consensus.Should().BeNull(); - - [TestMethod] - public void TestGetRpcServer() => neoSystem.RpcServer.Should().BeNull(); } } diff --git a/tests/neo.UnitTests/UT_Utility.cs b/tests/neo.UnitTests/UT_Utility.cs deleted file mode 100644 index dd68da017c..0000000000 --- a/tests/neo.UnitTests/UT_Utility.cs +++ /dev/null @@ -1,55 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Neo.SmartContract; -using Neo.Wallets; -using System; - -namespace Neo.UnitTests -{ - [TestClass] - public class UT_Utility - { - private KeyPair keyPair; - private UInt160 scriptHash; - - [TestInitialize] - public void TestSetup() - { - keyPair = new KeyPair(Wallet.GetPrivateKeyFromWIF("KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p")); - scriptHash = Contract.CreateSignatureRedeemScript(keyPair.PublicKey).ToScriptHash(); - } - - [TestMethod] - public void TestGetKeyPair() - { - string nul = null; - Assert.ThrowsException(() => Utility.GetKeyPair(nul)); - - string wif = "KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p"; - var result = Utility.GetKeyPair(wif); - Assert.AreEqual(keyPair, result); - - string privateKey = keyPair.PrivateKey.ToHexString(); - result = Utility.GetKeyPair(privateKey); - Assert.AreEqual(keyPair, result); - } - - [TestMethod] - public void TestGetScriptHash() - { - string nul = null; - Assert.ThrowsException(() => Utility.GetScriptHash(nul)); - - string addr = scriptHash.ToAddress(); - var result = Utility.GetScriptHash(addr); - Assert.AreEqual(scriptHash, result); - - string hash = scriptHash.ToString(); - result = Utility.GetScriptHash(hash); - Assert.AreEqual(scriptHash, result); - - string publicKey = keyPair.PublicKey.ToString(); - result = Utility.GetScriptHash(publicKey); - Assert.AreEqual(scriptHash, result); - } - } -}