Skip to content

Commit

Permalink
Different Trigger for OnPersist and PostPersist (#2022)
Browse files Browse the repository at this point in the history
* Split System Trigger

* Fix UT

* Update TriggerType.cs

* Rename

Co-authored-by: Erik Zhang <erik@neo.org>
  • Loading branch information
shargon and erikzhang committed Oct 29, 2020
1 parent 7d3a4a2 commit 7a8bb73
Show file tree
Hide file tree
Showing 5 changed files with 12 additions and 10 deletions.
4 changes: 2 additions & 2 deletions src/neo/Ledger/Blockchain.cs
Original file line number Diff line number Diff line change
Expand Up @@ -438,7 +438,7 @@ private void Persist(Block block)
snapshot.PersistingBlock = block;
if (block.Index > 0)
{
using ApplicationEngine engine = ApplicationEngine.Create(TriggerType.System, null, snapshot);
using ApplicationEngine engine = ApplicationEngine.Create(TriggerType.OnPersist, null, snapshot);
engine.LoadScript(onPersistScript);
if (engine.Execute() != VMState.HALT) throw new InvalidOperationException();
ApplicationExecuted application_executed = new ApplicationExecuted(engine);
Expand Down Expand Up @@ -477,7 +477,7 @@ private void Persist(Block block)
}
}
snapshot.BlockHashIndex.GetAndChange().Set(block);
using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.System, null, snapshot))
using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.PostPersist, null, snapshot))
{
engine.LoadScript(postPersistScript);
if (engine.Execute() != VMState.HALT) throw new InvalidOperationException();
Expand Down
4 changes: 2 additions & 2 deletions src/neo/SmartContract/Native/NativeContract.cs
Original file line number Diff line number Diff line change
Expand Up @@ -140,14 +140,14 @@ internal virtual void Initialize(ApplicationEngine engine)
[ContractMethod(0, CallFlags.AllowModifyStates)]
protected virtual void OnPersist(ApplicationEngine engine)
{
if (engine.Trigger != TriggerType.System)
if (engine.Trigger != TriggerType.OnPersist)
throw new InvalidOperationException();
}

[ContractMethod(0, CallFlags.AllowModifyStates)]
protected virtual void PostPersist(ApplicationEngine engine)
{
if (engine.Trigger != TriggerType.System)
if (engine.Trigger != TriggerType.PostPersist)
throw new InvalidOperationException();
}

Expand Down
6 changes: 4 additions & 2 deletions src/neo/SmartContract/TriggerType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ namespace Neo.SmartContract
[Flags]
public enum TriggerType : byte
{
System = 0x01,
OnPersist = 0x01,
PostPersist = 0x02,
/// <summary>
/// The verification trigger indicates that the contract is being invoked as a verification function.
/// The verification function can accept multiple parameters, and should return a boolean value that indicates the validity of the transaction or block.
Expand All @@ -23,6 +24,7 @@ public enum TriggerType : byte
/// </summary>
Application = 0x40,

All = System | Verification | Application
System = OnPersist | PostPersist,
All = OnPersist | PostPersist | Verification | Application
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ public void Check_GetCommittee()
sb.Emit(OpCode.DROP);
onPersistScript = sb.ToArray();
}
ApplicationEngine engine = ApplicationEngine.Create(TriggerType.System, null, snapshot);
ApplicationEngine engine = ApplicationEngine.Create(TriggerType.OnPersist, null, snapshot);
engine.LoadScript(onPersistScript);
Assert.AreEqual(engine.Execute(), VMState.HALT);

Expand Down Expand Up @@ -410,7 +410,7 @@ public void Check_CommitteeBonus()
{
sb.EmitAppCall(NativeContract.NEO.Hash, "postPersist");
sb.Emit(OpCode.RET);
ApplicationEngine engine = ApplicationEngine.Create(TriggerType.System, null, snapshot, (long)(20 * NativeContract.GAS.Factor));
ApplicationEngine engine = ApplicationEngine.Create(TriggerType.PostPersist, null, snapshot, (long)(20 * NativeContract.GAS.Factor));
engine.LoadScript(sb.ToArray());
engine.Execute();
engine.State.Should().Be(VM.VMState.HALT);
Expand Down
4 changes: 2 additions & 2 deletions tests/neo.UnitTests/SmartContract/Native/UT_NativeContract.cs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ public void TestGetContract()
public void TestInvoke()
{
var snapshot = Blockchain.Singleton.GetSnapshot();
ApplicationEngine engine = ApplicationEngine.Create(TriggerType.System, null, snapshot, 0);
ApplicationEngine engine = ApplicationEngine.Create(TriggerType.OnPersist, null, snapshot, 0);
engine.LoadScript(testNativeContract.Script);

ByteString method1 = new ByteString(System.Text.Encoding.Default.GetBytes("wrongMethod"));
Expand All @@ -123,7 +123,7 @@ public void TestOnPersistWithArgs()
ApplicationEngine engine1 = ApplicationEngine.Create(TriggerType.Application, null, snapshot, 0);
Assert.ThrowsException<InvalidOperationException>(() => testNativeContract.TestOnPersist(engine1));

ApplicationEngine engine2 = ApplicationEngine.Create(TriggerType.System, null, snapshot, 0);
ApplicationEngine engine2 = ApplicationEngine.Create(TriggerType.OnPersist, null, snapshot, 0);
testNativeContract.TestOnPersist(engine2);
}

Expand Down

0 comments on commit 7a8bb73

Please sign in to comment.