diff --git a/.travis.yml b/.travis.yml index 59b745ca31..6691c787d3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,33 +2,27 @@ language: csharp os: - linux - - osx dist: bionic -osx_image: xcode9.1 - mono: none -dotnet: 2.2.402 +dotnet: 3.0.100 env: - TEST_SUITE="without-cultures" - TEST_SUITE="cultures" -before_install: - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ulimit -n 2048; fi install: - - dotnet tool install -g dotnet-format --version 4.0.40103 --add-source https://dotnet.myget.org/F/format/api/v3/index.json + - dotnet tool install -g dotnet-format - export PATH="$PATH:$HOME/.dotnet/tools" - dotnet-format --version -before_script: - - echo "Checking format..." - - dotnet format --check --dry-run -w . -v diagnostic # check C# formatting for neo.sln - - cd neo.UnitTests script: | + echo "Checking format..." + dotnet format --check --dry-run -w . -v diagnostic # check C# formatting for neo.sln + cd neo.UnitTests if [[ "$TEST_SUITE" == "cultures" ]]; then dotnet test -v m --filter FullyQualifiedName=Neo.UnitTests.UT_Culture.All_Tests_Cultures else - if [[ "$TEST_SUITE" == "without-cultures" && "$TRAVIS_OS_NAME" == "linux" ]]; then + if [[ "$TEST_SUITE" == "without-cultures" ]]; then # Test & Calculate coverage find * -name *.csproj | xargs -I % dotnet add % package coverlet.msbuild dotnet test -v m --filter FullyQualifiedName!=Neo.UnitTests.UT_Culture.All_Tests_Cultures /p:CollectCoverage=true /p:CoverletOutputFormat=opencover @@ -38,7 +32,7 @@ script: | fi fi after_success: | - if [[ "$TEST_SUITE" == "without-cultures" && "$TRAVIS_OS_NAME" == "linux" ]]; then + if [[ "$TEST_SUITE" == "without-cultures" ]]; then # Send coverage echo "Test Success - Branch($TRAVIS_BRANCH) Pull Request($TRAVIS_PULL_REQUEST) Tag($TRAVIS_TAG)" bash <(curl -s https://codecov.io/bash) -v diff --git a/neo.UnitTests/Extensions/NativeContractExtensions.cs b/neo.UnitTests/Extensions/NativeContractExtensions.cs index 4d3f7bcb95..9847bddd48 100644 --- a/neo.UnitTests/Extensions/NativeContractExtensions.cs +++ b/neo.UnitTests/Extensions/NativeContractExtensions.cs @@ -2,6 +2,7 @@ using Neo.SmartContract; using Neo.SmartContract.Native; using Neo.VM; +using Neo.VM.Types; using System; namespace Neo.UnitTests.Extensions diff --git a/neo.UnitTests/Extensions/Nep5NativeContractExtensions.cs b/neo.UnitTests/Extensions/Nep5NativeContractExtensions.cs index a531591d34..f06a7eb201 100644 --- a/neo.UnitTests/Extensions/Nep5NativeContractExtensions.cs +++ b/neo.UnitTests/Extensions/Nep5NativeContractExtensions.cs @@ -7,7 +7,6 @@ using System.IO; using System.Linq; using System.Numerics; -using System.Text; namespace Neo.UnitTests.Extensions { @@ -65,7 +64,7 @@ public static bool Transfer(this NativeContract contract, Persistence.Snapshot s var result = engine.ResultStack.Pop(); result.Should().BeOfType(typeof(VM.Types.Boolean)); - return (result as VM.Types.Boolean).GetBoolean(); + return result.ToBoolean(); } public static string[] SupportedStandards(this NativeContract contract) @@ -86,7 +85,7 @@ public static string[] SupportedStandards(this NativeContract contract) result.Should().BeOfType(typeof(VM.Types.Array)); return (result as VM.Types.Array).ToArray() - .Select(u => Encoding.ASCII.GetString(u.GetByteArray())) + .Select(u => u.GetString()) .ToArray(); } @@ -168,7 +167,7 @@ public static string Symbol(this NativeContract contract) var result = engine.ResultStack.Pop(); result.Should().BeOfType(typeof(VM.Types.ByteArray)); - return Encoding.UTF8.GetString((result as VM.Types.ByteArray).GetByteArray()); + return result.GetString(); } public static string Name(this NativeContract contract) @@ -188,7 +187,7 @@ public static string Name(this NativeContract contract) var result = engine.ResultStack.Pop(); result.Should().BeOfType(typeof(VM.Types.ByteArray)); - return Encoding.UTF8.GetString((result as VM.Types.ByteArray).GetByteArray()); + return result.GetString(); } } } diff --git a/neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs b/neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs index c8c874cee6..cf5f4504fe 100644 --- a/neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs +++ b/neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs @@ -159,7 +159,7 @@ public void FeeIsMultiSigContract() engine.LoadScript(witness.InvocationScript); Assert.AreEqual(VMState.HALT, engine.Execute()); Assert.AreEqual(1, engine.ResultStack.Count); - Assert.IsTrue(engine.ResultStack.Pop().GetBoolean()); + Assert.IsTrue(engine.ResultStack.Pop().ToBoolean()); verificationGas += engine.GasConsumed; } } @@ -246,7 +246,7 @@ public void FeeIsSignatureContractDetailed() engine.LoadScript(witness.InvocationScript); Assert.AreEqual(VMState.HALT, engine.Execute()); Assert.AreEqual(1, engine.ResultStack.Count); - Assert.IsTrue(engine.ResultStack.Pop().GetBoolean()); + Assert.IsTrue(engine.ResultStack.Pop().ToBoolean()); verificationGas += engine.GasConsumed; } } @@ -364,7 +364,7 @@ public void FeeIsSignatureContract_TestScope_Global() engine.LoadScript(witness.InvocationScript); Assert.AreEqual(VMState.HALT, engine.Execute()); Assert.AreEqual(1, engine.ResultStack.Count); - Assert.IsTrue(engine.ResultStack.Pop().GetBoolean()); + Assert.IsTrue(engine.ResultStack.Pop().ToBoolean()); verificationGas += engine.GasConsumed; } } @@ -456,7 +456,7 @@ public void FeeIsSignatureContract_TestScope_CurrentHash_GAS() engine.LoadScript(witness.InvocationScript); Assert.AreEqual(VMState.HALT, engine.Execute()); Assert.AreEqual(1, engine.ResultStack.Count); - Assert.IsTrue(engine.ResultStack.Pop().GetBoolean()); + Assert.IsTrue(engine.ResultStack.Pop().ToBoolean()); verificationGas += engine.GasConsumed; } } @@ -551,7 +551,7 @@ public void FeeIsSignatureContract_TestScope_CalledByEntry_Plus_GAS() engine.LoadScript(witness.InvocationScript); Assert.AreEqual(VMState.HALT, engine.Execute()); Assert.AreEqual(1, engine.ResultStack.Count); - Assert.IsTrue(engine.ResultStack.Pop().GetBoolean()); + Assert.IsTrue(engine.ResultStack.Pop().ToBoolean()); verificationGas += engine.GasConsumed; } } @@ -706,7 +706,7 @@ public void FeeIsSignatureContract_TestScope_CurrentHash_NEO_GAS() engine.LoadScript(witness.InvocationScript); Assert.AreEqual(VMState.HALT, engine.Execute()); Assert.AreEqual(1, engine.ResultStack.Count); - Assert.IsTrue(engine.ResultStack.Pop().GetBoolean()); + Assert.IsTrue(engine.ResultStack.Pop().ToBoolean()); verificationGas += engine.GasConsumed; } } @@ -1054,7 +1054,7 @@ public void FeeIsSignatureContract_TestScope_Global_Default() engine.LoadScript(witness.InvocationScript); Assert.AreEqual(VMState.HALT, engine.Execute()); Assert.AreEqual(1, engine.ResultStack.Count); - Assert.IsTrue(engine.ResultStack.Pop().GetBoolean()); + Assert.IsTrue(engine.ResultStack.Pop().ToBoolean()); verificationGas += engine.GasConsumed; } } diff --git a/neo.UnitTests/SmartContract/Enumerators/UT_IteratorKeysWrapper.cs b/neo.UnitTests/SmartContract/Enumerators/UT_IteratorKeysWrapper.cs index 2a345893e0..12b82be599 100644 --- a/neo.UnitTests/SmartContract/Enumerators/UT_IteratorKeysWrapper.cs +++ b/neo.UnitTests/SmartContract/Enumerators/UT_IteratorKeysWrapper.cs @@ -2,7 +2,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Neo.SmartContract.Enumerators; using Neo.SmartContract.Iterators; -using Neo.VM; +using Neo.VM.Types; using System; using System.Collections.Generic; diff --git a/neo.UnitTests/SmartContract/Enumerators/UT_IteratorValuesWrapper.cs b/neo.UnitTests/SmartContract/Enumerators/UT_IteratorValuesWrapper.cs index f236faab1a..2e8bf5709b 100644 --- a/neo.UnitTests/SmartContract/Enumerators/UT_IteratorValuesWrapper.cs +++ b/neo.UnitTests/SmartContract/Enumerators/UT_IteratorValuesWrapper.cs @@ -2,7 +2,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Neo.SmartContract.Enumerators; using Neo.SmartContract.Iterators; -using Neo.VM; +using Neo.VM.Types; using System; using System.Collections.Generic; diff --git a/neo.UnitTests/SmartContract/Iterators/UT_MapWrapper.cs b/neo.UnitTests/SmartContract/Iterators/UT_MapWrapper.cs index b111b0aa54..7ce7c7e845 100644 --- a/neo.UnitTests/SmartContract/Iterators/UT_MapWrapper.cs +++ b/neo.UnitTests/SmartContract/Iterators/UT_MapWrapper.cs @@ -1,7 +1,6 @@ using FluentAssertions; using Microsoft.VisualStudio.TestTools.UnitTesting; using Neo.SmartContract.Iterators; -using Neo.VM; using Neo.VM.Types; using System; using System.Collections.Generic; @@ -14,7 +13,7 @@ public class UT_MapWrapper [TestMethod] public void TestGeneratorAndDispose() { - MapWrapper mapWrapper = new MapWrapper(new List>()); + MapWrapper mapWrapper = new MapWrapper(new List>()); Assert.IsNotNull(mapWrapper); Action action = () => mapWrapper.Dispose(); action.Should().NotThrow(); @@ -23,10 +22,10 @@ public void TestGeneratorAndDispose() [TestMethod] public void TestKeyAndValue() { - List> list = new List>(); - StackItem stackItem1 = new Integer(0); + List> list = new List>(); + Integer stackItem1 = new Integer(0); StackItem stackItem2 = new Integer(1); - list.Add(new KeyValuePair(stackItem1, stackItem2)); + list.Add(new KeyValuePair(stackItem1, stackItem2)); MapWrapper mapWrapper = new MapWrapper(list); mapWrapper.Next(); Assert.AreEqual(stackItem1, mapWrapper.Key()); @@ -36,7 +35,7 @@ public void TestKeyAndValue() [TestMethod] public void TestNext() { - MapWrapper mapWrapper = new MapWrapper(new List>()); + MapWrapper mapWrapper = new MapWrapper(new List>()); Assert.AreEqual(false, mapWrapper.Next()); } } diff --git a/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs b/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs index 6df9f7074e..19f7ad2f6a 100644 --- a/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs +++ b/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs @@ -282,13 +282,13 @@ public void TestGetNextBlockValidators1() var result = engine.ResultStack.Peek(); result.GetType().Should().Be(typeof(VM.Types.Array)); ((VM.Types.Array)result).Count.Should().Be(7); - ((VM.Types.ByteArray)((VM.Types.Array)result)[0]).GetByteArray().ToHexString().Should().Be("03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c"); - ((VM.Types.ByteArray)((VM.Types.Array)result)[1]).GetByteArray().ToHexString().Should().Be("02df48f60e8f3e01c48ff40b9b7f1310d7a8b2a193188befe1c2e3df740e895093"); - ((VM.Types.ByteArray)((VM.Types.Array)result)[2]).GetByteArray().ToHexString().Should().Be("03b8d9d5771d8f513aa0869b9cc8d50986403b78c6da36890638c3d46a5adce04a"); - ((VM.Types.ByteArray)((VM.Types.Array)result)[3]).GetByteArray().ToHexString().Should().Be("02ca0e27697b9c248f6f16e085fd0061e26f44da85b58ee835c110caa5ec3ba554"); - ((VM.Types.ByteArray)((VM.Types.Array)result)[4]).GetByteArray().ToHexString().Should().Be("024c7b7fb6c310fccf1ba33b082519d82964ea93868d676662d4a59ad548df0e7d"); - ((VM.Types.ByteArray)((VM.Types.Array)result)[5]).GetByteArray().ToHexString().Should().Be("02aaec38470f6aad0042c6e877cfd8087d2676b0f516fddd362801b9bd3936399e"); - ((VM.Types.ByteArray)((VM.Types.Array)result)[6]).GetByteArray().ToHexString().Should().Be("02486fd15702c4490a26703112a5cc1d0923fd697a33406bd5a1c00e0013b09a70"); + ((VM.Types.Array)result)[0].GetSpan().ToHexString().Should().Be("03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c"); + ((VM.Types.Array)result)[1].GetSpan().ToHexString().Should().Be("02df48f60e8f3e01c48ff40b9b7f1310d7a8b2a193188befe1c2e3df740e895093"); + ((VM.Types.Array)result)[2].GetSpan().ToHexString().Should().Be("03b8d9d5771d8f513aa0869b9cc8d50986403b78c6da36890638c3d46a5adce04a"); + ((VM.Types.Array)result)[3].GetSpan().ToHexString().Should().Be("02ca0e27697b9c248f6f16e085fd0061e26f44da85b58ee835c110caa5ec3ba554"); + ((VM.Types.Array)result)[4].GetSpan().ToHexString().Should().Be("024c7b7fb6c310fccf1ba33b082519d82964ea93868d676662d4a59ad548df0e7d"); + ((VM.Types.Array)result)[5].GetSpan().ToHexString().Should().Be("02aaec38470f6aad0042c6e877cfd8087d2676b0f516fddd362801b9bd3936399e"); + ((VM.Types.Array)result)[6].GetSpan().ToHexString().Should().Be("02486fd15702c4490a26703112a5cc1d0923fd697a33406bd5a1c00e0013b09a70"); } } @@ -323,19 +323,19 @@ public void TestGetRegisteredValidators1() var result = engine.ResultStack.Peek(); result.GetType().Should().Be(typeof(VM.Types.Array)); ((VM.Types.Array)result).Count.Should().Be(7); - ((VM.Types.ByteArray)((VM.Types.Struct)((VM.Types.Array)result)[0])[0]).GetByteArray().ToHexString().Should().Be("02486fd15702c4490a26703112a5cc1d0923fd697a33406bd5a1c00e0013b09a70"); + ((VM.Types.Struct)((VM.Types.Array)result)[0])[0].GetSpan().ToHexString().Should().Be("02486fd15702c4490a26703112a5cc1d0923fd697a33406bd5a1c00e0013b09a70"); ((VM.Types.Struct)((VM.Types.Array)result)[0])[1].GetBigInteger().Should().Be(new BigInteger(0)); - ((VM.Types.ByteArray)((VM.Types.Struct)((VM.Types.Array)result)[1])[0]).GetByteArray().ToHexString().Should().Be("024c7b7fb6c310fccf1ba33b082519d82964ea93868d676662d4a59ad548df0e7d"); + ((VM.Types.Struct)((VM.Types.Array)result)[1])[0].GetSpan().ToHexString().Should().Be("024c7b7fb6c310fccf1ba33b082519d82964ea93868d676662d4a59ad548df0e7d"); ((VM.Types.Struct)((VM.Types.Array)result)[1])[1].GetBigInteger().Should().Be(new BigInteger(0)); - ((VM.Types.ByteArray)((VM.Types.Struct)((VM.Types.Array)result)[2])[0]).GetByteArray().ToHexString().Should().Be("02aaec38470f6aad0042c6e877cfd8087d2676b0f516fddd362801b9bd3936399e"); + ((VM.Types.Struct)((VM.Types.Array)result)[2])[0].GetSpan().ToHexString().Should().Be("02aaec38470f6aad0042c6e877cfd8087d2676b0f516fddd362801b9bd3936399e"); ((VM.Types.Struct)((VM.Types.Array)result)[2])[1].GetBigInteger().Should().Be(new BigInteger(0)); - ((VM.Types.ByteArray)((VM.Types.Struct)((VM.Types.Array)result)[3])[0]).GetByteArray().ToHexString().Should().Be("02ca0e27697b9c248f6f16e085fd0061e26f44da85b58ee835c110caa5ec3ba554"); + ((VM.Types.Struct)((VM.Types.Array)result)[3])[0].GetSpan().ToHexString().Should().Be("02ca0e27697b9c248f6f16e085fd0061e26f44da85b58ee835c110caa5ec3ba554"); ((VM.Types.Struct)((VM.Types.Array)result)[3])[1].GetBigInteger().Should().Be(new BigInteger(0)); - ((VM.Types.ByteArray)((VM.Types.Struct)((VM.Types.Array)result)[4])[0]).GetByteArray().ToHexString().Should().Be("02df48f60e8f3e01c48ff40b9b7f1310d7a8b2a193188befe1c2e3df740e895093"); + ((VM.Types.Struct)((VM.Types.Array)result)[4])[0].GetSpan().ToHexString().Should().Be("02df48f60e8f3e01c48ff40b9b7f1310d7a8b2a193188befe1c2e3df740e895093"); ((VM.Types.Struct)((VM.Types.Array)result)[4])[1].GetBigInteger().Should().Be(new BigInteger(0)); - ((VM.Types.ByteArray)((VM.Types.Struct)((VM.Types.Array)result)[5])[0]).GetByteArray().ToHexString().Should().Be("03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c"); + ((VM.Types.Struct)((VM.Types.Array)result)[5])[0].GetSpan().ToHexString().Should().Be("03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c"); ((VM.Types.Struct)((VM.Types.Array)result)[5])[1].GetBigInteger().Should().Be(new BigInteger(0)); - ((VM.Types.ByteArray)((VM.Types.Struct)((VM.Types.Array)result)[6])[0]).GetByteArray().ToHexString().Should().Be("03b8d9d5771d8f513aa0869b9cc8d50986403b78c6da36890638c3d46a5adce04a"); + ((VM.Types.Struct)((VM.Types.Array)result)[6])[0].GetSpan().ToHexString().Should().Be("03b8d9d5771d8f513aa0869b9cc8d50986403b78c6da36890638c3d46a5adce04a"); ((VM.Types.Struct)((VM.Types.Array)result)[6])[1].GetBigInteger().Should().Be(new BigInteger(0)); } } @@ -377,13 +377,13 @@ public void TestGetValidators1() var result = engine.ResultStack.Peek(); result.GetType().Should().Be(typeof(VM.Types.Array)); ((VM.Types.Array)result).Count.Should().Be(7); - ((VM.Types.ByteArray)((VM.Types.Array)result)[0]).GetByteArray().ToHexString().Should().Be("03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c"); - ((VM.Types.ByteArray)((VM.Types.Array)result)[1]).GetByteArray().ToHexString().Should().Be("02df48f60e8f3e01c48ff40b9b7f1310d7a8b2a193188befe1c2e3df740e895093"); - ((VM.Types.ByteArray)((VM.Types.Array)result)[2]).GetByteArray().ToHexString().Should().Be("03b8d9d5771d8f513aa0869b9cc8d50986403b78c6da36890638c3d46a5adce04a"); - ((VM.Types.ByteArray)((VM.Types.Array)result)[3]).GetByteArray().ToHexString().Should().Be("02ca0e27697b9c248f6f16e085fd0061e26f44da85b58ee835c110caa5ec3ba554"); - ((VM.Types.ByteArray)((VM.Types.Array)result)[4]).GetByteArray().ToHexString().Should().Be("024c7b7fb6c310fccf1ba33b082519d82964ea93868d676662d4a59ad548df0e7d"); - ((VM.Types.ByteArray)((VM.Types.Array)result)[5]).GetByteArray().ToHexString().Should().Be("02aaec38470f6aad0042c6e877cfd8087d2676b0f516fddd362801b9bd3936399e"); - ((VM.Types.ByteArray)((VM.Types.Array)result)[6]).GetByteArray().ToHexString().Should().Be("02486fd15702c4490a26703112a5cc1d0923fd697a33406bd5a1c00e0013b09a70"); + ((VM.Types.Array)result)[0].GetSpan().ToHexString().Should().Be("03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c"); + ((VM.Types.Array)result)[1].GetSpan().ToHexString().Should().Be("02df48f60e8f3e01c48ff40b9b7f1310d7a8b2a193188befe1c2e3df740e895093"); + ((VM.Types.Array)result)[2].GetSpan().ToHexString().Should().Be("03b8d9d5771d8f513aa0869b9cc8d50986403b78c6da36890638c3d46a5adce04a"); + ((VM.Types.Array)result)[3].GetSpan().ToHexString().Should().Be("02ca0e27697b9c248f6f16e085fd0061e26f44da85b58ee835c110caa5ec3ba554"); + ((VM.Types.Array)result)[4].GetSpan().ToHexString().Should().Be("024c7b7fb6c310fccf1ba33b082519d82964ea93868d676662d4a59ad548df0e7d"); + ((VM.Types.Array)result)[5].GetSpan().ToHexString().Should().Be("02aaec38470f6aad0042c6e877cfd8087d2676b0f516fddd362801b9bd3936399e"); + ((VM.Types.Array)result)[6].GetSpan().ToHexString().Should().Be("02486fd15702c4490a26703112a5cc1d0923fd697a33406bd5a1c00e0013b09a70"); } } @@ -575,7 +575,7 @@ public void TestValidatorState_ToByteArray() engine.Execute(); var result = engine.ResultStack.Peek(); result.GetType().Should().Be(typeof(VM.Types.Boolean)); - return (true, (result as VM.Types.Boolean).GetBoolean()); + return (true, result.ToBoolean()); } internal static (bool State, bool Result) Check_Vote(Snapshot snapshot, byte[] account, byte[][] pubkeys, bool signAccount) @@ -605,7 +605,7 @@ internal static (bool State, bool Result) Check_Vote(Snapshot snapshot, byte[] a var result = engine.ResultStack.Pop(); result.Should().BeOfType(typeof(VM.Types.Boolean)); - return (true, (result as VM.Types.Boolean).GetBoolean()); + return (true, result.ToBoolean()); } internal static (bool State, bool Result) Check_RegisterValidator(Snapshot snapshot, byte[] pubkey) @@ -629,7 +629,7 @@ internal static (bool State, bool Result) Check_RegisterValidator(Snapshot snaps var result = engine.ResultStack.Pop(); result.Should().BeOfType(typeof(VM.Types.Boolean)); - return (true, (result as VM.Types.Boolean).GetBoolean()); + return (true, result.ToBoolean()); } internal static ECPoint[] Check_GetValidators(Snapshot snapshot) @@ -649,7 +649,7 @@ internal static ECPoint[] Check_GetValidators(Snapshot snapshot) var result = engine.ResultStack.Pop(); result.Should().BeOfType(typeof(VM.Types.Array)); - return (result as VM.Types.Array).Select(u => u.GetByteArray().AsSerializable()).ToArray(); + return (result as VM.Types.Array).Select(u => u.GetSpan().AsSerializable()).ToArray(); } internal static (BigInteger Value, bool State) Check_UnclaimedGas(Snapshot snapshot, byte[] address) @@ -695,7 +695,7 @@ internal static void CheckBalance(byte[] account, DataCache(Blockchain.MaxValidators)).Should().BeEquivalentTo(votes); // Votes + (st[2].GetSpan().AsSerializableArray(Blockchain.MaxValidators)).Should().BeEquivalentTo(votes); // Votes trackable.Key.Key.Should().BeEquivalentTo(new byte[] { 20 }.Concat(account)); trackable.Item.IsConstant.Should().Be(false); diff --git a/neo.UnitTests/SmartContract/Native/Tokens/UT_Nep5Token.cs b/neo.UnitTests/SmartContract/Native/Tokens/UT_Nep5Token.cs index 0cec84a5a8..a34c7a109f 100644 --- a/neo.UnitTests/SmartContract/Native/Tokens/UT_Nep5Token.cs +++ b/neo.UnitTests/SmartContract/Native/Tokens/UT_Nep5Token.cs @@ -6,6 +6,7 @@ using Neo.SmartContract; using Neo.SmartContract.Native.Tokens; using Neo.VM; +using Neo.VM.Types; using System; using System.Numerics; diff --git a/neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs b/neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs index e0f87182a6..b75141459f 100644 --- a/neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs +++ b/neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs @@ -7,6 +7,7 @@ using Neo.SmartContract; using Neo.SmartContract.Native; using Neo.UnitTests.Extensions; +using Neo.VM; using System.Linq; namespace Neo.UnitTests.SmartContract.Native @@ -70,7 +71,7 @@ public void Check_SetMaxBlockSize() var ret = NativeContract.Policy.Call(snapshot, new Nep5NativeContractExtensions.ManualWitness(null), "setMaxBlockSize", new ContractParameter(ContractParameterType.Integer) { Value = 1024 }); ret.Should().BeOfType(); - ret.GetBoolean().Should().BeFalse(); + ret.ToBoolean().Should().BeFalse(); ret = NativeContract.Policy.Call(snapshot, "getMaxBlockSize"); ret.Should().BeOfType(); @@ -81,7 +82,7 @@ public void Check_SetMaxBlockSize() ret = NativeContract.Policy.Call(snapshot, new Nep5NativeContractExtensions.ManualWitness(UInt160.Zero), "setMaxBlockSize", new ContractParameter(ContractParameterType.Integer) { Value = Neo.Network.P2P.Message.PayloadMaxSize }); ret.Should().BeOfType(); - ret.GetBoolean().Should().BeFalse(); + ret.ToBoolean().Should().BeFalse(); ret = NativeContract.Policy.Call(snapshot, "getMaxBlockSize"); ret.Should().BeOfType(); @@ -92,7 +93,7 @@ public void Check_SetMaxBlockSize() ret = NativeContract.Policy.Call(snapshot, new Nep5NativeContractExtensions.ManualWitness(UInt160.Zero), "setMaxBlockSize", new ContractParameter(ContractParameterType.Integer) { Value = 1024 }); ret.Should().BeOfType(); - ret.GetBoolean().Should().BeTrue(); + ret.ToBoolean().Should().BeTrue(); ret = NativeContract.Policy.Call(snapshot, "getMaxBlockSize"); ret.Should().BeOfType(); @@ -116,7 +117,7 @@ public void Check_SetMaxTransactionsPerBlock() var ret = NativeContract.Policy.Call(snapshot, new Nep5NativeContractExtensions.ManualWitness(), "setMaxTransactionsPerBlock", new ContractParameter(ContractParameterType.Integer) { Value = 1 }); ret.Should().BeOfType(); - ret.GetBoolean().Should().BeFalse(); + ret.ToBoolean().Should().BeFalse(); ret = NativeContract.Policy.Call(snapshot, "getMaxTransactionsPerBlock"); ret.Should().BeOfType(); @@ -127,7 +128,7 @@ public void Check_SetMaxTransactionsPerBlock() ret = NativeContract.Policy.Call(snapshot, new Nep5NativeContractExtensions.ManualWitness(UInt160.Zero), "setMaxTransactionsPerBlock", new ContractParameter(ContractParameterType.Integer) { Value = 1 }); ret.Should().BeOfType(); - ret.GetBoolean().Should().BeTrue(); + ret.ToBoolean().Should().BeTrue(); ret = NativeContract.Policy.Call(snapshot, "getMaxTransactionsPerBlock"); ret.Should().BeOfType(); @@ -151,7 +152,7 @@ public void Check_SetFeePerByte() var ret = NativeContract.Policy.Call(snapshot, new Nep5NativeContractExtensions.ManualWitness(), "setFeePerByte", new ContractParameter(ContractParameterType.Integer) { Value = 1 }); ret.Should().BeOfType(); - ret.GetBoolean().Should().BeFalse(); + ret.ToBoolean().Should().BeFalse(); ret = NativeContract.Policy.Call(snapshot, "getFeePerByte"); ret.Should().BeOfType(); @@ -162,7 +163,7 @@ public void Check_SetFeePerByte() ret = NativeContract.Policy.Call(snapshot, new Nep5NativeContractExtensions.ManualWitness(UInt160.Zero), "setFeePerByte", new ContractParameter(ContractParameterType.Integer) { Value = 1 }); ret.Should().BeOfType(); - ret.GetBoolean().Should().BeTrue(); + ret.ToBoolean().Should().BeTrue(); ret = NativeContract.Policy.Call(snapshot, "getFeePerByte"); ret.Should().BeOfType(); @@ -186,7 +187,7 @@ public void Check_Block_UnblockAccount() var ret = NativeContract.Policy.Call(snapshot, new Nep5NativeContractExtensions.ManualWitness(), "blockAccount", new ContractParameter(ContractParameterType.Hash160) { Value = UInt160.Zero }); ret.Should().BeOfType(); - ret.GetBoolean().Should().BeFalse(); + ret.ToBoolean().Should().BeFalse(); ret = NativeContract.Policy.Call(snapshot, "getBlockedAccounts"); ret.Should().BeOfType(); @@ -197,31 +198,31 @@ public void Check_Block_UnblockAccount() ret = NativeContract.Policy.Call(snapshot, new Nep5NativeContractExtensions.ManualWitness(UInt160.Zero), "blockAccount", new ContractParameter(ContractParameterType.Hash160) { Value = UInt160.Zero }); ret.Should().BeOfType(); - ret.GetBoolean().Should().BeTrue(); + ret.ToBoolean().Should().BeTrue(); ret = NativeContract.Policy.Call(snapshot, "getBlockedAccounts"); ret.Should().BeOfType(); ((VM.Types.Array)ret).Count.Should().Be(1); - ((VM.Types.Array)ret)[0].GetByteArray().Should().BeEquivalentTo(UInt160.Zero.ToArray()); + ((VM.Types.Array)ret)[0].GetSpan().ToArray().Should().BeEquivalentTo(UInt160.Zero.ToArray()); // Unblock without signature ret = NativeContract.Policy.Call(snapshot, new Nep5NativeContractExtensions.ManualWitness(), "unblockAccount", new ContractParameter(ContractParameterType.Hash160) { Value = UInt160.Zero }); ret.Should().BeOfType(); - ret.GetBoolean().Should().BeFalse(); + ret.ToBoolean().Should().BeFalse(); ret = NativeContract.Policy.Call(snapshot, "getBlockedAccounts"); ret.Should().BeOfType(); ((VM.Types.Array)ret).Count.Should().Be(1); - ((VM.Types.Array)ret)[0].GetByteArray().Should().BeEquivalentTo(UInt160.Zero.ToArray()); + ((VM.Types.Array)ret)[0].GetSpan().ToArray().Should().BeEquivalentTo(UInt160.Zero.ToArray()); // Unblock with signature ret = NativeContract.Policy.Call(snapshot, new Nep5NativeContractExtensions.ManualWitness(UInt160.Zero), "unblockAccount", new ContractParameter(ContractParameterType.Hash160) { Value = UInt160.Zero }); ret.Should().BeOfType(); - ret.GetBoolean().Should().BeTrue(); + ret.ToBoolean().Should().BeTrue(); ret = NativeContract.Policy.Call(snapshot, "getBlockedAccounts"); ret.Should().BeOfType(); diff --git a/neo.UnitTests/SmartContract/UT_ApplicationEngine.cs b/neo.UnitTests/SmartContract/UT_ApplicationEngine.cs index fae3938a22..d8bdd8a857 100644 --- a/neo.UnitTests/SmartContract/UT_ApplicationEngine.cs +++ b/neo.UnitTests/SmartContract/UT_ApplicationEngine.cs @@ -7,8 +7,7 @@ using Neo.Network.P2P.Payloads; using Neo.Persistence; using Neo.SmartContract; -using Neo.UnitTests.Ledger; -using Neo.VM; +using Neo.VM.Types; using System; namespace Neo.UnitTests.SmartContract diff --git a/neo.UnitTests/SmartContract/UT_ContainerPlaceholder.cs b/neo.UnitTests/SmartContract/UT_ContainerPlaceholder.cs index e7ed55ac42..0ba48e78a9 100644 --- a/neo.UnitTests/SmartContract/UT_ContainerPlaceholder.cs +++ b/neo.UnitTests/SmartContract/UT_ContainerPlaceholder.cs @@ -28,15 +28,7 @@ public void TestEquals() public void TestGetBoolean() { ContainerPlaceholder containerPlaceholder = new ContainerPlaceholder(); - Action action = () => containerPlaceholder.GetBoolean(); - action.Should().Throw(); - } - - [TestMethod] - public void TestGetByteArray() - { - ContainerPlaceholder containerPlaceholder = new ContainerPlaceholder(); - Action action = () => containerPlaceholder.GetByteArray(); + Action action = () => containerPlaceholder.ToBoolean(); action.Should().Throw(); } } diff --git a/neo.UnitTests/SmartContract/UT_InteropService.NEO.cs b/neo.UnitTests/SmartContract/UT_InteropService.NEO.cs index 243cfa89ef..3e60b91591 100644 --- a/neo.UnitTests/SmartContract/UT_InteropService.NEO.cs +++ b/neo.UnitTests/SmartContract/UT_InteropService.NEO.cs @@ -36,13 +36,13 @@ public void TestCheckSig() engine.CurrentContext.EvaluationStack.Push(pubkey.EncodePoint(false)); engine.CurrentContext.EvaluationStack.Push(StackItem.Null); InteropService.Invoke(engine, InteropService.Neo_Crypto_ECDsaVerify).Should().BeTrue(); - engine.CurrentContext.EvaluationStack.Pop().GetBoolean().Should().BeTrue(); + engine.CurrentContext.EvaluationStack.Pop().ToBoolean().Should().BeTrue(); engine.CurrentContext.EvaluationStack.Push(signature); engine.CurrentContext.EvaluationStack.Push(new byte[70]); engine.CurrentContext.EvaluationStack.Push(StackItem.Null); InteropService.Invoke(engine, InteropService.Neo_Crypto_ECDsaVerify).Should().BeTrue(); - engine.CurrentContext.EvaluationStack.Pop().GetBoolean().Should().BeFalse(); + engine.CurrentContext.EvaluationStack.Pop().ToBoolean().Should().BeFalse(); } [TestMethod] @@ -78,7 +78,7 @@ public void TestCrypto_CheckMultiSig() engine.CurrentContext.EvaluationStack.Push(pubkeys); engine.CurrentContext.EvaluationStack.Push(StackItem.Null); InteropService.Invoke(engine, InteropService.Neo_Crypto_ECDsaCheckMultiSig).Should().BeTrue(); - engine.CurrentContext.EvaluationStack.Pop().GetBoolean().Should().BeTrue(); + engine.CurrentContext.EvaluationStack.Pop().ToBoolean().Should().BeTrue(); pubkeys = new VMArray(); engine.CurrentContext.EvaluationStack.Push(signatures); @@ -111,7 +111,7 @@ public void TestCrypto_CheckMultiSig() engine.CurrentContext.EvaluationStack.Push(pubkeys); engine.CurrentContext.EvaluationStack.Push(StackItem.Null); InteropService.Invoke(engine, InteropService.Neo_Crypto_ECDsaCheckMultiSig).Should().BeTrue(); - engine.CurrentContext.EvaluationStack.Pop().GetBoolean().Should().BeFalse(); + engine.CurrentContext.EvaluationStack.Pop().ToBoolean().Should().BeFalse(); pubkeys = new VMArray { @@ -127,7 +127,7 @@ public void TestCrypto_CheckMultiSig() engine.CurrentContext.EvaluationStack.Push(pubkeys); engine.CurrentContext.EvaluationStack.Push(StackItem.Null); InteropService.Invoke(engine, InteropService.Neo_Crypto_ECDsaCheckMultiSig).Should().BeTrue(); - engine.CurrentContext.EvaluationStack.Pop().GetBoolean().Should().BeFalse(); + engine.CurrentContext.EvaluationStack.Pop().ToBoolean().Should().BeFalse(); } [TestMethod] @@ -140,7 +140,7 @@ public void TestAccount_IsStandard() 0x01, 0x01, 0x01, 0x01, 0x01 }; engine.CurrentContext.EvaluationStack.Push(hash); InteropService.Invoke(engine, InteropService.Neo_Account_IsStandard).Should().BeTrue(); - engine.CurrentContext.EvaluationStack.Pop().GetBoolean().Should().BeTrue(); + engine.CurrentContext.EvaluationStack.Pop().ToBoolean().Should().BeTrue(); var mockSnapshot = new Mock(); var state = TestUtils.GetContract(); @@ -149,7 +149,7 @@ public void TestAccount_IsStandard() engine.LoadScript(new byte[] { 0x01 }); engine.CurrentContext.EvaluationStack.Push(state.ScriptHash.ToArray()); InteropService.Invoke(engine, InteropService.Neo_Account_IsStandard).Should().BeTrue(); - engine.CurrentContext.EvaluationStack.Pop().GetBoolean().Should().BeFalse(); + engine.CurrentContext.EvaluationStack.Pop().ToBoolean().Should().BeFalse(); } [TestMethod] @@ -286,7 +286,7 @@ public void TestStorage_Find() var iterator = ((InteropInterface)engine.CurrentContext.EvaluationStack.Pop()).GetInterface(); iterator.Next(); var ele = iterator.Value(); - ele.GetByteArray().ToHexString().Should().Be(storageItem.Value.ToHexString()); + ele.GetSpan().ToHexString().Should().Be(storageItem.Value.ToHexString()); engine.CurrentContext.EvaluationStack.Push(1); InteropService.Invoke(engine, InteropService.Neo_Storage_Find).Should().BeFalse(); @@ -304,7 +304,7 @@ public void TestEnumerator_Create() InteropService.Invoke(engine, InteropService.Neo_Enumerator_Create).Should().BeTrue(); var ret = (InteropInterface)engine.CurrentContext.EvaluationStack.Pop(); ret.GetInterface().Next(); - ret.GetInterface().Value().GetByteArray().ToHexString() + ret.GetInterface().Value().GetSpan().ToHexString() .Should().Be(new byte[] { 0x01 }.ToHexString()); engine.CurrentContext.EvaluationStack.Push(1); @@ -321,7 +321,7 @@ public void TestEnumerator_Next() }; engine.CurrentContext.EvaluationStack.Push(new InteropInterface(new ArrayWrapper(arr))); InteropService.Invoke(engine, InteropService.Neo_Enumerator_Next).Should().BeTrue(); - engine.CurrentContext.EvaluationStack.Pop().GetBoolean().Should().BeTrue(); + engine.CurrentContext.EvaluationStack.Pop().ToBoolean().Should().BeTrue(); engine.CurrentContext.EvaluationStack.Push(1); InteropService.Invoke(engine, InteropService.Neo_Enumerator_Next).Should().BeFalse(); @@ -339,7 +339,7 @@ public void TestEnumerator_Value() wrapper.Next(); engine.CurrentContext.EvaluationStack.Push(new InteropInterface(wrapper)); InteropService.Invoke(engine, InteropService.Neo_Enumerator_Value).Should().BeTrue(); - engine.CurrentContext.EvaluationStack.Pop().GetByteArray().ToHexString().Should().Be(new byte[] { 0x01 }.ToHexString()); + engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToHexString().Should().Be(new byte[] { 0x01 }.ToHexString()); engine.CurrentContext.EvaluationStack.Push(1); InteropService.Invoke(engine, InteropService.Neo_Enumerator_Value).Should().BeFalse(); @@ -364,7 +364,7 @@ public void TestEnumerator_Concat() InteropService.Invoke(engine, InteropService.Neo_Enumerator_Concat).Should().BeTrue(); var ret = ((InteropInterface)engine.CurrentContext.EvaluationStack.Pop()).GetInterface(); ret.Next().Should().BeTrue(); - ret.Value().GetByteArray().ToHexString().Should().Be(new byte[] { 0x01 }.ToHexString()); + ret.Value().GetSpan().ToHexString().Should().Be(new byte[] { 0x01 }.ToHexString()); } [TestMethod] @@ -379,7 +379,7 @@ public void TestIterator_Create() InteropService.Invoke(engine, InteropService.Neo_Iterator_Create).Should().BeTrue(); var ret = (InteropInterface)engine.CurrentContext.EvaluationStack.Pop(); ret.GetInterface().Next(); - ret.GetInterface().Value().GetByteArray().ToHexString() + ret.GetInterface().Value().GetSpan().ToHexString() .Should().Be(new byte[] { 0x01 }.ToHexString()); var map = new Map @@ -448,7 +448,7 @@ public void TestIterator_Values() InteropService.Invoke(engine, InteropService.Neo_Iterator_Values).Should().BeTrue(); var ret = ((InteropInterface)engine.CurrentContext.EvaluationStack.Pop()).GetInterface(); ret.Next(); - ret.Value().GetByteArray().ToHexString().Should().Be(new byte[] { 0x01 }.ToHexString()); + ret.Value().GetSpan().ToHexString().Should().Be(new byte[] { 0x01 }.ToHexString()); engine.CurrentContext.EvaluationStack.Push(1); InteropService.Invoke(engine, InteropService.Neo_Iterator_Values).Should().BeFalse(); @@ -473,7 +473,7 @@ public void TestIterator_Concat() InteropService.Invoke(engine, InteropService.Neo_Iterator_Concat).Should().BeTrue(); var ret = ((InteropInterface)engine.CurrentContext.EvaluationStack.Pop()).GetInterface(); ret.Next().Should().BeTrue(); - ret.Value().GetByteArray().ToHexString().Should().Be(new byte[] { 0x01 }.ToHexString()); + ret.Value().GetSpan().ToHexString().Should().Be(new byte[] { 0x01 }.ToHexString()); } [TestMethod] diff --git a/neo.UnitTests/SmartContract/UT_InteropService.cs b/neo.UnitTests/SmartContract/UT_InteropService.cs index cc6eac738a..83f4a1485b 100644 --- a/neo.UnitTests/SmartContract/UT_InteropService.cs +++ b/neo.UnitTests/SmartContract/UT_InteropService.cs @@ -188,7 +188,7 @@ private void AssertNotification(StackItem stackItem, UInt160 scriptHash, string var array = (VM.Types.Array)stackItem; Assert.AreEqual(2, array.Count); - CollectionAssert.AreEqual(scriptHash.ToArray(), array[0].GetByteArray()); + CollectionAssert.AreEqual(scriptHash.ToArray(), array[0].GetSpan().ToArray()); Assert.AreEqual(notification, array[1].GetString()); } @@ -198,7 +198,7 @@ private void AssertNotification(StackItem stackItem, UInt160 scriptHash, int not var array = (VM.Types.Array)stackItem; Assert.AreEqual(2, array.Count); - CollectionAssert.AreEqual(scriptHash.ToArray(), array[0].GetByteArray()); + CollectionAssert.AreEqual(scriptHash.ToArray(), array[0].GetSpan().ToArray()); Assert.AreEqual(notification, array[1].GetBigInteger()); } @@ -209,7 +209,7 @@ public void TestExecutionEngine_GetScriptContainer() InteropService.Invoke(engine, InteropService.System_ExecutionEngine_GetScriptContainer).Should().BeTrue(); var stackItem = ((VM.Types.Array)engine.CurrentContext.EvaluationStack.Pop()).ToArray(); stackItem.Length.Should().Be(8); - stackItem[0].GetByteArray().ToHexString().Should().Be(TestUtils.GetTransaction().Hash.ToArray().ToHexString()); + stackItem[0].GetSpan().ToHexString().Should().Be(TestUtils.GetTransaction().Hash.ToArray().ToHexString()); } [TestMethod] @@ -217,7 +217,7 @@ public void TestExecutionEngine_GetExecutingScriptHash() { var engine = GetEngine(); InteropService.Invoke(engine, InteropService.System_ExecutionEngine_GetExecutingScriptHash).Should().BeTrue(); - engine.CurrentContext.EvaluationStack.Pop().GetByteArray().ToHexString() + engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToHexString() .Should().Be(engine.CurrentScriptHash.ToArray().ToHexString()); } @@ -231,7 +231,7 @@ public void TestExecutionEngine_GetCallingScriptHash() engine = GetEngine(true); engine.LoadScript(new byte[] { 0x01 }); InteropService.Invoke(engine, InteropService.System_ExecutionEngine_GetCallingScriptHash).Should().BeTrue(); - engine.CurrentContext.EvaluationStack.Pop().GetByteArray().ToHexString() + engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToHexString() .Should().Be(engine.CallingScriptHash.ToArray().ToHexString()); } @@ -240,7 +240,7 @@ public void TestExecutionEngine_GetEntryScriptHash() { var engine = GetEngine(); InteropService.Invoke(engine, InteropService.System_ExecutionEngine_GetEntryScriptHash).Should().BeTrue(); - engine.CurrentContext.EvaluationStack.Pop().GetByteArray().ToHexString() + engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToHexString() .Should().Be(engine.EntryScriptHash.ToArray().ToHexString()); } @@ -249,7 +249,7 @@ public void TestRuntime_Platform() { var engine = GetEngine(); InteropService.Invoke(engine, InteropService.System_Runtime_Platform).Should().BeTrue(); - engine.CurrentContext.EvaluationStack.Pop().GetByteArray().ToHexString() + engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToHexString() .Should().Be(Encoding.ASCII.GetBytes("NEO").ToHexString()); } @@ -276,12 +276,12 @@ public void TestRuntime_CheckWitness() engine.CurrentContext.EvaluationStack.Push(pubkey.EncodePoint(true)); InteropService.Invoke(engine, InteropService.System_Runtime_CheckWitness).Should().BeTrue(); engine.CurrentContext.EvaluationStack.Peek().GetType().Should().Be(typeof(Neo.VM.Types.Boolean)); - engine.CurrentContext.EvaluationStack.Pop().GetBoolean().Should().Be(false); + engine.CurrentContext.EvaluationStack.Pop().ToBoolean().Should().Be(false); engine.CurrentContext.EvaluationStack.Push(((Transaction)engine.ScriptContainer).Sender.ToArray()); InteropService.Invoke(engine, InteropService.System_Runtime_CheckWitness).Should().BeTrue(); engine.CurrentContext.EvaluationStack.Peek().GetType().Should().Be(typeof(Neo.VM.Types.Boolean)); - engine.CurrentContext.EvaluationStack.Pop().GetBoolean().Should().Be(false); + engine.CurrentContext.EvaluationStack.Pop().ToBoolean().Should().Be(false); engine.CurrentContext.EvaluationStack.Push(new byte[0]); InteropService.Invoke(engine, InteropService.System_Runtime_CheckWitness).Should().BeFalse(); @@ -317,7 +317,7 @@ public void TestRuntime_Serialize() var engine = GetEngine(); engine.CurrentContext.EvaluationStack.Push(100); InteropService.Invoke(engine, InteropService.System_Runtime_Serialize).Should().BeTrue(); - engine.CurrentContext.EvaluationStack.Pop().GetByteArray().ToHexString() + engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToHexString() .Should().Be(new byte[] { 0x02, 0x01, 0x64 }.ToHexString()); engine.CurrentContext.EvaluationStack.Push(new byte[1024 * 1024 * 2]); //Larger than MaxItemSize @@ -366,7 +366,7 @@ public void TestCrypto_Verify() engine.CurrentContext.EvaluationStack.Push(pubkey.EncodePoint(false)); engine.CurrentContext.EvaluationStack.Push(message); InteropService.Invoke(engine, InteropService.Neo_Crypto_ECDsaVerify).Should().BeTrue(); - engine.CurrentContext.EvaluationStack.Pop().GetBoolean().Should().BeTrue(); + engine.CurrentContext.EvaluationStack.Pop().ToBoolean().Should().BeTrue(); byte[] wrongkey = pubkey.EncodePoint(false); wrongkey[0] = 5; @@ -374,7 +374,7 @@ public void TestCrypto_Verify() engine.CurrentContext.EvaluationStack.Push(wrongkey); engine.CurrentContext.EvaluationStack.Push(new InteropInterface(engine.ScriptContainer)); InteropService.Invoke(engine, InteropService.Neo_Crypto_ECDsaVerify).Should().BeTrue(); - engine.CurrentContext.EvaluationStack.Peek().GetBoolean().Should().BeFalse(); + engine.CurrentContext.EvaluationStack.Peek().ToBoolean().Should().BeFalse(); } [TestMethod] @@ -400,7 +400,7 @@ public void TestBlockchain_GetBlock() 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}; engine.CurrentContext.EvaluationStack.Push(data1); InteropService.Invoke(engine, InteropService.System_Blockchain_GetBlock).Should().BeTrue(); - engine.CurrentContext.EvaluationStack.Pop().GetBoolean().Should().BeFalse(); + engine.CurrentContext.EvaluationStack.Pop().ToBoolean().Should().BeFalse(); byte[] data2 = new byte[] { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }; engine.CurrentContext.EvaluationStack.Push(data2); @@ -417,7 +417,7 @@ public void TestBlockchain_GetTransaction() 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}; engine.CurrentContext.EvaluationStack.Push(data1); InteropService.Invoke(engine, InteropService.System_Blockchain_GetTransaction).Should().BeTrue(); - engine.CurrentContext.EvaluationStack.Pop().GetBoolean().Should().BeFalse(); + engine.CurrentContext.EvaluationStack.Pop().ToBoolean().Should().BeFalse(); } [TestMethod] @@ -455,9 +455,9 @@ public void TestBlockchain_GetContract() var stackItems = ((VM.Types.Array)engine.CurrentContext.EvaluationStack.Pop()).ToArray(); stackItems.Length.Should().Be(3); stackItems[0].GetType().Should().Be(typeof(ByteArray)); - stackItems[0].GetByteArray().ToHexString().Should().Be(state.Script.ToHexString()); - stackItems[1].GetBoolean().Should().BeFalse(); - stackItems[2].GetBoolean().Should().BeFalse(); + stackItems[0].GetSpan().ToHexString().Should().Be(state.Script.ToHexString()); + stackItems[1].ToBoolean().Should().BeFalse(); + stackItems[2].ToBoolean().Should().BeFalse(); } [TestMethod] @@ -510,7 +510,7 @@ public void TestStorage_Get() IsReadOnly = false })); InteropService.Invoke(engine, InteropService.System_Storage_Get).Should().BeTrue(); - engine.CurrentContext.EvaluationStack.Pop().GetByteArray().ToHexString().Should().Be(storageItem.Value.ToHexString()); + engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToHexString().Should().Be(storageItem.Value.ToHexString()); mockSnapshot.SetupGet(p => p.Contracts).Returns(new TestDataCache()); engine = new ApplicationEngine(TriggerType.Application, null, mockSnapshot.Object, 0); @@ -746,8 +746,8 @@ public void TestContract_Call() engine.CurrentContext.EvaluationStack.Push(method); engine.CurrentContext.EvaluationStack.Push(state.ScriptHash.ToArray()); InteropService.Invoke(engine, InteropService.System_Contract_Call).Should().BeTrue(); - engine.CurrentContext.EvaluationStack.Pop().GetByteArray().ToHexString().Should().Be(method.ToHexString()); - engine.CurrentContext.EvaluationStack.Pop().GetByteArray().ToHexString().Should().Be(args.ToHexString()); + engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToHexString().Should().Be(method.ToHexString()); + engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToHexString().Should().Be(args.ToHexString()); state.Manifest.Permissions[0].Methods = WildCardContainer.Create("a"); engine.CurrentContext.EvaluationStack.Push(args); @@ -838,7 +838,7 @@ private static ApplicationEngine GetEngine(bool hasContainer = false, bool hasSn internal class TestInteropInterface : InteropInterface { public override bool Equals(StackItem other) => true; - public override bool GetBoolean() => true; + public override bool ToBoolean() => true; public override T GetInterface() => throw new NotImplementedException(); } } diff --git a/neo.UnitTests/SmartContract/UT_JsonSerializer.cs b/neo.UnitTests/SmartContract/UT_JsonSerializer.cs index ed9c9cd72b..788868622c 100644 --- a/neo.UnitTests/SmartContract/UT_JsonSerializer.cs +++ b/neo.UnitTests/SmartContract/UT_JsonSerializer.cs @@ -31,7 +31,7 @@ public void JsonTest_WrongJson() Assert.ThrowsException(() => JObject.Parse(json)); json = @"{""length"":99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999}"; - Assert.ThrowsException(() => JObject.Parse(json)); + Assert.ThrowsException(() => JObject.Parse(json)); json = $"{{\"length\":{long.MaxValue}}}"; Assert.ThrowsException(() => JObject.Parse(json)); @@ -119,7 +119,7 @@ public void JsonTest_String() var json = @" ["""" , ""\b\f\t\n\r\/\\"" ]"; var parsed = JObject.Parse(json); - Assert.AreEqual(@"["""",""\b\f\t\n\r\/\\""]", parsed.ToString()); + Assert.AreEqual(@"["""",""\b\f\t\n\r/\\""]", parsed.ToString()); json = @"[""\uD834\uDD1E""]"; parsed = JObject.Parse(json); @@ -281,7 +281,7 @@ public void Deserialize_Array_Bool_Str_Num() var array = (VM.Types.Array)items; - Assert.IsTrue(array[0].GetBoolean()); + Assert.IsTrue(array[0].ToBoolean()); Assert.AreEqual(array[1].GetString(), "test"); Assert.AreEqual(array[2].GetBigInteger(), 123); } @@ -316,7 +316,7 @@ public void Deserialize_Array_OfArray() array = (VM.Types.Array)array[0]; Assert.AreEqual(array.Count, 3); - Assert.IsTrue(array[0].GetBoolean()); + Assert.IsTrue(array[0].ToBoolean()); Assert.AreEqual(array[1].GetString(), "test1"); Assert.AreEqual(array[2].GetBigInteger(), 123); @@ -324,7 +324,7 @@ public void Deserialize_Array_OfArray() array = (VM.Types.Array)array[1]; Assert.AreEqual(array.Count, 3); - Assert.IsTrue(array[0].GetBoolean()); + Assert.IsTrue(array[0].ToBoolean()); Assert.AreEqual(array[1].GetString(), "test2"); Assert.AreEqual(array[2].GetBigInteger(), 321); } diff --git a/neo.UnitTests/SmartContract/UT_NotifyEventArgs.cs b/neo.UnitTests/SmartContract/UT_NotifyEventArgs.cs index a1dd95b6ee..1dfd6a6ec5 100644 --- a/neo.UnitTests/SmartContract/UT_NotifyEventArgs.cs +++ b/neo.UnitTests/SmartContract/UT_NotifyEventArgs.cs @@ -1,8 +1,8 @@ -using FluentAssertions; +using FluentAssertions; using Microsoft.VisualStudio.TestTools.UnitTesting; using Neo.Network.P2P.Payloads; using Neo.SmartContract; -using Neo.VM; +using Neo.VM.Types; namespace Neo.UnitTests.SmartContract { diff --git a/neo.UnitTests/SmartContract/UT_SmartContractHelper.cs b/neo.UnitTests/SmartContract/UT_SmartContractHelper.cs index 8379fccd6b..8a85e7a4b4 100644 --- a/neo.UnitTests/SmartContract/UT_SmartContractHelper.cs +++ b/neo.UnitTests/SmartContract/UT_SmartContractHelper.cs @@ -5,7 +5,6 @@ using Neo.Network.P2P.Payloads; using Neo.Persistence; using Neo.SmartContract; -using Neo.VM; using Neo.VM.Types; using Neo.Wallets; using System; @@ -169,7 +168,7 @@ public void TestSerialize() Assert.AreEqual(Encoding.Default.GetString(expectedArray7), Encoding.Default.GetString(result7)); StackItem stackItem81 = new VM.Types.Integer(1); - Dictionary list8 = new Dictionary + Dictionary list8 = new Dictionary { { new VM.Types.Integer(2), stackItem81 } }; @@ -180,7 +179,7 @@ public void TestSerialize() }; Assert.AreEqual(Encoding.Default.GetString(expectedArray8), Encoding.Default.GetString(result8)); - StackItem stackItem9 = new VM.Types.Integer(1); + Integer stackItem9 = new VM.Types.Integer(1); Map stackItem91 = new VM.Types.Map(); stackItem91.Add(stackItem9, stackItem91); Action action9 = () => Neo.SmartContract.Helper.Serialize(stackItem91); @@ -235,7 +234,7 @@ public void TestDeserializeStackItem() Assert.AreEqual(((VM.Types.Struct)stackItem62).GetEnumerator().Current, ((VM.Types.Struct)result6).GetEnumerator().Current); StackItem stackItem71 = new VM.Types.Integer(1); - Dictionary list7 = new Dictionary(); + Dictionary list7 = new Dictionary(); list7.Add(new VM.Types.Integer(2), stackItem71); StackItem stackItem72 = new VM.Types.Map(list7); byte[] byteArray7 = Neo.SmartContract.Helper.Serialize(stackItem72); diff --git a/neo.UnitTests/SmartContract/UT_Syscalls.cs b/neo.UnitTests/SmartContract/UT_Syscalls.cs index b778f63d94..f54b533106 100644 --- a/neo.UnitTests/SmartContract/UT_Syscalls.cs +++ b/neo.UnitTests/SmartContract/UT_Syscalls.cs @@ -75,8 +75,8 @@ public void System_Blockchain_GetBlock() Assert.AreEqual(engine.Execute(), VMState.HALT); Assert.AreEqual(1, engine.ResultStack.Count); Assert.IsInstanceOfType(engine.ResultStack.Peek(), typeof(ByteArray)); - Assert.AreEqual(engine.ResultStack.Pop().GetByteArray().ToHexString(), - "5b22556168355c2f4b6f446d39723064555950636353714346745a30594f726b583164646e7334366e676e3962383d222c332c22414141414141414141414141414141414141414141414141414141414141414141414141414141414141413d222c22414141414141414141414141414141414141414141414141414141414141414141414141414141414141413d222c322c312c224141414141414141414141414141414141414141414141414141413d222c315d"); + Assert.AreEqual(engine.ResultStack.Pop().GetSpan().ToHexString(), + "5b22556168352f4b6f446d39723064555950636353714346745a30594f726b583164646e7334366e676e3962383d222c332c22414141414141414141414141414141414141414141414141414141414141414141414141414141414141413d222c22414141414141414141414141414141414141414141414141414141414141414141414141414141414141413d222c322c312c224141414141414141414141414141414141414141414141414141413d222c315d"); Assert.AreEqual(0, engine.ResultStack.Count); // Clean @@ -126,8 +126,8 @@ public void System_ExecutionEngine_GetScriptContainer() Assert.AreEqual(engine.Execute(), VMState.HALT); Assert.AreEqual(1, engine.ResultStack.Count); Assert.IsInstanceOfType(engine.ResultStack.Peek(), typeof(ByteArray)); - Assert.AreEqual(engine.ResultStack.Pop().GetByteArray().ToHexString(), - @"5b225c75303032426b53415959527a4c4b69685a676464414b50596f754655737a63544d7867445a6572584a3172784c37303d222c362c342c225c2f5c2f5c2f5c2f5c2f5c2f5c2f5c2f5c2f5c2f5c2f5c2f5c2f5c2f5c2f5c2f5c2f5c2f5c2f5c2f5c2f5c2f5c2f5c2f5c2f5c2f383d222c332c322c352c2241513d3d225d"); + Assert.AreEqual(engine.ResultStack.Pop().GetSpan().ToHexString(), + @"5b225c75303032426b53415959527a4c4b69685a676464414b50596f754655737a63544d7867445a6572584a3172784c37303d222c362c342c222f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f383d222c332c322c352c2241513d3d225d"); Assert.AreEqual(0, engine.ResultStack.Count); } } diff --git a/neo.UnitTests/UT_UInt160.cs b/neo.UnitTests/UT_UInt160.cs index 99cf91a5c3..0a0eb0321e 100644 --- a/neo.UnitTests/UT_UInt160.cs +++ b/neo.UnitTests/UT_UInt160.cs @@ -1,3 +1,5 @@ +#pragma warning disable CS1718 + using FluentAssertions; using Microsoft.VisualStudio.TestTools.UnitTesting; using System; diff --git a/neo.UnitTests/UT_UInt256.cs b/neo.UnitTests/UT_UInt256.cs index 179e991110..d263effdee 100644 --- a/neo.UnitTests/UT_UInt256.cs +++ b/neo.UnitTests/UT_UInt256.cs @@ -1,3 +1,5 @@ +#pragma warning disable CS1718 + using FluentAssertions; using Microsoft.VisualStudio.TestTools.UnitTesting; using System; diff --git a/neo.UnitTests/VM/UT_Helper.cs b/neo.UnitTests/VM/UT_Helper.cs index 41d6270822..f394b63f0b 100644 --- a/neo.UnitTests/VM/UT_Helper.cs +++ b/neo.UnitTests/VM/UT_Helper.cs @@ -4,11 +4,13 @@ using Neo.SmartContract; using Neo.SmartContract.Native; using Neo.VM; +using Neo.VM.Types; using System; using System.Collections.Generic; using System.Linq; using System.Numerics; using System.Text; +using Array = System.Array; namespace Neo.UnitTests.VMT { @@ -112,7 +114,7 @@ public void TestToParameter() StackItem arrayItem = new VM.Types.Array(new[] { byteItem, boolItem, intItem, interopItem }); Assert.AreEqual(1000, (BigInteger)(arrayItem.ToParameter().Value as List)[2].Value); - StackItem mapItem = new VM.Types.Map(new Dictionary(new[] { new KeyValuePair(byteItem, intItem) })); + StackItem mapItem = new Map(new Dictionary { [(PrimitiveType)byteItem] = intItem }); Assert.AreEqual(1000, (BigInteger)(mapItem.ToParameter().Value as List>)[0].Value.Value); } @@ -123,7 +125,7 @@ public void TestToStackItem() Assert.AreEqual(30000000000000L, (long)byteParameter.ToStackItem().GetBigInteger()); ContractParameter boolParameter = new ContractParameter { Type = ContractParameterType.Boolean, Value = false }; - Assert.AreEqual(false, boolParameter.ToStackItem().GetBoolean()); + Assert.AreEqual(false, boolParameter.ToStackItem().ToBoolean()); ContractParameter intParameter = new ContractParameter { Type = ContractParameterType.Integer, Value = new BigInteger(1000) }; Assert.AreEqual(1000, intParameter.ToStackItem().GetBigInteger()); @@ -135,10 +137,10 @@ public void TestToStackItem() Assert.AreEqual(0, h256Parameter.ToStackItem().GetBigInteger()); ContractParameter pkParameter = new ContractParameter { Type = ContractParameterType.PublicKey, Value = ECPoint.Parse("02f9ec1fd0a98796cf75b586772a4ddd41a0af07a1dbdf86a7238f74fb72503575", ECCurve.Secp256r1) }; - Assert.AreEqual("02f9ec1fd0a98796cf75b586772a4ddd41a0af07a1dbdf86a7238f74fb72503575", pkParameter.ToStackItem().GetByteArray().ToHexString()); + Assert.AreEqual("02f9ec1fd0a98796cf75b586772a4ddd41a0af07a1dbdf86a7238f74fb72503575", pkParameter.ToStackItem().GetSpan().ToHexString()); ContractParameter strParameter = new ContractParameter { Type = ContractParameterType.String, Value = "test😂👍" }; - Assert.AreEqual("test😂👍", Encoding.UTF8.GetString(strParameter.ToStackItem().GetByteArray())); + Assert.AreEqual("test😂👍", strParameter.ToStackItem().GetString()); ContractParameter interopParameter = new ContractParameter { Type = ContractParameterType.InteropInterface }; Assert.AreEqual(null, interopParameter.ToStackItem()); diff --git a/neo.UnitTests/Wallets/NEP6/UT_NEP6Account.cs b/neo.UnitTests/Wallets/NEP6/UT_NEP6Account.cs index 0477b8a595..10dd9ba015 100644 --- a/neo.UnitTests/Wallets/NEP6/UT_NEP6Account.cs +++ b/neo.UnitTests/Wallets/NEP6/UT_NEP6Account.cs @@ -121,7 +121,7 @@ public void TestToJson() json["isDefault"].ToString().Should().Be("false"); json["lock"].ToString().Should().Be("false"); json["key"].Should().BeNull(); - json["contract"]["script"].ToString().Should().Be("\"IQNgPziA63rqCtRQCJOSXkpC\\/qSKRO5viYoQs8fOBdKiZ6w=\""); + json["contract"]["script"].ToString().Should().Be(@"""IQNgPziA63rqCtRQCJOSXkpC/qSKRO5viYoQs8fOBdKiZ6w="""); json["extra"].Should().BeNull(); _account.Contract = null; diff --git a/neo.UnitTests/neo.UnitTests.csproj b/neo.UnitTests/neo.UnitTests.csproj index 2da1ba4968..da3694e024 100644 --- a/neo.UnitTests/neo.UnitTests.csproj +++ b/neo.UnitTests/neo.UnitTests.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.2 + netcoreapp3.0 Neo.UnitTests Neo.UnitTests true @@ -16,12 +16,12 @@ - + - - - + + + diff --git a/neo/Cryptography/RIPEMD160Managed.cs b/neo/Cryptography/RIPEMD160Managed.cs index 22ffafb835..89a4de23c8 100644 --- a/neo/Cryptography/RIPEMD160Managed.cs +++ b/neo/Cryptography/RIPEMD160Managed.cs @@ -1,4 +1,3 @@ -#if !NET47 using System; using System.Runtime.InteropServices; using System.Security; @@ -1051,4 +1050,3 @@ private static void DWORDToLittleEndian(byte[] block, uint[] x, int digits) } } } -#endif diff --git a/neo/Cryptography/SCrypt.cs b/neo/Cryptography/SCrypt.cs index e40c2c83c5..4e6f3bc389 100644 --- a/neo/Cryptography/SCrypt.cs +++ b/neo/Cryptography/SCrypt.cs @@ -245,12 +245,6 @@ private unsafe static void SMix(byte* B, int r, int N, uint* V, uint* XY) } } -#if NET47 - public static byte[] DeriveKey(byte[] password, byte[] salt, int N, int r, int p, int derivedKeyLength) - { - return Replicon.Cryptography.SCrypt.SCrypt.DeriveKey(password, salt, (ulong)N, (uint)r, (uint)p, (uint)derivedKeyLength); - } -#else public unsafe static byte[] DeriveKey(byte[] password, byte[] salt, int N, int r, int p, int derivedKeyLength) { var Ba = new byte[128 * r * p + 63]; @@ -280,7 +274,6 @@ public unsafe static byte[] DeriveKey(byte[] password, byte[] salt, int N, int r return buf; } -#endif private static void PBKDF2_SHA256(HMACSHA256 mac, byte[] password, byte[] salt, int saltLength, long iterationCount, byte[] derivedKey, int derivedKeyLength) { diff --git a/neo/Helper.cs b/neo/Helper.cs index fa3b384a35..8fa7005f5e 100644 --- a/neo/Helper.cs +++ b/neo/Helper.cs @@ -186,6 +186,14 @@ public static string ToHexString(this IEnumerable value) return sb.ToString(); } + public static string ToHexString(this ReadOnlySpan value) + { + StringBuilder sb = new StringBuilder(); + foreach (byte b in value) + sb.AppendFormat("{0:x2}", b); + return sb.ToString(); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] unsafe internal static int ToInt32(this byte[] value, int startIndex) { diff --git a/neo/IO/Data/LevelDB/Native.cs b/neo/IO/Data/LevelDB/Native.cs index 6a19ef4cfe..c83d3913f8 100644 --- a/neo/IO/Data/LevelDB/Native.cs +++ b/neo/IO/Data/LevelDB/Native.cs @@ -12,17 +12,6 @@ public enum CompressionType : byte public static class Native { -#if NET47 - static Native() - { - string platform = IntPtr.Size == 8 ? "x64" : "x86"; - LoadLibrary(Path.Combine(AppContext.BaseDirectory, platform, "libleveldb")); - } - - [DllImport("kernel32")] - private static extern IntPtr LoadLibrary(string dllToLoad); -#endif - #region Logger [DllImport("libleveldb", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr leveldb_logger_create(IntPtr /* Action */ logger); diff --git a/neo/IO/Helper.cs b/neo/IO/Helper.cs index c47878579d..adba79fad6 100644 --- a/neo/IO/Helper.cs +++ b/neo/IO/Helper.cs @@ -21,6 +21,17 @@ public static class Helper } } + public static unsafe T AsSerializable(this ReadOnlySpan value) where T : ISerializable, new() + { + if (value.IsEmpty) throw new FormatException(); + fixed (byte* pointer = value) + { + using UnmanagedMemoryStream ms = new UnmanagedMemoryStream(pointer, value.Length); + using BinaryReader reader = new BinaryReader(ms, Encoding.UTF8); + return reader.ReadSerializable(); + } + } + public static ISerializable AsSerializable(this byte[] value, Type type) { if (!typeof(ISerializable).GetTypeInfo().IsAssignableFrom(type)) @@ -43,6 +54,17 @@ public static ISerializable AsSerializable(this byte[] value, Type type) } } + public static unsafe T[] AsSerializableArray(this ReadOnlySpan value, int max = 0x1000000) where T : ISerializable, new() + { + if (value.IsEmpty) throw new FormatException(); + fixed (byte* pointer = value) + { + using UnmanagedMemoryStream ms = new UnmanagedMemoryStream(pointer, value.Length); + using BinaryReader reader = new BinaryReader(ms, Encoding.UTF8); + return reader.ReadSerializableArray(max); + } + } + public static int GetVarSize(int value) { if (value < 0xFD) @@ -245,7 +267,7 @@ public static void WriteNullableArray(this BinaryWriter writer, T[] value) wh } } - public static void WriteVarBytes(this BinaryWriter writer, byte[] value) + public static void WriteVarBytes(this BinaryWriter writer, ReadOnlySpan value) { writer.WriteVarInt(value.Length); writer.Write(value); diff --git a/neo/Ledger/Blockchain.ApplicationExecuted.cs b/neo/Ledger/Blockchain.ApplicationExecuted.cs index 1bcc65563f..8134a1bd13 100644 --- a/neo/Ledger/Blockchain.ApplicationExecuted.cs +++ b/neo/Ledger/Blockchain.ApplicationExecuted.cs @@ -1,6 +1,7 @@ using Neo.Network.P2P.Payloads; using Neo.SmartContract; using Neo.VM; +using Neo.VM.Types; using System.Linq; namespace Neo.Ledger diff --git a/neo/Network/RPC/PolicyAPI.cs b/neo/Network/RPC/PolicyAPI.cs index 969c1c22f1..1b401cd7e5 100644 --- a/neo/Network/RPC/PolicyAPI.cs +++ b/neo/Network/RPC/PolicyAPI.cs @@ -51,7 +51,7 @@ public long GetFeePerByte() public UInt160[] GetBlockedAccounts() { var result = (VM.Types.Array)TestInvoke(scriptHash, "getBlockedAccounts").Stack.Single().ToStackItem(); - return result.Select(p => new UInt160(p.GetByteArray())).ToArray(); + return result.Select(p => new UInt160(p.GetSpan().ToArray())).ToArray(); } } } diff --git a/neo/SmartContract/ApplicationEngine.cs b/neo/SmartContract/ApplicationEngine.cs index 2eeeef52e0..41c17aebeb 100644 --- a/neo/SmartContract/ApplicationEngine.cs +++ b/neo/SmartContract/ApplicationEngine.cs @@ -2,6 +2,7 @@ using Neo.Network.P2P.Payloads; using Neo.Persistence; using Neo.VM; +using Neo.VM.Types; using System; using System.Collections.Generic; diff --git a/neo/SmartContract/ContainerPlaceholder.cs b/neo/SmartContract/ContainerPlaceholder.cs index a379ddd9d3..29fa0f6e6e 100644 --- a/neo/SmartContract/ContainerPlaceholder.cs +++ b/neo/SmartContract/ContainerPlaceholder.cs @@ -1,4 +1,4 @@ -using Neo.VM; +using Neo.VM.Types; using System; namespace Neo.SmartContract @@ -10,8 +10,8 @@ internal class ContainerPlaceholder : StackItem public override bool Equals(StackItem other) => throw new NotSupportedException(); - public override bool GetBoolean() => throw new NotImplementedException(); + public override int GetHashCode() => throw new NotSupportedException(); - public override byte[] GetByteArray() => throw new NotSupportedException(); + public override bool ToBoolean() => throw new NotSupportedException(); } } diff --git a/neo/SmartContract/Enumerators/ConcatenatedEnumerator.cs b/neo/SmartContract/Enumerators/ConcatenatedEnumerator.cs index 2b75b1d46b..05cde03e54 100644 --- a/neo/SmartContract/Enumerators/ConcatenatedEnumerator.cs +++ b/neo/SmartContract/Enumerators/ConcatenatedEnumerator.cs @@ -1,4 +1,4 @@ -using Neo.VM; +using Neo.VM.Types; namespace Neo.SmartContract.Enumerators { diff --git a/neo/SmartContract/Enumerators/IEnumerator.cs b/neo/SmartContract/Enumerators/IEnumerator.cs index 4d1f11fe65..948bad9371 100644 --- a/neo/SmartContract/Enumerators/IEnumerator.cs +++ b/neo/SmartContract/Enumerators/IEnumerator.cs @@ -1,4 +1,4 @@ -using Neo.VM; +using Neo.VM.Types; using System; namespace Neo.SmartContract.Enumerators diff --git a/neo/SmartContract/Enumerators/IteratorKeysWrapper.cs b/neo/SmartContract/Enumerators/IteratorKeysWrapper.cs index d134eb884c..a7a7f040a4 100644 --- a/neo/SmartContract/Enumerators/IteratorKeysWrapper.cs +++ b/neo/SmartContract/Enumerators/IteratorKeysWrapper.cs @@ -1,5 +1,5 @@ using Neo.SmartContract.Iterators; -using Neo.VM; +using Neo.VM.Types; namespace Neo.SmartContract.Enumerators { diff --git a/neo/SmartContract/Enumerators/IteratorValuesWrapper.cs b/neo/SmartContract/Enumerators/IteratorValuesWrapper.cs index 15e06f2223..5e285938cf 100644 --- a/neo/SmartContract/Enumerators/IteratorValuesWrapper.cs +++ b/neo/SmartContract/Enumerators/IteratorValuesWrapper.cs @@ -1,5 +1,5 @@ using Neo.SmartContract.Iterators; -using Neo.VM; +using Neo.VM.Types; namespace Neo.SmartContract.Enumerators { diff --git a/neo/SmartContract/Helper.cs b/neo/SmartContract/Helper.cs index 4f7e320c37..f8c819dbeb 100644 --- a/neo/SmartContract/Helper.cs +++ b/neo/SmartContract/Helper.cs @@ -100,7 +100,7 @@ private static StackItem DeserializeStackItem(BinaryReader reader, uint maxArray { StackItem key = stack_temp.Pop(); StackItem value = stack_temp.Pop(); - map.Add(key, value); + map.Add((PrimitiveType)key, value); } item = map; break; @@ -199,17 +199,17 @@ private static void SerializeStackItem(StackItem item, BinaryWriter writer) item = unserialized.Pop(); switch (item) { - case ByteArray _: + case ByteArray bytes: writer.Write((byte)StackItemType.ByteArray); - writer.WriteVarBytes(item.GetByteArray()); + writer.WriteVarBytes(bytes.ToByteArray()); break; case VMBoolean _: writer.Write((byte)StackItemType.Boolean); - writer.Write(item.GetBoolean()); + writer.Write(item.ToBoolean()); break; - case Integer _: + case Integer integer: writer.Write((byte)StackItemType.Integer); - writer.WriteVarBytes(item.GetByteArray()); + writer.WriteVarBytes(integer.ToByteArray()); break; case InteropInterface _: throw new NotSupportedException(); @@ -285,7 +285,7 @@ internal static bool VerifyWitnesses(this IVerifiable verifiable, Snapshot snaps engine.LoadScript(verification); engine.LoadScript(verifiable.Witnesses[i].InvocationScript); if (engine.Execute().HasFlag(VMState.FAULT)) return false; - if (engine.ResultStack.Count != 1 || !engine.ResultStack.Pop().GetBoolean()) return false; + if (engine.ResultStack.Count != 1 || !engine.ResultStack.Pop().ToBoolean()) return false; } } return true; diff --git a/neo/SmartContract/IInteroperable.cs b/neo/SmartContract/IInteroperable.cs index 972147877c..047ce05168 100644 --- a/neo/SmartContract/IInteroperable.cs +++ b/neo/SmartContract/IInteroperable.cs @@ -1,4 +1,4 @@ -using Neo.VM; +using Neo.VM.Types; namespace Neo.SmartContract { diff --git a/neo/SmartContract/InteropDescriptor.cs b/neo/SmartContract/InteropDescriptor.cs index 6db599ea64..f446d4fbfc 100644 --- a/neo/SmartContract/InteropDescriptor.cs +++ b/neo/SmartContract/InteropDescriptor.cs @@ -1,4 +1,5 @@ using Neo.VM; +using Neo.VM.Types; using System; namespace Neo.SmartContract diff --git a/neo/SmartContract/InteropService.NEO.cs b/neo/SmartContract/InteropService.NEO.cs index 212d1091b6..10798c053d 100644 --- a/neo/SmartContract/InteropService.NEO.cs +++ b/neo/SmartContract/InteropService.NEO.cs @@ -81,10 +81,10 @@ private static bool Crypto_ECDsaVerify(ApplicationEngine engine) { InteropInterface _interface => _interface.GetInterface().GetHashData(), Null _ => engine.ScriptContainer.GetHashData(), - _ => item0.GetByteArray() + _ => item0.GetSpan().ToArray() }; - byte[] pubkey = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); - byte[] signature = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); + byte[] pubkey = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray(); + byte[] signature = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray(); try { engine.CurrentContext.EvaluationStack.Push(Crypto.Default.VerifySignature(message, signature, pubkey)); @@ -103,14 +103,14 @@ private static bool Crypto_ECDsaCheckMultiSig(ApplicationEngine engine) { InteropInterface _interface => _interface.GetInterface().GetHashData(), Null _ => engine.ScriptContainer.GetHashData(), - _ => item0.GetByteArray() + _ => item0.GetSpan().ToArray() }; int n; byte[][] pubkeys; StackItem item = engine.CurrentContext.EvaluationStack.Pop(); if (item is VMArray array1) { - pubkeys = array1.Select(p => p.GetByteArray()).ToArray(); + pubkeys = array1.Select(p => p.GetSpan().ToArray()).ToArray(); n = pubkeys.Length; if (n == 0) return false; } @@ -120,14 +120,14 @@ private static bool Crypto_ECDsaCheckMultiSig(ApplicationEngine engine) if (n < 1 || n > engine.CurrentContext.EvaluationStack.Count) return false; pubkeys = new byte[n][]; for (int i = 0; i < n; i++) - pubkeys[i] = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); + pubkeys[i] = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray(); } int m; byte[][] signatures; item = engine.CurrentContext.EvaluationStack.Pop(); if (item is VMArray array2) { - signatures = array2.Select(p => p.GetByteArray()).ToArray(); + signatures = array2.Select(p => p.GetSpan().ToArray()).ToArray(); m = signatures.Length; if (m == 0 || m > n) return false; } @@ -137,7 +137,7 @@ private static bool Crypto_ECDsaCheckMultiSig(ApplicationEngine engine) if (m < 1 || m > n || m > engine.CurrentContext.EvaluationStack.Count) return false; signatures = new byte[m][]; for (int i = 0; i < m; i++) - signatures[i] = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); + signatures[i] = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray(); } bool fSuccess = true; try @@ -161,7 +161,7 @@ private static bool Crypto_ECDsaCheckMultiSig(ApplicationEngine engine) private static bool Account_IsStandard(ApplicationEngine engine) { - UInt160 hash = new UInt160(engine.CurrentContext.EvaluationStack.Pop().GetByteArray()); + UInt160 hash = new UInt160(engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray()); ContractState contract = engine.Snapshot.Contracts.TryGet(hash); bool isStandard = contract is null || contract.Script.IsStandardContract(); engine.CurrentContext.EvaluationStack.Push(isStandard); @@ -170,7 +170,7 @@ private static bool Account_IsStandard(ApplicationEngine engine) private static bool Contract_Create(ApplicationEngine engine) { - byte[] script = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); + byte[] script = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray(); if (script.Length > 1024 * 1024) return false; var manifest = engine.CurrentContext.EvaluationStack.Pop().GetString(); @@ -194,7 +194,7 @@ private static bool Contract_Create(ApplicationEngine engine) private static bool Contract_Update(ApplicationEngine engine) { - byte[] script = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); + byte[] script = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray(); if (script.Length > 1024 * 1024) return false; var manifest = engine.CurrentContext.EvaluationStack.Pop().GetString(); if (manifest.Length > ContractManifest.MaxLength) return false; @@ -248,7 +248,7 @@ private static bool Storage_Find(ApplicationEngine engine) { StorageContext context = _interface.GetInterface(); if (!CheckStorageContext(engine, context)) return false; - byte[] prefix = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); + byte[] prefix = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray(); byte[] prefix_key = StorageKey.CreateSearchPrefix(context.ScriptHash, prefix); StorageIterator iterator = engine.AddDisposable(new StorageIterator(engine.Snapshot.Storages.Find(prefix_key).Where(p => p.Key.Key.Take(prefix.Length).SequenceEqual(prefix)).GetEnumerator())); engine.CurrentContext.EvaluationStack.Push(StackItem.FromInterface(iterator)); diff --git a/neo/SmartContract/InteropService.cs b/neo/SmartContract/InteropService.cs index be80366811..012876c96e 100644 --- a/neo/SmartContract/InteropService.cs +++ b/neo/SmartContract/InteropService.cs @@ -229,7 +229,7 @@ private static bool CheckWitness(ApplicationEngine engine, ECPoint pubkey) private static bool Runtime_CheckWitness(ApplicationEngine engine) { - byte[] hashOrPubkey = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); + byte[] hashOrPubkey = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray(); bool result; if (hashOrPubkey.Length == 20) result = CheckWitness(engine, new UInt160(hashOrPubkey)); @@ -251,7 +251,7 @@ private static bool Runtime_Notify(ApplicationEngine engine) private static bool Runtime_Log(ApplicationEngine engine) { - byte[] state = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); + byte[] state = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray(); if (state.Length > MaxNotificationSize) return false; string message = Encoding.UTF8.GetString(state); engine.SendLog(engine.CurrentScriptHash, message); @@ -288,7 +288,7 @@ private static bool Runtime_GetNotifications(ApplicationEngine engine) IEnumerable notifications = engine.Notifications; if (!item.IsNull) // must filter by scriptHash { - var hash = new UInt160(item.GetByteArray()); + var hash = new UInt160(item.GetSpan().ToArray()); notifications = notifications.Where(p => p.ScriptHash == hash); } @@ -313,7 +313,7 @@ private static bool Runtime_Deserialize(ApplicationEngine engine) StackItem item; try { - item = engine.CurrentContext.EvaluationStack.Pop().GetByteArray().DeserializeStackItem(engine.MaxArraySize, engine.MaxItemSize); + item = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray().DeserializeStackItem(engine.MaxArraySize, engine.MaxItemSize); } catch (FormatException) { @@ -335,7 +335,7 @@ private static bool Blockchain_GetHeight(ApplicationEngine engine) private static bool Blockchain_GetBlock(ApplicationEngine engine) { - byte[] data = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); + byte[] data = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray(); UInt256 hash; if (data.Length <= 5) hash = Blockchain.Singleton.GetBlockHash((uint)new BigInteger(data)); @@ -354,7 +354,7 @@ private static bool Blockchain_GetBlock(ApplicationEngine engine) private static bool Blockchain_GetTransaction(ApplicationEngine engine) { - byte[] hash = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); + byte[] hash = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray(); Transaction tx = engine.Snapshot.GetTransaction(new UInt256(hash)); if (tx == null) engine.CurrentContext.EvaluationStack.Push(StackItem.Null); @@ -365,7 +365,7 @@ private static bool Blockchain_GetTransaction(ApplicationEngine engine) private static bool Blockchain_GetTransactionHeight(ApplicationEngine engine) { - byte[] hash = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); + byte[] hash = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray(); var tx = engine.Snapshot.Transactions.TryGet(new UInt256(hash)); engine.CurrentContext.EvaluationStack.Push(tx != null ? new BigInteger(tx.BlockIndex) : BigInteger.MinusOne); return true; @@ -373,7 +373,7 @@ private static bool Blockchain_GetTransactionHeight(ApplicationEngine engine) private static bool Blockchain_GetTransactionFromBlock(ApplicationEngine engine) { - byte[] data = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); + byte[] data = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray(); UInt256 hash; if (data.Length <= 5) hash = Blockchain.Singleton.GetBlockHash((uint)new BigInteger(data)); @@ -403,7 +403,7 @@ private static bool Blockchain_GetTransactionFromBlock(ApplicationEngine engine) private static bool Blockchain_GetContract(ApplicationEngine engine) { - UInt160 hash = new UInt160(engine.CurrentContext.EvaluationStack.Pop().GetByteArray()); + UInt160 hash = new UInt160(engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray()); ContractState contract = engine.Snapshot.Contracts.TryGet(hash); if (contract == null) engine.CurrentContext.EvaluationStack.Push(StackItem.Null); @@ -438,7 +438,7 @@ private static bool Storage_Get(ApplicationEngine engine) { StorageContext context = _interface.GetInterface(); if (!CheckStorageContext(engine, context)) return false; - byte[] key = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); + byte[] key = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray(); StorageItem item = engine.Snapshot.Storages.TryGet(new StorageKey { ScriptHash = context.ScriptHash, @@ -471,7 +471,7 @@ private static bool Contract_Call(ApplicationEngine engine) { StackItem contractHash = engine.CurrentContext.EvaluationStack.Pop(); - ContractState contract = engine.Snapshot.Contracts.TryGet(new UInt160(contractHash.GetByteArray())); + ContractState contract = engine.Snapshot.Contracts.TryGet(new UInt160(contractHash.GetSpan().ToArray())); if (contract is null) return false; StackItem method = engine.CurrentContext.EvaluationStack.Pop(); @@ -542,8 +542,8 @@ private static bool Storage_Put(ApplicationEngine engine) if (!(engine.CurrentContext.EvaluationStack.Pop() is InteropInterface _interface)) return false; StorageContext context = _interface.GetInterface(); - byte[] key = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); - byte[] value = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); + byte[] key = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray(); + byte[] value = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray(); return PutEx(engine, context, key, value, StorageFlags.None); } @@ -552,8 +552,8 @@ private static bool Storage_PutEx(ApplicationEngine engine) if (!(engine.CurrentContext.EvaluationStack.Pop() is InteropInterface _interface)) return false; StorageContext context = _interface.GetInterface(); - byte[] key = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); - byte[] value = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); + byte[] key = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray(); + byte[] value = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray(); StorageFlags flags = (StorageFlags)(byte)engine.CurrentContext.EvaluationStack.Pop().GetBigInteger(); return PutEx(engine, context, key, value, flags); } @@ -568,7 +568,7 @@ private static bool Storage_Delete(ApplicationEngine engine) StorageKey key = new StorageKey { ScriptHash = context.ScriptHash, - Key = engine.CurrentContext.EvaluationStack.Pop().GetByteArray() + Key = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray() }; if (engine.Snapshot.Storages.TryGet(key)?.IsConstant == true) return false; engine.Snapshot.Storages.Delete(key); diff --git a/neo/SmartContract/Iterators/ArrayWrapper.cs b/neo/SmartContract/Iterators/ArrayWrapper.cs index 883327bee0..84c248c679 100644 --- a/neo/SmartContract/Iterators/ArrayWrapper.cs +++ b/neo/SmartContract/Iterators/ArrayWrapper.cs @@ -1,4 +1,4 @@ -using Neo.VM; +using Neo.VM.Types; using System; using System.Collections.Generic; @@ -18,7 +18,7 @@ public void Dispose() { } - public StackItem Key() + public PrimitiveType Key() { if (index < 0) throw new InvalidOperationException(); diff --git a/neo/SmartContract/Iterators/ConcatenatedIterator.cs b/neo/SmartContract/Iterators/ConcatenatedIterator.cs index 12f2a8cc8e..d8c556f140 100644 --- a/neo/SmartContract/Iterators/ConcatenatedIterator.cs +++ b/neo/SmartContract/Iterators/ConcatenatedIterator.cs @@ -1,4 +1,4 @@ -using Neo.VM; +using Neo.VM.Types; namespace Neo.SmartContract.Iterators { @@ -13,7 +13,7 @@ public ConcatenatedIterator(IIterator first, IIterator second) this.second = second; } - public StackItem Key() => current.Key(); + public PrimitiveType Key() => current.Key(); public StackItem Value() => current.Value(); public bool Next() diff --git a/neo/SmartContract/Iterators/IIterator.cs b/neo/SmartContract/Iterators/IIterator.cs index 3438286615..66b3ef3bc6 100644 --- a/neo/SmartContract/Iterators/IIterator.cs +++ b/neo/SmartContract/Iterators/IIterator.cs @@ -1,10 +1,10 @@ using Neo.SmartContract.Enumerators; -using Neo.VM; +using Neo.VM.Types; namespace Neo.SmartContract.Iterators { internal interface IIterator : IEnumerator { - StackItem Key(); + PrimitiveType Key(); } } diff --git a/neo/SmartContract/Iterators/MapWrapper.cs b/neo/SmartContract/Iterators/MapWrapper.cs index 343b946982..783993a43c 100644 --- a/neo/SmartContract/Iterators/MapWrapper.cs +++ b/neo/SmartContract/Iterators/MapWrapper.cs @@ -1,13 +1,13 @@ -using Neo.VM; +using Neo.VM.Types; using System.Collections.Generic; namespace Neo.SmartContract.Iterators { internal class MapWrapper : IIterator { - private readonly IEnumerator> enumerator; + private readonly IEnumerator> enumerator; - public MapWrapper(IEnumerable> map) + public MapWrapper(IEnumerable> map) { this.enumerator = map.GetEnumerator(); } @@ -17,7 +17,7 @@ public void Dispose() enumerator.Dispose(); } - public StackItem Key() + public PrimitiveType Key() { return enumerator.Current.Key; } diff --git a/neo/SmartContract/Iterators/StorageIterator.cs b/neo/SmartContract/Iterators/StorageIterator.cs index 45c9d21ebd..f35d70d890 100644 --- a/neo/SmartContract/Iterators/StorageIterator.cs +++ b/neo/SmartContract/Iterators/StorageIterator.cs @@ -1,5 +1,5 @@ using Neo.Ledger; -using Neo.VM; +using Neo.VM.Types; using System.Collections.Generic; namespace Neo.SmartContract.Iterators @@ -18,7 +18,7 @@ public void Dispose() enumerator.Dispose(); } - public StackItem Key() + public PrimitiveType Key() { return enumerator.Current.Key.Key; } diff --git a/neo/SmartContract/JsonSerializer.cs b/neo/SmartContract/JsonSerializer.cs index 96c525e0b1..14edaa5caa 100644 --- a/neo/SmartContract/JsonSerializer.cs +++ b/neo/SmartContract/JsonSerializer.cs @@ -26,7 +26,7 @@ public static JObject Serialize(StackItem item) } case ByteArray buffer: { - return Convert.ToBase64String(buffer.GetByteArray()); + return Convert.ToBase64String(buffer.GetSpan()); } case Integer num: { @@ -37,7 +37,7 @@ public static JObject Serialize(StackItem item) } case VMBoolean boolean: { - return boolean.GetBoolean(); + return boolean.ToBoolean(); } case Map map: { diff --git a/neo/SmartContract/Native/ContractMethodMetadata.cs b/neo/SmartContract/Native/ContractMethodMetadata.cs index 9267bb7db9..87dfba4a40 100644 --- a/neo/SmartContract/Native/ContractMethodMetadata.cs +++ b/neo/SmartContract/Native/ContractMethodMetadata.cs @@ -1,4 +1,4 @@ -using Neo.VM; +using Neo.VM.Types; using System; using VMArray = Neo.VM.Types.Array; diff --git a/neo/SmartContract/Native/NativeContract.cs b/neo/SmartContract/Native/NativeContract.cs index 546743fc49..b9d3c9ecba 100644 --- a/neo/SmartContract/Native/NativeContract.cs +++ b/neo/SmartContract/Native/NativeContract.cs @@ -5,6 +5,7 @@ using Neo.SmartContract.Manifest; using Neo.SmartContract.Native.Tokens; using Neo.VM; +using Neo.VM.Types; using System; using System.Collections.Generic; using System.Linq; diff --git a/neo/SmartContract/Native/PolicyContract.cs b/neo/SmartContract/Native/PolicyContract.cs index 3ffe8199e5..797104924e 100644 --- a/neo/SmartContract/Native/PolicyContract.cs +++ b/neo/SmartContract/Native/PolicyContract.cs @@ -7,6 +7,7 @@ using Neo.Persistence; using Neo.SmartContract.Manifest; using Neo.VM; +using Neo.VM.Types; using System; using System.Collections.Generic; using System.Linq; @@ -144,7 +145,7 @@ private StackItem SetFeePerByte(ApplicationEngine engine, VMArray args) private StackItem BlockAccount(ApplicationEngine engine, VMArray args) { if (!CheckValidators(engine)) return false; - UInt160 account = new UInt160(args[0].GetByteArray()); + UInt160 account = new UInt160(args[0].GetSpan().ToArray()); StorageKey key = CreateStorageKey(Prefix_BlockedAccounts); StorageItem storage = engine.Snapshot.Storages[key]; HashSet accounts = new HashSet(storage.Value.AsSerializableArray()); @@ -158,7 +159,7 @@ private StackItem BlockAccount(ApplicationEngine engine, VMArray args) private StackItem UnblockAccount(ApplicationEngine engine, VMArray args) { if (!CheckValidators(engine)) return false; - UInt160 account = new UInt160(args[0].GetByteArray()); + UInt160 account = new UInt160(args[0].GetSpan().ToArray()); StorageKey key = CreateStorageKey(Prefix_BlockedAccounts); StorageItem storage = engine.Snapshot.Storages[key]; HashSet accounts = new HashSet(storage.Value.AsSerializableArray()); diff --git a/neo/SmartContract/Native/Tokens/GasToken.cs b/neo/SmartContract/Native/Tokens/GasToken.cs index 7ef522dab7..4266494a4f 100644 --- a/neo/SmartContract/Native/Tokens/GasToken.cs +++ b/neo/SmartContract/Native/Tokens/GasToken.cs @@ -5,6 +5,7 @@ using Neo.Network.P2P.Payloads; using Neo.Persistence; using Neo.VM; +using Neo.VM.Types; using System; using System.Linq; using System.Numerics; diff --git a/neo/SmartContract/Native/Tokens/NeoToken.cs b/neo/SmartContract/Native/Tokens/NeoToken.cs index 7b28bd0923..ba059aff4d 100644 --- a/neo/SmartContract/Native/Tokens/NeoToken.cs +++ b/neo/SmartContract/Native/Tokens/NeoToken.cs @@ -119,7 +119,7 @@ protected override bool OnPersist(ApplicationEngine engine) [ContractMethod(0_03000000, ContractParameterType.Integer, ParameterTypes = new[] { ContractParameterType.Hash160, ContractParameterType.Integer }, ParameterNames = new[] { "account", "end" }, SafeMethod = true)] private StackItem UnclaimedGas(ApplicationEngine engine, VMArray args) { - UInt160 account = new UInt160(args[0].GetByteArray()); + UInt160 account = new UInt160(args[0].GetSpan().ToArray()); uint end = (uint)args[1].GetBigInteger(); return UnclaimedGas(engine.Snapshot, account, end); } @@ -135,7 +135,7 @@ public BigInteger UnclaimedGas(Snapshot snapshot, UInt160 account, uint end) [ContractMethod(0_05000000, ContractParameterType.Boolean, ParameterTypes = new[] { ContractParameterType.PublicKey }, ParameterNames = new[] { "pubkey" })] private StackItem RegisterValidator(ApplicationEngine engine, VMArray args) { - ECPoint pubkey = args[0].GetByteArray().AsSerializable(); + ECPoint pubkey = args[0].GetSpan().AsSerializable(); return RegisterValidator(engine.Snapshot, pubkey); } @@ -153,8 +153,8 @@ private bool RegisterValidator(Snapshot snapshot, ECPoint pubkey) [ContractMethod(5_00000000, ContractParameterType.Boolean, ParameterTypes = new[] { ContractParameterType.Hash160, ContractParameterType.Array }, ParameterNames = new[] { "account", "pubkeys" })] private StackItem Vote(ApplicationEngine engine, VMArray args) { - UInt160 account = new UInt160(args[0].GetByteArray()); - ECPoint[] pubkeys = ((VMArray)args[1]).Select(p => p.GetByteArray().AsSerializable()).ToArray(); + UInt160 account = new UInt160(args[0].GetSpan().ToArray()); + ECPoint[] pubkeys = ((VMArray)args[1]).Select(p => p.GetSpan().AsSerializable()).ToArray(); if (!InteropService.CheckWitness(engine, account)) return false; StorageKey key_account = CreateAccountKey(account); if (engine.Snapshot.Storages.TryGet(key_account) is null) return false; @@ -266,7 +266,7 @@ protected override void FromStruct(Struct @struct) { base.FromStruct(@struct); BalanceHeight = (uint)@struct[1].GetBigInteger(); - Votes = @struct[2].GetByteArray().AsSerializableArray(Blockchain.MaxValidators); + Votes = @struct[2].GetSpan().AsSerializableArray(Blockchain.MaxValidators); } protected override Struct ToStruct() diff --git a/neo/SmartContract/Native/Tokens/Nep5Token.cs b/neo/SmartContract/Native/Tokens/Nep5Token.cs index a95885a665..6d35d00410 100644 --- a/neo/SmartContract/Native/Tokens/Nep5Token.cs +++ b/neo/SmartContract/Native/Tokens/Nep5Token.cs @@ -4,6 +4,7 @@ using Neo.Persistence; using Neo.SmartContract.Manifest; using Neo.VM; +using Neo.VM.Types; using System; using System.Collections.Generic; using System.Numerics; @@ -147,7 +148,7 @@ public virtual BigInteger TotalSupply(Snapshot snapshot) [ContractMethod(0_01000000, ContractParameterType.Integer, ParameterTypes = new[] { ContractParameterType.Hash160 }, ParameterNames = new[] { "account" }, SafeMethod = true)] protected StackItem BalanceOf(ApplicationEngine engine, VMArray args) { - return BalanceOf(engine.Snapshot, new UInt160(args[0].GetByteArray())); + return BalanceOf(engine.Snapshot, new UInt160(args[0].GetSpan().ToArray())); } public virtual BigInteger BalanceOf(Snapshot snapshot, UInt160 account) @@ -161,8 +162,8 @@ public virtual BigInteger BalanceOf(Snapshot snapshot, UInt160 account) [ContractMethod(0_08000000, ContractParameterType.Boolean, ParameterTypes = new[] { ContractParameterType.Hash160, ContractParameterType.Hash160, ContractParameterType.Integer }, ParameterNames = new[] { "from", "to", "amount" })] protected StackItem Transfer(ApplicationEngine engine, VMArray args) { - UInt160 from = new UInt160(args[0].GetByteArray()); - UInt160 to = new UInt160(args[1].GetByteArray()); + UInt160 from = new UInt160(args[0].GetSpan().ToArray()); + UInt160 to = new UInt160(args[1].GetSpan().ToArray()); BigInteger amount = args[2].GetBigInteger(); return Transfer(engine, from, to, amount); } diff --git a/neo/SmartContract/NotifyEventArgs.cs b/neo/SmartContract/NotifyEventArgs.cs index 8fab961408..e1d3fd8c1e 100644 --- a/neo/SmartContract/NotifyEventArgs.cs +++ b/neo/SmartContract/NotifyEventArgs.cs @@ -1,5 +1,5 @@ using Neo.Network.P2P.Payloads; -using Neo.VM; +using Neo.VM.Types; using System; namespace Neo.SmartContract diff --git a/neo/VM/Helper.cs b/neo/VM/Helper.cs index 5d2a2aa485..37a4d964c2 100644 --- a/neo/VM/Helper.cs +++ b/neo/VM/Helper.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Numerics; +using System.Text; using VMArray = Neo.VM.Types.Array; using VMBoolean = Neo.VM.Types.Boolean; @@ -165,6 +166,32 @@ public static ScriptBuilder EmitSysCall(this ScriptBuilder sb, uint method, para return sb.EmitSysCall(method); } + public static BigInteger GetBigInteger(this StackItem item) + { + if (!(item is PrimitiveType primitive)) + throw new ArgumentException(); + return primitive.ToBigInteger(); + } + + public static int GetByteLength(this StackItem item) + { + if (!(item is PrimitiveType primitive)) + throw new ArgumentException(); + return primitive.GetByteLength(); + } + + public static ReadOnlySpan GetSpan(this StackItem item) + { + if (!(item is PrimitiveType primitive)) + throw new ArgumentException(); + return primitive.ToByteArray(); + } + + public static string GetString(this StackItem item) + { + return Encoding.UTF8.GetString(item.GetSpan()); + } + /// /// Generate scripts to call a specific method from a specific contract. /// @@ -222,14 +249,14 @@ private static ContractParameter ToParameter(StackItem item, List ReferenceEquals(p.Item2, parameter))?.Item1; if (stackItem is null) { - stackItem = new Map(((IList>)parameter.Value).ToDictionary(p => ToStackItem(p.Key, context), p => ToStackItem(p.Value, context))); + stackItem = new Map(((IList>)parameter.Value).ToDictionary(p => (PrimitiveType)ToStackItem(p.Key, context), p => ToStackItem(p.Value, context))); context.Add(new Tuple(stackItem, parameter)); } break; diff --git a/neo/neo.csproj b/neo/neo.csproj index 98824eb526..5556e8c660 100644 --- a/neo/neo.csproj +++ b/neo/neo.csproj @@ -5,7 +5,7 @@ Neo 3.0.0-preview1 The Neo Project - netstandard2.0;net47 + netstandard2.1 true Neo Neo @@ -17,25 +17,19 @@ Neo The Neo Project Neo - preview - + - - - - - - - - - + + + +