Interface IActionRenderer<T>
Listens state changes of every step of actions, besides blocks, on a BlockChain<T>. If you need more fine-grained events than IRenderer<T>, implement this interface instead.
The invocation order of methods for each Block<T> are:
- RenderReorg(Block<T>, Block<T>, Block<T>) (one time)
- UnrenderAction(IAction, IActionContext, IAccountStateDelta) & UnrenderActionError(IAction, IActionContext, Exception) (zero or more times)
- RenderBlock(Block<T>, Block<T>) (one time)
- RenderAction(IAction, IActionContext, IAccountStateDelta) & RenderActionError(IAction, IActionContext, Exception) (zero or more times)
- RenderBlockEnd(Block<T>, Block<T>) (one time)
- RenderReorgEnd(Block<T>, Block<T>, Block<T>) (one time)
Inherited Members
Namespace: Libplanet.Blockchain.Renderers
Assembly: Libplanet.dll
Syntax
public interface IActionRenderer<T> : IRenderer<T> where T : IAction, new()
Type Parameters
Name | Description |
---|---|
T | An IAction type. It should match to BlockChain<T>'s type parameter. |
Remarks
Although Transaction<T>s affect the states in the IStateStore all or nothing at all (i.e., atomically), IActionRenderer<T> receives all action-related events (RenderAction(IAction, IActionContext, IAccountStateDelta)/RenderActionError(IAction, IActionContext, Exception)/UnrenderAction(IAction, IActionContext, IAccountStateDelta)/UnrenderActionError(IAction, IActionContext, Exception)) immediately without buffering, which means actions are rendered even before whether there are any actions throwing an exception in the same transaction is determined. In other words, for IActionRenderer<T>s, it is not guaranteed that actions in a transaction are atomic.
If your action renderer expects to receive only render events about actions belonging successful transactions, wrap your action renderer with AtomicActionRenderer<T>.
Methods
| Improve this Doc View SourceRenderAction(IAction, IActionContext, IAccountStateDelta)
Does things that should be done right after an action
is executed and applied to the blockchain.
Declaration
void RenderAction(IAction action, IActionContext context, IAccountStateDelta nextStates)
Parameters
Type | Name | Description |
---|---|---|
IAction | action | An executed action. |
IActionContext | context | The equivalent context object to an object passed to
the |
IAccountStateDelta | nextStates | The states right after this action executed,
which means it is equivalent to the states |
Remarks
It is guaranteed to be called only once for an action
,
and only after applied to the blockchain, unless an exception is thrown during executing
the action
(in that case RenderActionError(IAction, IActionContext, Exception) is called instead) or
once the action
has been unrendered.
Also note that this method is invoked after RenderBlock(Block<T>, Block<T>) method is called
(where its second parameter newTip
contains a transaction the action
belongs to).
The reason why the parameter action
takes
IAction instead of T
is because it can take
block actions (BlockAction) besides transaction
actions (Actions).
RenderActionError(IAction, IActionContext, Exception)
Does the similar things to RenderAction(IAction, IActionContext, IAccountStateDelta), except that this method
is invoked when action
has terminated with an exception.
Declaration
void RenderActionError(IAction action, IActionContext context, Exception exception)
Parameters
Type | Name | Description |
---|---|---|
IAction | action | An action which threw an exception during execution. |
IActionContext | context | The equivalent context object to an object passed to
the |
Exception | exception | The exception thrown during executing the |
Remarks
Also note that this method is invoked after RenderBlock(Block<T>, Block<T>) method is called
(where its second parameter newTip
contains a transaction the action
belongs to).
The reason why the parameter action
takes
IAction instead of T
is because it can take
block actions (BlockAction) besides transaction
actions (Actions).
RenderBlockEnd(Block<T>, Block<T>)
Does things that should be done right all actions in a new Block<T> are rendered.
Declaration
void RenderBlockEnd(Block<T> oldTip, Block<T> newTip)
Parameters
Type | Name | Description |
---|---|---|
Block<T> | oldTip | The previous Tip. |
Block<T> | newTip | The current Tip. |
Remarks
It is guaranteed to be called only once for a block.
UnrenderAction(IAction, IActionContext, IAccountStateDelta)
Does things that should be undone right after the given action
is
invalidated (mostly due to reorg, i.e., a block which the action has belonged to becomes
considered stale).
This method takes the equivalent arguments to RenderAction(IAction, IActionContext, IAccountStateDelta) method.
Declaration
void UnrenderAction(IAction action, IActionContext context, IAccountStateDelta nextStates)
Parameters
Type | Name | Description |
---|---|---|
IAction | action | A stale action. |
IActionContext | context | The equivalent context object to an object passed to
the |
IAccountStateDelta | nextStates | The states right after this action executed,
which means it is equivalent to the states |
Remarks
As a rule of thumb, this should be the inverse of RenderAction(IAction, IActionContext, IAccountStateDelta) method with redrawing the graphics on the display at the finish.
UnrenderActionError(IAction, IActionContext, Exception)
Does the similar things to UnrenderAction(IAction, IActionContext, IAccountStateDelta), except that
this method is invoked when action
has terminated with an exception.
This method takes the equivalent arguments to RenderActionError(IAction, IActionContext, Exception) method.
Declaration
void UnrenderActionError(IAction action, IActionContext context, Exception exception)
Parameters
Type | Name | Description |
---|---|---|
IAction | action | An action which threw an exception during execution. |
IActionContext | context | The equivalent context object to an object passed to
the |
Exception | exception | The exception thrown during executing the |
Remarks
The reason why the parameter action
takes
IAction instead of T
is because it can take
block actions (BlockAction) besides transaction
actions (Actions).