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)