-
Notifications
You must be signed in to change notification settings - Fork 1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement NotaryAssisted transaction attribute
Close #2896. Use a stub for native Notary contract hash since this contract is not implemented yet. Thus, technically, NotaryAssisted attribute verification will always fail on real network until native Notary is implemented. Signed-off-by: Anna Shaleva <[email protected]>
- Loading branch information
1 parent
74562d5
commit 6da4ae2
Showing
5 changed files
with
168 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
// Copyright (C) 2015-2024 The Neo Project. | ||
// | ||
// NotaryAssisted.cs file belongs to the neo project and is free | ||
// software distributed under the MIT software license, see the | ||
// accompanying file LICENSE in the main directory of the | ||
// repository or http://www.opensource.org/licenses/mit-license.php | ||
// for more details. | ||
// | ||
// Redistribution and use in source and binary forms with or without | ||
// modifications are permitted. | ||
|
||
using Neo.IO; | ||
using Neo.Json; | ||
using Neo.Persistence; | ||
using Neo.SmartContract.Native; | ||
using System.IO; | ||
using System.Linq; | ||
|
||
namespace Neo.Network.P2P.Payloads | ||
{ | ||
public class NotaryAssisted : TransactionAttribute | ||
{ | ||
/// <summary> | ||
/// Indicates the number of keys participating in the transaction (main or fallback) signing process. | ||
/// </summary> | ||
public byte NKeys; | ||
|
||
public override TransactionAttributeType Type => TransactionAttributeType.NotaryAssisted; | ||
|
||
public override bool AllowMultiple => false; | ||
|
||
public override int Size => base.Size + sizeof(byte); | ||
|
||
protected override void DeserializeWithoutType(ref MemoryReader reader) | ||
{ | ||
NKeys = reader.ReadByte(); | ||
} | ||
|
||
protected override void SerializeWithoutType(BinaryWriter writer) | ||
{ | ||
writer.Write(NKeys); | ||
} | ||
|
||
public override JObject ToJson() | ||
{ | ||
JObject json = base.ToJson(); | ||
json["nkeys"] = NKeys; | ||
return json; | ||
} | ||
|
||
public override bool Verify(DataCache snapshot, Transaction tx) | ||
{ | ||
// Stub native Notary contract related check until the contract is implemented. | ||
UInt160 notaryH = new UInt160(); | ||
return tx.Signers.Any(p => p.Account.Equals(notaryH)); | ||
} | ||
|
||
public override long CalculateNetworkFee(DataCache snapshot, Transaction tx) | ||
{ | ||
return (NKeys + 1) * base.CalculateNetworkFee(snapshot, tx); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
88 changes: 88 additions & 0 deletions
88
tests/Neo.UnitTests/Network/P2P/Payloads/UT_NotaryAssisted.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
// Copyright (C) 2015-2024 The Neo Project. | ||
// | ||
// UT_NotaryAssisted.cs file belongs to the neo project and is free | ||
// software distributed under the MIT software license, see the | ||
// accompanying file LICENSE in the main directory of the | ||
// repository or http://www.opensource.org/licenses/mit-license.php | ||
// for more details. | ||
// | ||
// Redistribution and use in source and binary forms with or without | ||
// modifications are permitted. | ||
|
||
using FluentAssertions; | ||
using Microsoft.VisualStudio.TestTools.UnitTesting; | ||
using Neo.IO; | ||
using Neo.Network.P2P.Payloads; | ||
using Neo.SmartContract; | ||
using Neo.SmartContract.Native; | ||
using Neo.VM; | ||
using System; | ||
|
||
namespace Neo.UnitTests.Network.P2P.Payloads | ||
{ | ||
[TestClass] | ||
public class UT_NotaryAssisted | ||
{ | ||
[TestMethod] | ||
public void Size_Get() | ||
{ | ||
var attr = new NotaryAssisted() { NKeys = 4 }; | ||
attr.Size.Should().Be(1 + 1); | ||
} | ||
|
||
[TestMethod] | ||
public void ToJson() | ||
{ | ||
var attr = new NotaryAssisted() { NKeys = 4 }; | ||
var json = attr.ToJson().ToString(); | ||
Assert.AreEqual(@"{""type"":""NotaryAssisted"",""nkeys"":4}", json); | ||
} | ||
|
||
[TestMethod] | ||
public void DeserializeAndSerialize() | ||
{ | ||
var attr = new NotaryAssisted() { NKeys = 4 }; | ||
|
||
var clone = attr.ToArray().AsSerializable<NotaryAssisted>(); | ||
Assert.AreEqual(clone.Type, attr.Type); | ||
|
||
// As transactionAttribute | ||
byte[] buffer = attr.ToArray(); | ||
var reader = new MemoryReader(buffer); | ||
clone = TransactionAttribute.DeserializeFrom(ref reader) as NotaryAssisted; | ||
Assert.AreEqual(clone.Type, attr.Type); | ||
|
||
// Wrong type | ||
buffer[0] = 0xff; | ||
Assert.ThrowsException<FormatException>(() => | ||
{ | ||
var reader = new MemoryReader(buffer); | ||
TransactionAttribute.DeserializeFrom(ref reader); | ||
}); | ||
} | ||
|
||
[TestMethod] | ||
public void Verify() | ||
{ | ||
var attr = new NotaryAssisted() { NKeys = 4 }; | ||
|
||
// Temporary use Notary contract hash stub for valid transaction. | ||
var txGood = new Transaction { Signers = new Signer[] { new Signer() { Account = UInt160.Zero } } }; | ||
var txBad = new Transaction { Signers = new Signer[] { new Signer() { Account = UInt160.Parse("0xa400ff00ff00ff00ff00ff00ff00ff00ff00ff01") } } }; | ||
var snapshot = TestBlockchain.GetTestSnapshot(); | ||
|
||
Assert.IsTrue(attr.Verify(snapshot, txGood)); | ||
Assert.IsFalse(attr.Verify(snapshot, txBad)); | ||
} | ||
|
||
[TestMethod] | ||
public void CalculateNetworkFee() | ||
{ | ||
var snapshot = TestBlockchain.GetTestSnapshot(); | ||
var attr = new NotaryAssisted() { NKeys = 4 }; | ||
var tx = new Transaction { Signers = new Signer[] { new Signer() { Account = UInt160.Zero } } }; | ||
|
||
Assert.AreEqual((4 + 1) * 1000_0000, attr.CalculateNetworkFee(snapshot, tx)); | ||
} | ||
} | ||
} |