-
Notifications
You must be signed in to change notification settings - Fork 141
/
IBlockPolicy.cs
48 lines (46 loc) · 2.01 KB
/
IBlockPolicy.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using System;
using System.Collections.Generic;
using Libplanet.Action;
using Libplanet.Blocks;
namespace Libplanet.Blockchain.Policies
{
/// <summary>
/// An interface to determine if consecutive <see cref="Block{T}"/>s are
/// valid, and to suggest how difficult a <see cref="Block{T}.Nonce"/>
/// for a <see cref="Block{T}"/> to be mined.
/// </summary>
/// <typeparam name="T">An <see cref="IAction"/> type. It should match
/// to <see cref="Block{T}"/>'s type parameter.</typeparam>
public interface IBlockPolicy<T>
where T : IAction, new()
{
/// <summary>
/// Checks if <paramref name="blocks"/> are invalid, and if that
/// returns the reason.
/// <para>Note that it returns <c>null</c> when blocks are
/// <em>valid</em>.</para>
/// </summary>
/// <param name="blocks">Consecutive <see cref="Block{T}"/>s to
/// validate.</param>
/// <param name="currentTime">The current time to be used to validate
/// of <see cref="Block{T}.Timestamp"/>s.
/// Usually <see cref="DateTimeOffset.UtcNow"/> is used.</param>
/// <returns>The reason why the given <paramref name="blocks"/> are
/// <em>invalid</em>, or <c>null</c> if <paramref name="blocks"/> are
/// <em>valid</em>.</returns>
InvalidBlockException ValidateBlocks(
IEnumerable<Block<T>> blocks,
DateTimeOffset currentTime
);
/// <summary>
/// Determines a right <see cref="Block{T}.Difficulty"/>
/// for a new <see cref="Block{T}"/> to be mined
/// right after the given <paramref name="blocks"/>.
/// </summary>
/// <param name="blocks">Consecutive <see cref="Block{T}"/>s to be
/// followed by a new <see cref="Block{T}"/> to be mined.</param>
/// <returns>A right <see cref="Block{T}.Difficulty"/>
/// for a new <see cref="Block{T}"/> to be mined.</returns>
int GetNextBlockDifficulty(IEnumerable<Block<T>> blocks);
}
}