diff --git a/src/Neo/SmartContract/Native/Role.cs b/src/Neo/SmartContract/Native/Role.cs index c0954d8fcd..710cc6f390 100644 --- a/src/Neo/SmartContract/Native/Role.cs +++ b/src/Neo/SmartContract/Native/Role.cs @@ -29,6 +29,11 @@ public enum Role : byte /// /// NeoFS Alphabet nodes. /// - NeoFSAlphabetNode = 16 + NeoFSAlphabetNode = 16, + + /// + /// P2P Notary nodes used to process P2P notary requests. + /// + P2PNotary = 32 } } diff --git a/tests/Neo.UnitTests/SmartContract/Native/UT_RoleManagement.cs b/tests/Neo.UnitTests/SmartContract/Native/UT_RoleManagement.cs index a87c630194..25ca7ee0d6 100644 --- a/tests/Neo.UnitTests/SmartContract/Native/UT_RoleManagement.cs +++ b/tests/Neo.UnitTests/SmartContract/Native/UT_RoleManagement.cs @@ -18,6 +18,7 @@ using Neo.SmartContract; using Neo.SmartContract.Native; using Neo.UnitTests.Extensions; +using Neo.Wallets; using System; using System.Collections.Generic; using System.Linq; @@ -45,49 +46,60 @@ public void Clean() [TestMethod] public void TestSetAndGet() { - var snapshot1 = _snapshot.CreateSnapshot(); - UInt160 committeeMultiSigAddr = NativeContract.NEO.GetCommitteeAddress(snapshot1); - ECPoint[] validators = NativeContract.NEO.ComputeNextBlockValidators(snapshot1, TestProtocolSettings.Default); - List notifications = new List(); - EventHandler ev = (o, e) => notifications.Add(e); - ApplicationEngine.Notify += ev; - var ret = NativeContract.RoleManagement.Call( - snapshot1, - new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), - new Block { Header = new Header() }, - "designateAsRole", - new ContractParameter(ContractParameterType.Integer) { Value = new BigInteger((int)Role.StateValidator) }, - new ContractParameter(ContractParameterType.Array) { Value = validators.Select(p => new ContractParameter(ContractParameterType.ByteArray) { Value = p.ToArray() }).ToList() } - ); - snapshot1.Commit(); - ApplicationEngine.Notify -= ev; - notifications.Count.Should().Be(1); - notifications[0].EventName.Should().Be("Designation"); - var snapshot2 = _snapshot.CreateSnapshot(); - ret = NativeContract.RoleManagement.Call( - snapshot2, - "getDesignatedByRole", - new ContractParameter(ContractParameterType.Integer) { Value = new BigInteger((int)Role.StateValidator) }, - new ContractParameter(ContractParameterType.Integer) { Value = new BigInteger(1u) } - ); - ret.Should().BeOfType(); - (ret as VM.Types.Array).Count.Should().Be(7); - (ret as VM.Types.Array)[0].GetSpan().ToHexString().Should().Be(validators[0].ToArray().ToHexString()); - (ret as VM.Types.Array)[1].GetSpan().ToHexString().Should().Be(validators[1].ToArray().ToHexString()); - (ret as VM.Types.Array)[2].GetSpan().ToHexString().Should().Be(validators[2].ToArray().ToHexString()); - (ret as VM.Types.Array)[3].GetSpan().ToHexString().Should().Be(validators[3].ToArray().ToHexString()); - (ret as VM.Types.Array)[4].GetSpan().ToHexString().Should().Be(validators[4].ToArray().ToHexString()); - (ret as VM.Types.Array)[5].GetSpan().ToHexString().Should().Be(validators[5].ToArray().ToHexString()); - (ret as VM.Types.Array)[6].GetSpan().ToHexString().Should().Be(validators[6].ToArray().ToHexString()); + byte[] privateKey1 = new byte[32]; + var rng1 = System.Security.Cryptography.RandomNumberGenerator.Create(); + rng1.GetBytes(privateKey1); + KeyPair key1 = new KeyPair(privateKey1); + byte[] privateKey2 = new byte[32]; + var rng2 = System.Security.Cryptography.RandomNumberGenerator.Create(); + rng2.GetBytes(privateKey2); + KeyPair key2 = new KeyPair(privateKey2); + ECPoint[] publicKeys = new ECPoint[2]; + publicKeys[0] = key1.PublicKey; + publicKeys[1] = key2.PublicKey; + publicKeys = publicKeys.OrderBy(p => p).ToArray(); - ret = NativeContract.RoleManagement.Call( - snapshot2, - "getDesignatedByRole", - new ContractParameter(ContractParameterType.Integer) { Value = new BigInteger((int)Role.StateValidator) }, - new ContractParameter(ContractParameterType.Integer) { Value = new BigInteger(0) } - ); - ret.Should().BeOfType(); - (ret as VM.Types.Array).Count.Should().Be(0); + List roles = new List() { Role.StateValidator, Role.Oracle, Role.NeoFSAlphabetNode, Role.P2PNotary }; + foreach (var role in roles) + { + var snapshot1 = _snapshot.CreateSnapshot(); + UInt160 committeeMultiSigAddr = NativeContract.NEO.GetCommitteeAddress(snapshot1); + List notifications = new List(); + EventHandler ev = (o, e) => notifications.Add(e); + ApplicationEngine.Notify += ev; + var ret = NativeContract.RoleManagement.Call( + snapshot1, + new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), + new Block { Header = new Header() }, + "designateAsRole", + new ContractParameter(ContractParameterType.Integer) { Value = new BigInteger((int)role) }, + new ContractParameter(ContractParameterType.Array) { Value = publicKeys.Select(p => new ContractParameter(ContractParameterType.ByteArray) { Value = p.ToArray() }).ToList() } + ); + snapshot1.Commit(); + ApplicationEngine.Notify -= ev; + notifications.Count.Should().Be(1); + notifications[0].EventName.Should().Be("Designation"); + var snapshot2 = _snapshot.CreateSnapshot(); + ret = NativeContract.RoleManagement.Call( + snapshot2, + "getDesignatedByRole", + new ContractParameter(ContractParameterType.Integer) { Value = new BigInteger((int)role) }, + new ContractParameter(ContractParameterType.Integer) { Value = new BigInteger(1u) } + ); + ret.Should().BeOfType(); + (ret as VM.Types.Array).Count.Should().Be(2); + (ret as VM.Types.Array)[0].GetSpan().ToHexString().Should().Be(publicKeys[0].ToArray().ToHexString()); + (ret as VM.Types.Array)[1].GetSpan().ToHexString().Should().Be(publicKeys[1].ToArray().ToHexString()); + + ret = NativeContract.RoleManagement.Call( + snapshot2, + "getDesignatedByRole", + new ContractParameter(ContractParameterType.Integer) { Value = new BigInteger((int)role) }, + new ContractParameter(ContractParameterType.Integer) { Value = new BigInteger(0) } + ); + ret.Should().BeOfType(); + (ret as VM.Types.Array).Count.Should().Be(0); + } } private void ApplicationEngine_Notify(object sender, NotifyEventArgs e)