From 56691dc5f9c539ba9b5d035175c983ce730e27df Mon Sep 17 00:00:00 2001 From: Erik Zhang Date: Sun, 10 Jan 2021 09:49:48 +0800 Subject: [PATCH] Remove PersistingBlock from snapshot (#2209) --- src/neo/Ledger/Blockchain.cs | 7 +- .../Network/P2P/Payloads/ExtensiblePayload.cs | 2 +- src/neo/Persistence/ClonedView.cs | 1 - src/neo/Persistence/StoreView.cs | 1 - src/neo/Plugins/IApplicationEngineProvider.cs | 2 +- .../ApplicationEngine.Contract.cs | 4 +- .../ApplicationEngine.Runtime.cs | 2 +- src/neo/SmartContract/ApplicationEngine.cs | 13 +- src/neo/SmartContract/Helper.cs | 2 +- .../Native/ContractManagement.cs | 2 +- src/neo/SmartContract/Native/GasToken.cs | 4 +- src/neo/SmartContract/Native/NeoToken.cs | 18 +- .../SmartContract/Native/OracleContract.cs | 4 +- .../SmartContract/Native/RoleManagement.cs | 4 +- .../Extensions/NativeContractExtensions.cs | 8 +- .../Nep17NativeContractExtensions.cs | 4 +- tests/neo.UnitTests/Ledger/UT_MemoryPool.cs | 4 +- .../UT_TransactionVerificationContext.cs | 4 +- .../Network/P2P/Payloads/UT_Transaction.cs | 14 +- .../SmartContract/Native/UT_GasToken.cs | 31 ++- .../SmartContract/Native/UT_NativeContract.cs | 8 +- .../SmartContract/Native/UT_NeoToken.cs | 184 +++++++++--------- .../SmartContract/Native/UT_PolicyContract.cs | 71 ++++--- .../SmartContract/Native/UT_RoleManagement.cs | 6 +- .../SmartContract/UT_ApplicationEngine.cs | 8 +- .../UT_ApplicationEngineProvider.cs | 12 +- .../SmartContract/UT_InteropPrices.cs | 6 +- .../SmartContract/UT_InteropService.NEO.cs | 4 - .../SmartContract/UT_InteropService.cs | 38 +--- .../SmartContract/UT_Syscalls.cs | 2 +- 30 files changed, 218 insertions(+), 252 deletions(-) diff --git a/src/neo/Ledger/Blockchain.cs b/src/neo/Ledger/Blockchain.cs index 6635167368..01898679f7 100644 --- a/src/neo/Ledger/Blockchain.cs +++ b/src/neo/Ledger/Blockchain.cs @@ -397,8 +397,7 @@ private void Persist(Block block) snapshot.HeaderHashIndex.GetAndChange().Set(block); } List all_application_executed = new List(); - snapshot.PersistingBlock = block; - using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.OnPersist, null, snapshot)) + using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.OnPersist, null, snapshot, block)) { engine.LoadScript(onPersistScript); if (engine.Execute() != VMState.HALT) throw new InvalidOperationException(); @@ -420,7 +419,7 @@ private void Persist(Block block) clonedSnapshot.Transactions.Add(tx.Hash, state); clonedSnapshot.Transactions.Commit(); - using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Application, tx, clonedSnapshot, tx.SystemFee)) + using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Application, tx, clonedSnapshot, block, tx.SystemFee)) { engine.LoadScript(tx.Script); state.VMState = engine.Execute(); @@ -438,7 +437,7 @@ private void Persist(Block block) } } snapshot.BlockHashIndex.GetAndChange().Set(block); - using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.PostPersist, null, snapshot)) + using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.PostPersist, null, snapshot, block)) { engine.LoadScript(postPersistScript); if (engine.Execute() != VMState.HALT) throw new InvalidOperationException(); diff --git a/src/neo/Network/P2P/Payloads/ExtensiblePayload.cs b/src/neo/Network/P2P/Payloads/ExtensiblePayload.cs index d7a0902e42..6b21a81276 100644 --- a/src/neo/Network/P2P/Payloads/ExtensiblePayload.cs +++ b/src/neo/Network/P2P/Payloads/ExtensiblePayload.cs @@ -91,7 +91,7 @@ void IVerifiable.SerializeUnsigned(BinaryWriter writer) public bool Verify(StoreView snapshot) { - if (snapshot.PersistingBlock.Index < ValidBlockStart || snapshot.PersistingBlock.Index > ValidBlockEnd) return false; + if (snapshot.Height < ValidBlockStart || snapshot.Height >= ValidBlockEnd) return false; if (!Blockchain.Singleton.IsExtensibleWitnessWhiteListed(Sender)) return false; return this.VerifyWitnesses(snapshot, 0_02000000); } diff --git a/src/neo/Persistence/ClonedView.cs b/src/neo/Persistence/ClonedView.cs index 03d945c849..3b9b8017e6 100644 --- a/src/neo/Persistence/ClonedView.cs +++ b/src/neo/Persistence/ClonedView.cs @@ -15,7 +15,6 @@ internal class ClonedView : StoreView public ClonedView(StoreView view) { - this.PersistingBlock = view.PersistingBlock; this.Blocks = view.Blocks.CreateSnapshot(); this.Transactions = view.Transactions.CreateSnapshot(); this.Storages = view.Storages.CreateSnapshot(); diff --git a/src/neo/Persistence/StoreView.cs b/src/neo/Persistence/StoreView.cs index 4671c12381..a31d27ec57 100644 --- a/src/neo/Persistence/StoreView.cs +++ b/src/neo/Persistence/StoreView.cs @@ -10,7 +10,6 @@ namespace Neo.Persistence /// public abstract class StoreView { - public Block PersistingBlock { get; internal set; } public abstract DataCache Blocks { get; } public abstract DataCache Transactions { get; } public abstract DataCache Storages { get; } diff --git a/src/neo/Plugins/IApplicationEngineProvider.cs b/src/neo/Plugins/IApplicationEngineProvider.cs index ce42f39749..df3427219c 100644 --- a/src/neo/Plugins/IApplicationEngineProvider.cs +++ b/src/neo/Plugins/IApplicationEngineProvider.cs @@ -6,6 +6,6 @@ namespace Neo.Plugins { public interface IApplicationEngineProvider { - ApplicationEngine Create(TriggerType trigger, IVerifiable container, StoreView snapshot, long gas); + ApplicationEngine Create(TriggerType trigger, IVerifiable container, StoreView snapshot, Block persistingBlock, long gas); } } diff --git a/src/neo/SmartContract/ApplicationEngine.Contract.cs b/src/neo/SmartContract/ApplicationEngine.Contract.cs index 7e9f9e9c1b..cd0df5423d 100644 --- a/src/neo/SmartContract/ApplicationEngine.Contract.cs +++ b/src/neo/SmartContract/ApplicationEngine.Contract.cs @@ -132,7 +132,7 @@ protected internal void NativeOnPersist() if (Trigger != TriggerType.OnPersist) throw new InvalidOperationException(); foreach (NativeContract contract in NativeContract.Contracts) - if (contract.ActiveBlockIndex <= Snapshot.PersistingBlock.Index) + if (contract.ActiveBlockIndex <= PersistingBlock.Index) contract.OnPersist(this); } @@ -141,7 +141,7 @@ protected internal void NativePostPersist() if (Trigger != TriggerType.PostPersist) throw new InvalidOperationException(); foreach (NativeContract contract in NativeContract.Contracts) - if (contract.ActiveBlockIndex <= Snapshot.PersistingBlock.Index) + if (contract.ActiveBlockIndex <= PersistingBlock.Index) contract.PostPersist(this); } } diff --git a/src/neo/SmartContract/ApplicationEngine.Runtime.cs b/src/neo/SmartContract/ApplicationEngine.Runtime.cs index 601af69037..8d74182e68 100644 --- a/src/neo/SmartContract/ApplicationEngine.Runtime.cs +++ b/src/neo/SmartContract/ApplicationEngine.Runtime.cs @@ -36,7 +36,7 @@ protected internal string GetPlatform() protected internal ulong GetTime() { - return Snapshot.PersistingBlock.Timestamp; + return PersistingBlock.Timestamp; } protected internal IInteroperable GetScriptContainer() diff --git a/src/neo/SmartContract/ApplicationEngine.cs b/src/neo/SmartContract/ApplicationEngine.cs index d04c7e2b9b..3fa14e5683 100644 --- a/src/neo/SmartContract/ApplicationEngine.cs +++ b/src/neo/SmartContract/ApplicationEngine.cs @@ -43,6 +43,7 @@ public partial class ApplicationEngine : ExecutionEngine public TriggerType Trigger { get; } public IVerifiable ScriptContainer { get; } public StoreView Snapshot { get; } + public Block PersistingBlock { get; } public long GasConsumed { get; private set; } = 0; public long GasLeft => gas_amount - GasConsumed; public Exception FaultException { get; private set; } @@ -51,11 +52,12 @@ public partial class ApplicationEngine : ExecutionEngine public UInt160 EntryScriptHash => EntryContext?.GetScriptHash(); public IReadOnlyList Notifications => notifications ?? (IReadOnlyList)Array.Empty(); - protected ApplicationEngine(TriggerType trigger, IVerifiable container, StoreView snapshot, long gas) + protected ApplicationEngine(TriggerType trigger, IVerifiable container, StoreView snapshot, Block persistingBlock, long gas) { this.Trigger = trigger; this.ScriptContainer = container; this.Snapshot = snapshot; + this.PersistingBlock = persistingBlock; this.gas_amount = gas; this.exec_fee_factor = snapshot is null ? PolicyContract.DefaultExecFeeFactor : NativeContract.Policy.GetExecFeeFactor(Snapshot); this.StoragePrice = snapshot is null ? PolicyContract.DefaultStoragePrice : NativeContract.Policy.GetStoragePrice(Snapshot); @@ -91,10 +93,10 @@ internal T CallFromNativeContract(UInt160 callingScriptHash, UInt160 hash, st return (T)Convert(Pop(), new InteropParameterDescriptor(typeof(T))); } - public static ApplicationEngine Create(TriggerType trigger, IVerifiable container, StoreView snapshot, long gas = TestModeGas) + public static ApplicationEngine Create(TriggerType trigger, IVerifiable container, StoreView snapshot, Block persistingBlock = null, long gas = TestModeGas) { - return applicationEngineProvider?.Create(trigger, container, snapshot, gas) - ?? new ApplicationEngine(trigger, container, snapshot, gas); + return applicationEngineProvider?.Create(trigger, container, snapshot, persistingBlock, gas) + ?? new ApplicationEngine(trigger, container, snapshot, persistingBlock, gas); } protected override void LoadContext(ExecutionContext context) @@ -296,8 +298,7 @@ public static ApplicationEngine Run(byte[] script, StoreView snapshot = null, IV disposable = Blockchain.Singleton.GetSnapshot(); snapshot = disposable; } - snapshot.PersistingBlock = persistingBlock ?? snapshot.PersistingBlock ?? CreateDummyBlock(snapshot); - ApplicationEngine engine = Create(TriggerType.Application, container, snapshot, gas); + ApplicationEngine engine = Create(TriggerType.Application, container, snapshot, persistingBlock ?? CreateDummyBlock(snapshot), gas); if (disposable != null) engine.Disposables.Add(disposable); engine.LoadScript(script, initialPosition: offset); engine.Execute(); diff --git a/src/neo/SmartContract/Helper.cs b/src/neo/SmartContract/Helper.cs index 4c1a6a55a6..b4d22851da 100644 --- a/src/neo/SmartContract/Helper.cs +++ b/src/neo/SmartContract/Helper.cs @@ -178,7 +178,7 @@ public static bool VerifyWitnesses(this IVerifiable verifiable, StoreView snapsh internal static bool VerifyWitness(this IVerifiable verifiable, StoreView snapshot, UInt160 hash, Witness witness, long gas, out long fee) { fee = 0; - using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Verification, verifiable, snapshot?.Clone(), gas)) + using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Verification, verifiable, snapshot?.Clone(), null, gas)) { CallFlags callFlags = !witness.VerificationScript.IsStandardContract() ? CallFlags.ReadStates : CallFlags.None; byte[] verification = witness.VerificationScript; diff --git a/src/neo/SmartContract/Native/ContractManagement.cs b/src/neo/SmartContract/Native/ContractManagement.cs index c297b1e95a..e161fa3ba3 100644 --- a/src/neo/SmartContract/Native/ContractManagement.cs +++ b/src/neo/SmartContract/Native/ContractManagement.cs @@ -82,7 +82,7 @@ internal override void OnPersist(ApplicationEngine engine) { foreach (NativeContract contract in Contracts) { - if (contract.ActiveBlockIndex != engine.Snapshot.PersistingBlock.Index) + if (contract.ActiveBlockIndex != engine.PersistingBlock.Index) continue; engine.Snapshot.Storages.Add(CreateStorageKey(Prefix_Contract).Add(contract.Hash), new StorageItem(new ContractState { diff --git a/src/neo/SmartContract/Native/GasToken.cs b/src/neo/SmartContract/Native/GasToken.cs index 0a9c85de4d..db3e990c57 100644 --- a/src/neo/SmartContract/Native/GasToken.cs +++ b/src/neo/SmartContract/Native/GasToken.cs @@ -23,13 +23,13 @@ internal override void Initialize(ApplicationEngine engine) internal override void OnPersist(ApplicationEngine engine) { long totalNetworkFee = 0; - foreach (Transaction tx in engine.Snapshot.PersistingBlock.Transactions) + foreach (Transaction tx in engine.PersistingBlock.Transactions) { Burn(engine, tx.Sender, tx.SystemFee + tx.NetworkFee); totalNetworkFee += tx.NetworkFee; } ECPoint[] validators = NEO.GetNextBlockValidators(engine.Snapshot); - UInt160 primary = Contract.CreateSignatureRedeemScript(validators[engine.Snapshot.PersistingBlock.ConsensusData.PrimaryIndex]).ToScriptHash(); + UInt160 primary = Contract.CreateSignatureRedeemScript(validators[engine.PersistingBlock.ConsensusData.PrimaryIndex]).ToScriptHash(); Mint(engine, primary, totalNetworkFee, false); } } diff --git a/src/neo/SmartContract/Native/NeoToken.cs b/src/neo/SmartContract/Native/NeoToken.cs index 85a81afac6..e9c80ed43d 100644 --- a/src/neo/SmartContract/Native/NeoToken.cs +++ b/src/neo/SmartContract/Native/NeoToken.cs @@ -59,10 +59,10 @@ protected override void OnBalanceChanging(ApplicationEngine engine, UInt160 acco private void DistributeGas(ApplicationEngine engine, UInt160 account, NeoAccountState state) { // PersistingBlock is null when running under the debugger - if (engine.Snapshot.PersistingBlock == null) return; + if (engine.PersistingBlock is null) return; - BigInteger gas = CalculateBonus(engine.Snapshot, state.VoteTo, state.Balance, state.BalanceHeight, engine.Snapshot.PersistingBlock.Index); - state.BalanceHeight = engine.Snapshot.PersistingBlock.Index; + BigInteger gas = CalculateBonus(engine.Snapshot, state.VoteTo, state.Balance, state.BalanceHeight, engine.PersistingBlock.Index); + state.BalanceHeight = engine.PersistingBlock.Index; GAS.Mint(engine, account, gas, true); } @@ -132,7 +132,7 @@ internal override void Initialize(ApplicationEngine engine) internal override void OnPersist(ApplicationEngine engine) { // Set next committee - if (ShouldRefreshCommittee(engine.Snapshot.PersistingBlock.Index)) + if (ShouldRefreshCommittee(engine.PersistingBlock.Index)) { StorageItem storageItem = engine.Snapshot.Storages.GetAndChange(CreateStorageKey(Prefix_Committee)); var cachedCommittee = storageItem.GetInteroperable(); @@ -147,7 +147,7 @@ internal override void PostPersist(ApplicationEngine engine) int m = ProtocolSettings.Default.CommitteeMembersCount; int n = ProtocolSettings.Default.ValidatorsCount; - int index = (int)(engine.Snapshot.PersistingBlock.Index % (uint)m); + int index = (int)(engine.PersistingBlock.Index % (uint)m); var gasPerBlock = GetGasPerBlock(engine.Snapshot); var committee = GetCommitteeFromCache(engine.Snapshot); var pubkey = committee.ElementAt(index).PublicKey; @@ -156,7 +156,7 @@ internal override void PostPersist(ApplicationEngine engine) // Record the cumulative reward of the voters of committee - if (ShouldRefreshCommittee(engine.Snapshot.PersistingBlock.Index)) + if (ShouldRefreshCommittee(engine.PersistingBlock.Index)) { BigInteger voterRewardOfEachCommittee = gasPerBlock * VoterRewardRatio * 100000000L * m / (m + n) / 100; // Zoom in 100000000 times, and the final calculation should be divided 100000000L for (index = 0; index < committee.Count; index++) @@ -166,7 +166,7 @@ internal override void PostPersist(ApplicationEngine engine) if (member.Votes > 0) { BigInteger voterSumRewardPerNEO = factor * voterRewardOfEachCommittee / member.Votes; - StorageKey voterRewardKey = CreateStorageKey(Prefix_VoterRewardPerCommittee).Add(member.PublicKey).AddBigEndian(engine.Snapshot.PersistingBlock.Index + 1); + StorageKey voterRewardKey = CreateStorageKey(Prefix_VoterRewardPerCommittee).Add(member.PublicKey).AddBigEndian(engine.PersistingBlock.Index + 1); byte[] border = CreateStorageKey(Prefix_VoterRewardPerCommittee).Add(member.PublicKey).ToArray(); (_, var item) = engine.Snapshot.Storages.FindRange(voterRewardKey.ToArray(), border, SeekDirection.Backward).FirstOrDefault(); voterSumRewardPerNEO += (item ?? BigInteger.Zero); @@ -183,7 +183,7 @@ private bool SetGasPerBlock(ApplicationEngine engine, BigInteger gasPerBlock) throw new ArgumentOutOfRangeException(nameof(gasPerBlock)); if (!CheckCommittee(engine)) return false; - uint index = engine.Snapshot.PersistingBlock.Index + 1; + uint index = engine.PersistingBlock.Index + 1; StorageItem entry = engine.Snapshot.Storages.GetAndChange(CreateStorageKey(Prefix_GasPerBlock).AddBigEndian(index), () => new StorageItem(gasPerBlock)); entry.Set(gasPerBlock); return true; @@ -192,7 +192,7 @@ private bool SetGasPerBlock(ApplicationEngine engine, BigInteger gasPerBlock) [ContractMethod(0_01000000, CallFlags.ReadStates)] public BigInteger GetGasPerBlock(StoreView snapshot) { - return GetSortedGasRecords(snapshot, snapshot.PersistingBlock.Index).First().GasPerBlock; + return GetSortedGasRecords(snapshot, snapshot.Height + 1).First().GasPerBlock; } private IEnumerable<(uint Index, BigInteger GasPerBlock)> GetSortedGasRecords(StoreView snapshot, uint end) diff --git a/src/neo/SmartContract/Native/OracleContract.cs b/src/neo/SmartContract/Native/OracleContract.cs index 3f8f5e7567..92e00c2565 100644 --- a/src/neo/SmartContract/Native/OracleContract.cs +++ b/src/neo/SmartContract/Native/OracleContract.cs @@ -136,7 +136,7 @@ internal override void Initialize(ApplicationEngine engine) internal override void PostPersist(ApplicationEngine engine) { (UInt160 Account, BigInteger GAS)[] nodes = null; - foreach (Transaction tx in engine.Snapshot.PersistingBlock.Transactions) + foreach (Transaction tx in engine.PersistingBlock.Transactions) { //Filter the response transactions OracleResponse response = tx.GetAttribute(); @@ -155,7 +155,7 @@ internal override void PostPersist(ApplicationEngine engine) if (list.Count == 0) engine.Snapshot.Storages.Delete(key); //Mint GAS for oracle nodes - nodes ??= RoleManagement.GetDesignatedByRole(engine.Snapshot, Role.Oracle, engine.Snapshot.PersistingBlock.Index).Select(p => (Contract.CreateSignatureRedeemScript(p).ToScriptHash(), BigInteger.Zero)).ToArray(); + nodes ??= RoleManagement.GetDesignatedByRole(engine.Snapshot, Role.Oracle, engine.PersistingBlock.Index).Select(p => (Contract.CreateSignatureRedeemScript(p).ToScriptHash(), BigInteger.Zero)).ToArray(); if (nodes.Length > 0) { int index = (int)(response.Id % (ulong)nodes.Length); diff --git a/src/neo/SmartContract/Native/RoleManagement.cs b/src/neo/SmartContract/Native/RoleManagement.cs index 728f67aab7..6c32ca7c4b 100644 --- a/src/neo/SmartContract/Native/RoleManagement.cs +++ b/src/neo/SmartContract/Native/RoleManagement.cs @@ -43,9 +43,9 @@ private void DesignateAsRole(ApplicationEngine engine, Role role, ECPoint[] node throw new ArgumentOutOfRangeException(nameof(role)); if (!CheckCommittee(engine)) throw new InvalidOperationException(nameof(DesignateAsRole)); - if (engine.Snapshot.PersistingBlock is null) + if (engine.PersistingBlock is null) throw new InvalidOperationException(nameof(DesignateAsRole)); - uint index = engine.Snapshot.PersistingBlock.Index + 1; + uint index = engine.PersistingBlock.Index + 1; var key = CreateStorageKey((byte)role).AddBigEndian(index); if (engine.Snapshot.Storages.Contains(key)) throw new InvalidOperationException(); diff --git a/tests/neo.UnitTests/Extensions/NativeContractExtensions.cs b/tests/neo.UnitTests/Extensions/NativeContractExtensions.cs index 99c6497fb7..5a2d01fa30 100644 --- a/tests/neo.UnitTests/Extensions/NativeContractExtensions.cs +++ b/tests/neo.UnitTests/Extensions/NativeContractExtensions.cs @@ -16,7 +16,7 @@ public static ContractState DeployContract(this StoreView snapshot, UInt160 send script.EmitDynamicCall(NativeContract.ContractManagement.Hash, "deploy", true, nefFile, manifest); var engine = ApplicationEngine.Create(TriggerType.Application, - sender != null ? new Transaction() { Signers = new Signer[] { new Signer() { Account = sender } } } : null, snapshot, gas); + sender != null ? new Transaction() { Signers = new Signer[] { new Signer() { Account = sender } } } : null, snapshot, null, gas); engine.LoadScript(script.ToArray()); if (engine.Execute() != VMState.HALT) @@ -91,12 +91,12 @@ public static void DeleteContract(this StoreView snapshot, UInt160 hash) public static StackItem Call(this NativeContract contract, StoreView snapshot, string method, params ContractParameter[] args) { - return Call(contract, snapshot, null, method, args); + return Call(contract, snapshot, null, null, method, args); } - public static StackItem Call(this NativeContract contract, StoreView snapshot, IVerifiable container, string method, params ContractParameter[] args) + public static StackItem Call(this NativeContract contract, StoreView snapshot, IVerifiable container, Block persistingBlock, string method, params ContractParameter[] args) { - var engine = ApplicationEngine.Create(TriggerType.Application, container, snapshot); + var engine = ApplicationEngine.Create(TriggerType.Application, container, snapshot, persistingBlock); var contractState = NativeContract.ContractManagement.GetContract(snapshot, contract.Hash); if (contractState == null) throw new InvalidOperationException(); diff --git a/tests/neo.UnitTests/Extensions/Nep17NativeContractExtensions.cs b/tests/neo.UnitTests/Extensions/Nep17NativeContractExtensions.cs index 909ae98d86..4c64606ad4 100644 --- a/tests/neo.UnitTests/Extensions/Nep17NativeContractExtensions.cs +++ b/tests/neo.UnitTests/Extensions/Nep17NativeContractExtensions.cs @@ -35,10 +35,10 @@ public void Serialize(BinaryWriter writer) { } public void SerializeUnsigned(BinaryWriter writer) { } } - public static bool Transfer(this NativeContract contract, StoreView snapshot, byte[] from, byte[] to, BigInteger amount, bool signFrom) + public static bool Transfer(this NativeContract contract, StoreView snapshot, byte[] from, byte[] to, BigInteger amount, bool signFrom, Block persistingBlock) { var engine = ApplicationEngine.Create(TriggerType.Application, - new ManualWitness(signFrom ? new UInt160(from) : null), snapshot); + new ManualWitness(signFrom ? new UInt160(from) : null), snapshot, persistingBlock); engine.LoadScript(contract.Script, pcount: 4, configureState: p => p.ScriptHash = contract.Hash); diff --git a/tests/neo.UnitTests/Ledger/UT_MemoryPool.cs b/tests/neo.UnitTests/Ledger/UT_MemoryPool.cs index 09904b8c8a..7edab47e07 100644 --- a/tests/neo.UnitTests/Ledger/UT_MemoryPool.cs +++ b/tests/neo.UnitTests/Ledger/UT_MemoryPool.cs @@ -223,7 +223,7 @@ public void BlockPersistAndReverificationWillAbandonTxAsBalanceTransfered() { SnapshotView snapshot = Blockchain.Singleton.GetSnapshot(); BigInteger balance = NativeContract.GAS.BalanceOf(snapshot, senderAccount); - ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot, long.MaxValue); + ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot, null, long.MaxValue); NativeContract.GAS.Burn(engine, UInt160.Zero, balance); NativeContract.GAS.Mint(engine, UInt160.Zero, 70, true); @@ -240,7 +240,7 @@ public void BlockPersistAndReverificationWillAbandonTxAsBalanceTransfered() // Simulate the transfer process in tx by burning the balance UInt160 sender = block.Transactions[0].Sender; - ApplicationEngine applicationEngine = ApplicationEngine.Create(TriggerType.All, block, snapshot, (long)balance); + ApplicationEngine applicationEngine = ApplicationEngine.Create(TriggerType.All, block, snapshot, block, (long)balance); NativeContract.GAS.Burn(applicationEngine, sender, NativeContract.GAS.BalanceOf(snapshot, sender)); NativeContract.GAS.Mint(applicationEngine, sender, txFee * 30, true); // Set the balance to meet 30 txs only diff --git a/tests/neo.UnitTests/Ledger/UT_TransactionVerificationContext.cs b/tests/neo.UnitTests/Ledger/UT_TransactionVerificationContext.cs index 5bc70cef09..2de4f9084a 100644 --- a/tests/neo.UnitTests/Ledger/UT_TransactionVerificationContext.cs +++ b/tests/neo.UnitTests/Ledger/UT_TransactionVerificationContext.cs @@ -53,7 +53,7 @@ public void TestDuplicateOracle() // Fake balance var snapshot = Blockchain.Singleton.GetSnapshot(); - ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot, long.MaxValue); + ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot, null, long.MaxValue); BigInteger balance = NativeContract.GAS.BalanceOf(snapshot, UInt160.Zero); NativeContract.GAS.Burn(engine, UInt160.Zero, balance); NativeContract.GAS.Mint(engine, UInt160.Zero, 8, false); @@ -74,7 +74,7 @@ public void TestDuplicateOracle() public void TestTransactionSenderFee() { var snapshot = Blockchain.Singleton.GetSnapshot(); - ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot, long.MaxValue); + ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot, null, long.MaxValue); BigInteger balance = NativeContract.GAS.BalanceOf(snapshot, UInt160.Zero); NativeContract.GAS.Burn(engine, UInt160.Zero, balance); NativeContract.GAS.Mint(engine, UInt160.Zero, 8, true); diff --git a/tests/neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs b/tests/neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs index 14c5afa0e9..16aac9d21d 100644 --- a/tests/neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs +++ b/tests/neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs @@ -163,7 +163,7 @@ public void FeeIsMultiSigContract() long verificationGas = 0; foreach (var witness in tx.Witnesses) { - using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Verification, tx, snapshot, tx.NetworkFee)) + using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Verification, tx, snapshot, null, tx.NetworkFee)) { engine.LoadScript(witness.VerificationScript); engine.LoadScript(witness.InvocationScript); @@ -245,7 +245,7 @@ public void FeeIsSignatureContractDetailed() long verificationGas = 0; foreach (var witness in tx.Witnesses) { - using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Verification, tx, snapshot, tx.NetworkFee)) + using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Verification, tx, snapshot, null, tx.NetworkFee)) { engine.LoadScript(witness.VerificationScript); engine.LoadScript(witness.InvocationScript); @@ -357,7 +357,7 @@ public void FeeIsSignatureContract_TestScope_Global() long verificationGas = 0; foreach (var witness in tx.Witnesses) { - using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Verification, tx, snapshot, tx.NetworkFee)) + using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Verification, tx, snapshot, null, tx.NetworkFee)) { engine.LoadScript(witness.VerificationScript); engine.LoadScript(witness.InvocationScript); @@ -444,7 +444,7 @@ public void FeeIsSignatureContract_TestScope_CurrentHash_GAS() long verificationGas = 0; foreach (var witness in tx.Witnesses) { - using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Verification, tx, snapshot, tx.NetworkFee)) + using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Verification, tx, snapshot, null, tx.NetworkFee)) { engine.LoadScript(witness.VerificationScript); engine.LoadScript(witness.InvocationScript); @@ -534,7 +534,7 @@ public void FeeIsSignatureContract_TestScope_CalledByEntry_Plus_GAS() long verificationGas = 0; foreach (var witness in tx.Witnesses) { - using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Verification, tx, snapshot, tx.NetworkFee)) + using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Verification, tx, snapshot, null, tx.NetworkFee)) { engine.LoadScript(witness.VerificationScript); engine.LoadScript(witness.InvocationScript); @@ -676,7 +676,7 @@ public void FeeIsSignatureContract_TestScope_CurrentHash_NEO_GAS() long verificationGas = 0; foreach (var witness in tx.Witnesses) { - using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Verification, tx, snapshot, tx.NetworkFee)) + using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Verification, tx, snapshot, null, tx.NetworkFee)) { engine.LoadScript(witness.VerificationScript); engine.LoadScript(witness.InvocationScript); @@ -1026,7 +1026,7 @@ public void FeeIsSignatureContract_TestScope_FeeOnly_Default() long verificationGas = 0; foreach (var witness in tx.Witnesses) { - using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Verification, tx, snapshot, tx.NetworkFee)) + using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Verification, tx, snapshot, null, tx.NetworkFee)) { engine.LoadScript(witness.VerificationScript); engine.LoadScript(witness.InvocationScript); diff --git a/tests/neo.UnitTests/SmartContract/Native/UT_GasToken.cs b/tests/neo.UnitTests/SmartContract/Native/UT_GasToken.cs index fdce98c6dd..0b9f8802c6 100644 --- a/tests/neo.UnitTests/SmartContract/Native/UT_GasToken.cs +++ b/tests/neo.UnitTests/SmartContract/Native/UT_GasToken.cs @@ -18,6 +18,7 @@ namespace Neo.UnitTests.SmartContract.Native public class UT_GasToken { private StoreView _snapshot; + private Block _persistingBlock; [TestInitialize] public void TestSetup() @@ -25,7 +26,7 @@ public void TestSetup() TestBlockchain.InitializeMockNeoSystem(); _snapshot = Blockchain.Singleton.GetSnapshot(); - _snapshot.PersistingBlock = new Block() { Index = 0 }; + _persistingBlock = new Block() { Index = 0 }; } [TestMethod] @@ -41,26 +42,22 @@ public void TestSetup() public void Check_BalanceOfTransferAndBurn() { var snapshot = _snapshot.Clone(); - snapshot.PersistingBlock = new Block() { Index = 1000 }; - + var persistingBlock = new Block() { Index = 1000 }; byte[] from = Blockchain.GetConsensusAddress(Blockchain.StandbyValidators).ToArray(); - byte[] to = new byte[20]; - var keyCount = snapshot.Storages.GetChangeSet().Count(); - var supply = NativeContract.GAS.TotalSupply(snapshot); supply.Should().Be(3000000050000000); // 3000000000000000 + 50000000 (neo holder reward) // Check unclaim - var unclaim = UT_NeoToken.Check_UnclaimedGas(snapshot, from); + var unclaim = UT_NeoToken.Check_UnclaimedGas(snapshot, from, persistingBlock); unclaim.Value.Should().Be(new BigInteger(0.5 * 1000 * 100000000L)); unclaim.State.Should().BeTrue(); // Transfer - NativeContract.NEO.Transfer(snapshot, from, to, BigInteger.Zero, true).Should().BeTrue(); + NativeContract.NEO.Transfer(snapshot, from, to, BigInteger.Zero, true, persistingBlock).Should().BeTrue(); NativeContract.NEO.BalanceOf(snapshot, from).Should().Be(100000000); NativeContract.NEO.BalanceOf(snapshot, to).Should().Be(0); @@ -69,7 +66,7 @@ public void Check_BalanceOfTransferAndBurn() // Check unclaim - unclaim = UT_NeoToken.Check_UnclaimedGas(snapshot, from); + unclaim = UT_NeoToken.Check_UnclaimedGas(snapshot, from, persistingBlock); unclaim.Value.Should().Be(new BigInteger(0)); unclaim.State.Should().BeTrue(); @@ -82,9 +79,9 @@ public void Check_BalanceOfTransferAndBurn() keyCount = snapshot.Storages.GetChangeSet().Count(); - NativeContract.GAS.Transfer(snapshot, from, to, 30000500_00000000, false).Should().BeFalse(); // Not signed - NativeContract.GAS.Transfer(snapshot, from, to, 30000500_00000001, true).Should().BeFalse(); // More than balance - NativeContract.GAS.Transfer(snapshot, from, to, 30000500_00000000, true).Should().BeTrue(); // All balance + NativeContract.GAS.Transfer(snapshot, from, to, 30000500_00000000, false, persistingBlock).Should().BeFalse(); // Not signed + NativeContract.GAS.Transfer(snapshot, from, to, 30000500_00000001, true, persistingBlock).Should().BeFalse(); // More than balance + NativeContract.GAS.Transfer(snapshot, from, to, 30000500_00000000, true, persistingBlock).Should().BeTrue(); // All balance // Balance of @@ -95,7 +92,7 @@ public void Check_BalanceOfTransferAndBurn() // Burn - var engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot, 0); + var engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot, persistingBlock, 0); keyCount = snapshot.Storages.GetChangeSet().Count(); Assert.ThrowsException(() => @@ -122,15 +119,15 @@ public void Check_BalanceOfTransferAndBurn() // Bad inputs - NativeContract.GAS.Transfer(snapshot, from, to, BigInteger.MinusOne, true).Should().BeFalse(); - NativeContract.GAS.Transfer(snapshot, new byte[19], to, BigInteger.One, false).Should().BeFalse(); - NativeContract.GAS.Transfer(snapshot, from, new byte[19], BigInteger.One, false).Should().BeFalse(); + NativeContract.GAS.Transfer(snapshot, from, to, BigInteger.MinusOne, true, persistingBlock).Should().BeFalse(); + NativeContract.GAS.Transfer(snapshot, new byte[19], to, BigInteger.One, false, persistingBlock).Should().BeFalse(); + NativeContract.GAS.Transfer(snapshot, from, new byte[19], BigInteger.One, false, persistingBlock).Should().BeFalse(); } [TestMethod] public void Check_BadScript() { - var engine = ApplicationEngine.Create(TriggerType.Application, null, Blockchain.Singleton.GetSnapshot(), 0); + var engine = ApplicationEngine.Create(TriggerType.Application, null, Blockchain.Singleton.GetSnapshot(), _persistingBlock, 0); var script = new ScriptBuilder(); script.Emit(OpCode.NOP); diff --git a/tests/neo.UnitTests/SmartContract/Native/UT_NativeContract.cs b/tests/neo.UnitTests/SmartContract/Native/UT_NativeContract.cs index c473829357..eed8e77026 100644 --- a/tests/neo.UnitTests/SmartContract/Native/UT_NativeContract.cs +++ b/tests/neo.UnitTests/SmartContract/Native/UT_NativeContract.cs @@ -26,7 +26,7 @@ public void TestSetup() [TestMethod] public void TestInitialize() { - ApplicationEngine ae = ApplicationEngine.Create(TriggerType.Application, null, null, 0); + ApplicationEngine ae = ApplicationEngine.Create(TriggerType.Application, null, null, null, 0); testNativeContract.Initialize(ae); } @@ -98,7 +98,7 @@ public void TestGetContract() public void TestInvoke() { var snapshot = Blockchain.Singleton.GetSnapshot(); - ApplicationEngine engine = ApplicationEngine.Create(TriggerType.OnPersist, null, snapshot, 0); + ApplicationEngine engine = ApplicationEngine.Create(TriggerType.OnPersist, null, snapshot, null, 0); engine.LoadScript(testNativeContract.Script, configureState: p => p.ScriptHash = testNativeContract.Hash); ByteString method1 = new ByteString(System.Text.Encoding.Default.GetBytes("wrongMethod")); @@ -119,10 +119,10 @@ public void TestTrigger() { var snapshot = Blockchain.Singleton.GetSnapshot(); - ApplicationEngine engine1 = ApplicationEngine.Create(TriggerType.Application, null, snapshot, 0); + ApplicationEngine engine1 = ApplicationEngine.Create(TriggerType.Application, null, snapshot, null, 0); Assert.ThrowsException(() => testNativeContract.TestTrigger(engine1)); - ApplicationEngine engine2 = ApplicationEngine.Create(TriggerType.OnPersist, null, snapshot, 0); + ApplicationEngine engine2 = ApplicationEngine.Create(TriggerType.OnPersist, null, snapshot, null, 0); testNativeContract.TestTrigger(engine2); } diff --git a/tests/neo.UnitTests/SmartContract/Native/UT_NeoToken.cs b/tests/neo.UnitTests/SmartContract/Native/UT_NeoToken.cs index 1bf90d305d..024641eff3 100644 --- a/tests/neo.UnitTests/SmartContract/Native/UT_NeoToken.cs +++ b/tests/neo.UnitTests/SmartContract/Native/UT_NeoToken.cs @@ -23,13 +23,14 @@ namespace Neo.UnitTests.SmartContract.Native public class UT_NeoToken { private StoreView _snapshot; + private Block _persistingBlock; [TestInitialize] public void TestSetup() { TestBlockchain.InitializeMockNeoSystem(); _snapshot = Blockchain.Singleton.GetSnapshot(); - _snapshot.PersistingBlock = new Block() { Index = 0, Transactions = Array.Empty(), ConsensusData = new ConsensusData() }; + _persistingBlock = new Block() { Index = 0, Transactions = Array.Empty(), ConsensusData = new ConsensusData() }; } [TestMethod] @@ -45,25 +46,25 @@ public void TestSetup() public void Check_Vote() { var snapshot = _snapshot.Clone(); - snapshot.PersistingBlock = new Block() { Index = 1000 }; + var persistingBlock = new Block() { Index = 1000 }; byte[] from = Blockchain.GetConsensusAddress(Blockchain.StandbyValidators).ToArray(); // No signature - var ret = Check_Vote(snapshot, from, null, false); + var ret = Check_Vote(snapshot, from, null, false, persistingBlock); ret.Result.Should().BeFalse(); ret.State.Should().BeTrue(); // Wrong address - ret = Check_Vote(snapshot, new byte[19], null, false); + ret = Check_Vote(snapshot, new byte[19], null, false, persistingBlock); ret.Result.Should().BeFalse(); ret.State.Should().BeFalse(); // Wrong ec - ret = Check_Vote(snapshot, from, new byte[19], true); + ret = Check_Vote(snapshot, from, new byte[19], true, persistingBlock); ret.Result.Should().BeFalse(); ret.State.Should().BeFalse(); @@ -73,7 +74,7 @@ public void Check_Vote() fakeAddr[0] = 0x5F; fakeAddr[5] = 0xFF; - ret = Check_Vote(snapshot, fakeAddr, null, true); + ret = Check_Vote(snapshot, fakeAddr, null, true, persistingBlock); ret.Result.Should().BeFalse(); ret.State.Should().BeTrue(); @@ -81,7 +82,7 @@ public void Check_Vote() var accountState = snapshot.Storages.TryGet(CreateStorageKey(20, from)).GetInteroperable(); accountState.VoteTo = null; - ret = Check_Vote(snapshot, from, ECCurve.Secp256r1.G.ToArray(), true); + ret = Check_Vote(snapshot, from, ECCurve.Secp256r1.G.ToArray(), true, persistingBlock); ret.Result.Should().BeFalse(); ret.State.Should().BeTrue(); accountState.VoteTo.Should().BeNull(); @@ -89,7 +90,7 @@ public void Check_Vote() // normal case snapshot.Storages.Add(CreateStorageKey(33, ECCurve.Secp256r1.G.ToArray()), new StorageItem(new CandidateState())); - ret = Check_Vote(snapshot, from, ECCurve.Secp256r1.G.ToArray(), true); + ret = Check_Vote(snapshot, from, ECCurve.Secp256r1.G.ToArray(), true, persistingBlock); ret.Result.Should().BeTrue(); ret.State.Should().BeTrue(); accountState.VoteTo.Should().Be(ECCurve.Secp256r1.G); @@ -99,13 +100,13 @@ public void Check_Vote() public void Check_Vote_Sameaccounts() { var snapshot = _snapshot.Clone(); - snapshot.PersistingBlock = new Block() { Index = 1000 }; + var persistingBlock = new Block() { Index = 1000 }; byte[] from = Blockchain.GetConsensusAddress(Blockchain.StandbyValidators).ToArray(); var accountState = snapshot.Storages.TryGet(CreateStorageKey(20, from)).GetInteroperable(); accountState.Balance = 100; snapshot.Storages.Add(CreateStorageKey(33, ECCurve.Secp256r1.G.ToArray()), new StorageItem(new CandidateState())); - var ret = Check_Vote(snapshot, from, ECCurve.Secp256r1.G.ToArray(), true); + var ret = Check_Vote(snapshot, from, ECCurve.Secp256r1.G.ToArray(), true, persistingBlock); ret.Result.Should().BeTrue(); ret.State.Should().BeTrue(); accountState.VoteTo.Should().Be(ECCurve.Secp256r1.G); @@ -116,7 +117,7 @@ public void Check_Vote_Sameaccounts() var G_Account = Contract.CreateSignatureContract(ECCurve.Secp256r1.G).ScriptHash.ToArray(); snapshot.Storages.Add(CreateStorageKey(20, G_Account), new StorageItem(new NeoAccountState { Balance = 200 })); var secondAccount = snapshot.Storages.TryGet(CreateStorageKey(20, G_Account)).GetInteroperable(); - ret = Check_Vote(snapshot, G_Account, ECCurve.Secp256r1.G.ToArray(), true); + ret = Check_Vote(snapshot, G_Account, ECCurve.Secp256r1.G.ToArray(), true, persistingBlock); ret.Result.Should().BeTrue(); ret.State.Should().BeTrue(); stateValidator.Votes.Should().Be(300); @@ -126,7 +127,7 @@ public void Check_Vote_Sameaccounts() public void Check_Vote_ChangeVote() { var snapshot = _snapshot.Clone(); - snapshot.PersistingBlock = new Block() { Index = 1000 }; + var persistingBlock = new Block() { Index = 1000 }; //from vote to G byte[] from = Blockchain.StandbyValidators[0].ToArray(); var from_Account = Contract.CreateSignatureContract(Blockchain.StandbyValidators[0]).ScriptHash.ToArray(); @@ -134,7 +135,7 @@ public void Check_Vote_ChangeVote() var accountState = snapshot.Storages.TryGet(CreateStorageKey(20, from_Account)).GetInteroperable(); accountState.Balance = 100; snapshot.Storages.Add(CreateStorageKey(33, ECCurve.Secp256r1.G.ToArray()), new StorageItem(new CandidateState())); - var ret = Check_Vote(snapshot, from_Account, ECCurve.Secp256r1.G.ToArray(), true); + var ret = Check_Vote(snapshot, from_Account, ECCurve.Secp256r1.G.ToArray(), true, persistingBlock); ret.Result.Should().BeTrue(); ret.State.Should().BeTrue(); accountState.VoteTo.Should().Be(ECCurve.Secp256r1.G); @@ -145,7 +146,7 @@ public void Check_Vote_ChangeVote() var G_Account = Contract.CreateSignatureContract(ECCurve.Secp256r1.G).ScriptHash.ToArray(); snapshot.Storages.Add(CreateStorageKey(20, G_Account), new StorageItem(new NeoAccountState { Balance = 200 })); snapshot.Storages.Add(CreateStorageKey(33, from), new StorageItem(new CandidateState())); - ret = Check_Vote(snapshot, from_Account, from, true); + ret = Check_Vote(snapshot, from_Account, from, true, persistingBlock); ret.Result.Should().BeTrue(); ret.State.Should().BeTrue(); G_stateValidator.Votes.Should().Be(0); @@ -157,7 +158,7 @@ public void Check_Vote_ChangeVote() public void Check_Vote_VoteToNull() { var snapshot = _snapshot.Clone(); - snapshot.PersistingBlock = new Block() { Index = 1000 }; + var persistingBlock = new Block() { Index = 1000 }; byte[] from = Blockchain.StandbyValidators[0].ToArray(); var from_Account = Contract.CreateSignatureContract(Blockchain.StandbyValidators[0]).ScriptHash.ToArray(); @@ -165,7 +166,7 @@ public void Check_Vote_VoteToNull() var accountState = snapshot.Storages.TryGet(CreateStorageKey(20, from_Account)).GetInteroperable(); accountState.Balance = 100; snapshot.Storages.Add(CreateStorageKey(33, ECCurve.Secp256r1.G.ToArray()), new StorageItem(new CandidateState())); - var ret = Check_Vote(snapshot, from_Account, ECCurve.Secp256r1.G.ToArray(), true); + var ret = Check_Vote(snapshot, from_Account, ECCurve.Secp256r1.G.ToArray(), true, persistingBlock); ret.Result.Should().BeTrue(); ret.State.Should().BeTrue(); accountState.VoteTo.Should().Be(ECCurve.Secp256r1.G); @@ -176,7 +177,7 @@ public void Check_Vote_VoteToNull() var G_Account = Contract.CreateSignatureContract(ECCurve.Secp256r1.G).ScriptHash.ToArray(); snapshot.Storages.Add(CreateStorageKey(20, G_Account), new StorageItem(new NeoAccountState { Balance = 200 })); snapshot.Storages.Add(CreateStorageKey(33, from), new StorageItem(new CandidateState())); - ret = Check_Vote(snapshot, from_Account, null, true); + ret = Check_Vote(snapshot, from_Account, null, true, persistingBlock); ret.Result.Should().BeTrue(); ret.State.Should().BeTrue(); G_stateValidator.Votes.Should().Be(0); @@ -187,15 +188,15 @@ public void Check_Vote_VoteToNull() public void Check_UnclaimedGas() { var snapshot = _snapshot.Clone(); - snapshot.PersistingBlock = new Block() { Index = 1000 }; + var persistingBlock = new Block() { Index = 1000 }; byte[] from = Blockchain.GetConsensusAddress(Blockchain.StandbyValidators).ToArray(); - var unclaim = Check_UnclaimedGas(snapshot, from); + var unclaim = Check_UnclaimedGas(snapshot, from, persistingBlock); unclaim.Value.Should().Be(new BigInteger(0.5 * 1000 * 100000000L)); unclaim.State.Should().BeTrue(); - unclaim = Check_UnclaimedGas(snapshot, new byte[19]); + unclaim = Check_UnclaimedGas(snapshot, new byte[19], persistingBlock); unclaim.Value.Should().Be(BigInteger.Zero); unclaim.State.Should().BeFalse(); } @@ -208,14 +209,14 @@ public void Check_RegisterValidator() var keyCount = snapshot.Storages.GetChangeSet().Count(); var point = Blockchain.StandbyValidators[0].EncodePoint(true).Clone() as byte[]; - var ret = Check_RegisterValidator(snapshot, point); // Exists + var ret = Check_RegisterValidator(snapshot, point, _persistingBlock); // Exists ret.State.Should().BeTrue(); ret.Result.Should().BeTrue(); snapshot.Storages.GetChangeSet().Count().Should().Be(++keyCount); // No changes point[20]++; // fake point - ret = Check_RegisterValidator(snapshot, point); // New + ret = Check_RegisterValidator(snapshot, point, _persistingBlock); // New ret.State.Should().BeTrue(); ret.Result.Should().BeTrue(); @@ -237,13 +238,13 @@ public void Check_UnregisterCandidate() var point = Blockchain.StandbyValidators[0].EncodePoint(true); //without register - var ret = Check_UnregisterCandidate(snapshot, point); + var ret = Check_UnregisterCandidate(snapshot, point, _persistingBlock); ret.State.Should().BeTrue(); ret.Result.Should().BeTrue(); snapshot.Storages.GetChangeSet().Count().Should().Be(keyCount); //register and then unregister - ret = Check_RegisterValidator(snapshot, point); + ret = Check_RegisterValidator(snapshot, point, _persistingBlock); StorageItem item = snapshot.Storages.GetAndChange(CreateStorageKey(33, point)); ret.State.Should().BeTrue(); ret.Result.Should().BeTrue(); @@ -254,7 +255,7 @@ public void Check_UnregisterCandidate() StorageKey key = CreateStorageKey(33, point); snapshot.Storages.TryGet(key).Should().NotBeNull(); - ret = Check_UnregisterCandidate(snapshot, point); + ret = Check_UnregisterCandidate(snapshot, point, _persistingBlock); ret.State.Should().BeTrue(); ret.Result.Should().BeTrue(); snapshot.Storages.GetChangeSet().Count().Should().Be(keyCount); @@ -264,13 +265,13 @@ public void Check_UnregisterCandidate() snapshot.Storages.TryGet(key).Should().BeNull(); //register with votes, then unregister - ret = Check_RegisterValidator(snapshot, point); + ret = Check_RegisterValidator(snapshot, point, _persistingBlock); var G_Account = Contract.CreateSignatureContract(ECCurve.Secp256r1.G).ScriptHash.ToArray(); snapshot.Storages.Add(CreateStorageKey(20, G_Account), new StorageItem(new NeoAccountState())); var accountState = snapshot.Storages.TryGet(CreateStorageKey(20, G_Account)).GetInteroperable(); accountState.Balance = 100; - Check_Vote(snapshot, G_Account, Blockchain.StandbyValidators[0].ToArray(), true); - ret = Check_UnregisterCandidate(snapshot, point); + Check_Vote(snapshot, G_Account, Blockchain.StandbyValidators[0].ToArray(), true, _persistingBlock); + ret = Check_UnregisterCandidate(snapshot, point, _persistingBlock); ret.State.Should().BeTrue(); ret.Result.Should().BeTrue(); snapshot.Storages.TryGet(key).Should().NotBeNull(); @@ -280,7 +281,7 @@ public void Check_UnregisterCandidate() pointState.Votes.Should().Be(100); //vote fail - ret = Check_Vote(snapshot, G_Account, Blockchain.StandbyValidators[0].ToArray(), true); + ret = Check_Vote(snapshot, G_Account, Blockchain.StandbyValidators[0].ToArray(), true, _persistingBlock); ret.State.Should().BeTrue(); ret.Result.Should().BeFalse(); accountState.VoteTo.Should().Be(Blockchain.StandbyValidators[0]); @@ -292,16 +293,17 @@ public void Check_GetCommittee() var snapshot = _snapshot.Clone(); var keyCount = snapshot.Storages.GetChangeSet().Count(); var point = Blockchain.StandbyValidators[0].EncodePoint(true); + var persistingBlock = _persistingBlock; //register with votes with 20000000 var G_Account = Contract.CreateSignatureContract(ECCurve.Secp256r1.G).ScriptHash.ToArray(); snapshot.Storages.Add(CreateStorageKey(20, G_Account), new StorageItem(new NeoAccountState())); var accountState = snapshot.Storages.TryGet(CreateStorageKey(20, G_Account)).GetInteroperable(); accountState.Balance = 20000000; - var ret = Check_RegisterValidator(snapshot, ECCurve.Secp256r1.G.ToArray()); + var ret = Check_RegisterValidator(snapshot, ECCurve.Secp256r1.G.ToArray(), persistingBlock); ret.State.Should().BeTrue(); ret.Result.Should().BeTrue(); - ret = Check_Vote(snapshot, G_Account, ECCurve.Secp256r1.G.ToArray(), true); + ret = Check_Vote(snapshot, G_Account, ECCurve.Secp256r1.G.ToArray(), true, persistingBlock); ret.State.Should().BeTrue(); ret.Result.Should().BeTrue(); @@ -314,7 +316,7 @@ public void Check_GetCommittee() } //register more candidates, committee member change - snapshot.PersistingBlock = new Block + persistingBlock = new Block { Index = (uint)ProtocolSettings.Default.CommitteeMembersCount, Transactions = Array.Empty(), @@ -322,10 +324,10 @@ public void Check_GetCommittee() }; for (int i = 0; i < ProtocolSettings.Default.CommitteeMembersCount - 1; i++) { - Check_RegisterValidator(snapshot, Blockchain.StandbyCommittee[i].ToArray()); + Check_RegisterValidator(snapshot, Blockchain.StandbyCommittee[i].ToArray(), persistingBlock); } - Check_OnPersist(snapshot); + Check_OnPersist(snapshot, persistingBlock); committeemembers = NativeContract.NEO.GetCommittee(snapshot); committeemembers.Length.Should().Be(ProtocolSettings.Default.CommitteeMembersCount); @@ -341,7 +343,7 @@ public void Check_GetCommittee() public void Check_Transfer() { var snapshot = _snapshot.Clone(); - snapshot.PersistingBlock = new Block() { Index = 1000 }; + var persistingBlock = new Block() { Index = 1000 }; byte[] from = Blockchain.GetConsensusAddress(Blockchain.StandbyValidators).ToArray(); byte[] to = new byte[20]; @@ -350,20 +352,20 @@ public void Check_Transfer() // Check unclaim - var unclaim = Check_UnclaimedGas(snapshot, from); + var unclaim = Check_UnclaimedGas(snapshot, from, persistingBlock); unclaim.Value.Should().Be(new BigInteger(0.5 * 1000 * 100000000L)); unclaim.State.Should().BeTrue(); // Transfer - NativeContract.NEO.Transfer(snapshot, from, to, BigInteger.One, false).Should().BeFalse(); // Not signed - NativeContract.NEO.Transfer(snapshot, from, to, BigInteger.One, true).Should().BeTrue(); + NativeContract.NEO.Transfer(snapshot, from, to, BigInteger.One, false, persistingBlock).Should().BeFalse(); // Not signed + NativeContract.NEO.Transfer(snapshot, from, to, BigInteger.One, true, persistingBlock).Should().BeTrue(); NativeContract.NEO.BalanceOf(snapshot, from).Should().Be(99999999); NativeContract.NEO.BalanceOf(snapshot, to).Should().Be(1); // Check unclaim - unclaim = Check_UnclaimedGas(snapshot, from); + unclaim = Check_UnclaimedGas(snapshot, from, persistingBlock); unclaim.Value.Should().Be(new BigInteger(0)); unclaim.State.Should().BeTrue(); @@ -373,19 +375,19 @@ public void Check_Transfer() keyCount = snapshot.Storages.GetChangeSet().Count(); - NativeContract.NEO.Transfer(snapshot, to, from, BigInteger.One, true).Should().BeTrue(); + NativeContract.NEO.Transfer(snapshot, to, from, BigInteger.One, true, persistingBlock).Should().BeTrue(); NativeContract.NEO.BalanceOf(snapshot, to).Should().Be(0); snapshot.Storages.GetChangeSet().Count().Should().Be(keyCount - 1); // Remove neo balance from address two // Bad inputs - NativeContract.NEO.Transfer(snapshot, from, to, BigInteger.MinusOne, true).Should().BeFalse(); - NativeContract.NEO.Transfer(snapshot, new byte[19], to, BigInteger.One, false).Should().BeFalse(); - NativeContract.NEO.Transfer(snapshot, from, new byte[19], BigInteger.One, false).Should().BeFalse(); + NativeContract.NEO.Transfer(snapshot, from, to, BigInteger.MinusOne, true, persistingBlock).Should().BeFalse(); + NativeContract.NEO.Transfer(snapshot, new byte[19], to, BigInteger.One, false, persistingBlock).Should().BeFalse(); + NativeContract.NEO.Transfer(snapshot, from, new byte[19], BigInteger.One, false, persistingBlock).Should().BeFalse(); // More than balance - NativeContract.NEO.Transfer(snapshot, to, from, new BigInteger(2), true).Should().BeFalse(); + NativeContract.NEO.Transfer(snapshot, to, from, new BigInteger(2), true, persistingBlock).Should().BeFalse(); } [TestMethod] @@ -405,9 +407,9 @@ public void Check_BalanceOf() public void Check_CommitteeBonus() { var snapshot = _snapshot.Clone(); - snapshot.PersistingBlock = new Block { Index = 1, Transactions = Array.Empty() }; + var persistingBlock = new Block { Index = 1, Transactions = Array.Empty() }; - Check_PostPersist(snapshot); + Check_PostPersist(snapshot, persistingBlock); var committee = Blockchain.StandbyCommittee; NativeContract.GAS.BalanceOf(snapshot, Contract.CreateSignatureContract(committee[0]).ScriptHash.ToArray()).Should().Be(50000000); @@ -422,13 +424,13 @@ public void Check_Initialize() // StandbyValidators - Check_GetCommittee(snapshot); + Check_GetCommittee(snapshot, null); } [TestMethod] public void Check_BadScript() { - var engine = ApplicationEngine.Create(TriggerType.Application, null, Blockchain.Singleton.GetSnapshot(), 0); + var engine = ApplicationEngine.Create(TriggerType.Application, null, Blockchain.Singleton.GetSnapshot(), _persistingBlock); var script = new ScriptBuilder(); script.Emit(OpCode.NOP); @@ -441,7 +443,7 @@ public void Check_BadScript() public void TestCalculateBonus() { var snapshot = _snapshot.Clone(); - snapshot.PersistingBlock = new Block { Index = 0 }; + var persistingBlock = new Block { Index = 0 }; StorageKey key = CreateStorageKey(20, UInt160.Zero.ToArray()); @@ -578,15 +580,15 @@ public void TestCheckCandidate() snapshot.Storages.Find(storageKey.ToArray()).ToArray().Length.Should().Be(1); // Pre-persist - snapshot.PersistingBlock = new Block { Index = 21, Transactions = Array.Empty() }; - Check_OnPersist(snapshot); + var persistingBlock = new Block { Index = 21, Transactions = Array.Empty() }; + Check_OnPersist(snapshot, persistingBlock); // Clear votes storageKey = new KeyBuilder(-1, 33).Add(committee[0]); snapshot.Storages.GetAndChange(storageKey).GetInteroperable().Votes = BigInteger.Zero; // Unregister candidate, remove - var ret = Check_UnregisterCandidate(snapshot, point); + var ret = Check_UnregisterCandidate(snapshot, point, persistingBlock); ret.State.Should().BeTrue(); ret.Result.Should().BeTrue(); @@ -594,7 +596,7 @@ public void TestCheckCandidate() snapshot.Storages.Find(storageKey.ToArray()).ToArray().Length.Should().Be(0); // Post-persist - Check_PostPersist(snapshot).Should().BeTrue(); + Check_PostPersist(snapshot, persistingBlock).Should().BeTrue(); storageKey = new KeyBuilder(-1, 23).Add(committee[0]); snapshot.Storages.Find(storageKey.ToArray()).ToArray().Length.Should().Be(1); @@ -673,19 +675,19 @@ public void TestTotalSupply() public void TestEconomicParameter() { var snapshot = _snapshot.Clone(); - snapshot.PersistingBlock = new Block { Index = 0 }; + var persistingBlock = new Block { Index = 0 }; - (BigInteger, bool) result = Check_GetGasPerBlock(snapshot); + (BigInteger, bool) result = Check_GetGasPerBlock(snapshot, persistingBlock); result.Item2.Should().BeTrue(); result.Item1.Should().Be(5 * NativeContract.GAS.Factor); - snapshot.PersistingBlock = new Block { Index = 10 }; - (VM.Types.Boolean, bool) result1 = Check_SetGasPerBlock(snapshot, 10 * NativeContract.GAS.Factor); + persistingBlock = new Block { Index = 10 }; + (VM.Types.Boolean, bool) result1 = Check_SetGasPerBlock(snapshot, 10 * NativeContract.GAS.Factor, persistingBlock); result1.Item2.Should().BeTrue(); result1.Item1.GetBoolean().Should().BeTrue(); - snapshot.PersistingBlock.Index++; - result = Check_GetGasPerBlock(snapshot); + snapshot.BlockHashIndex.GetAndChange().Index = persistingBlock.Index + 1; + result = Check_GetGasPerBlock(snapshot, persistingBlock); result.Item2.Should().BeTrue(); result.Item1.Should().Be(10 * NativeContract.GAS.Factor); @@ -694,7 +696,8 @@ public void TestEconomicParameter() NeoAccountState state = storage.GetInteroperable(); state.Balance = 1000; state.BalanceHeight = 0; - NativeContract.NEO.UnclaimedGas(snapshot, UInt160.Zero, snapshot.PersistingBlock.Index + 1).Should().Be(6500); + snapshot.BlockHashIndex.GetAndChange().Index = 0; // Fake Height=0 + NativeContract.NEO.UnclaimedGas(snapshot, UInt160.Zero, persistingBlock.Index + 2).Should().Be(6500); } [TestMethod] @@ -722,8 +725,8 @@ public void TestClaimGas() var item = snapshot.Storages.GetAndChange(new KeyBuilder(-1, 1), () => new StorageItem()); item.Value = ((BigInteger)2100 * 10000L).ToByteArray(); - snapshot.PersistingBlock = new Block { Index = 0, Transactions = Array.Empty() }; - Check_PostPersist(snapshot).Should().BeTrue(); + var persistingBlock = new Block { Index = 0, Transactions = Array.Empty() }; + Check_PostPersist(snapshot, persistingBlock).Should().BeTrue(); var committee = Blockchain.StandbyCommittee.OrderBy(p => p).ToArray(); var accountA = committee[0]; @@ -737,8 +740,8 @@ public void TestClaimGas() // Next block - snapshot.PersistingBlock = new Block { Index = 1, Transactions = Array.Empty() }; - Check_PostPersist(snapshot).Should().BeTrue(); + persistingBlock = new Block { Index = 1, Transactions = Array.Empty() }; + Check_PostPersist(snapshot, persistingBlock).Should().BeTrue(); NativeContract.NEO.BalanceOf(snapshot, Contract.CreateSignatureContract(committee[1]).ScriptHash).Should().Be(0); @@ -747,8 +750,8 @@ public void TestClaimGas() // Next block - snapshot.PersistingBlock = new Block { Index = 21, Transactions = Array.Empty() }; - Check_PostPersist(snapshot).Should().BeTrue(); + persistingBlock = new Block { Index = 21, Transactions = Array.Empty() }; + Check_PostPersist(snapshot, persistingBlock).Should().BeTrue(); accountA = Blockchain.StandbyCommittee.OrderBy(p => p).ToArray()[2]; NativeContract.NEO.BalanceOf(snapshot, Contract.CreateSignatureContract(committee[2]).ScriptHash).Should().Be(0); @@ -786,16 +789,16 @@ public void TestVote() UInt160 account = UInt160.Parse("01ff00ff00ff00ff00ff00ff00ff00ff00ff00a4"); StorageKey keyAccount = CreateStorageKey(20, account.ToArray()); StorageKey keyValidator = CreateStorageKey(33, ECCurve.Secp256r1.G.ToArray()); - var ret = Check_Vote(snapshot, account.ToArray(), ECCurve.Secp256r1.G.ToArray(), false); + var ret = Check_Vote(snapshot, account.ToArray(), ECCurve.Secp256r1.G.ToArray(), false, _persistingBlock); ret.State.Should().BeTrue(); ret.Result.Should().BeFalse(); - ret = Check_Vote(snapshot, account.ToArray(), ECCurve.Secp256r1.G.ToArray(), true); + ret = Check_Vote(snapshot, account.ToArray(), ECCurve.Secp256r1.G.ToArray(), true, _persistingBlock); ret.State.Should().BeTrue(); ret.Result.Should().BeFalse(); snapshot.Storages.Add(keyAccount, new StorageItem(new NeoAccountState())); - ret = Check_Vote(snapshot, account.ToArray(), ECCurve.Secp256r1.G.ToArray(), true); + ret = Check_Vote(snapshot, account.ToArray(), ECCurve.Secp256r1.G.ToArray(), true, _persistingBlock); ret.State.Should().BeTrue(); ret.Result.Should().BeFalse(); @@ -805,7 +808,7 @@ public void TestVote() VoteTo = ECCurve.Secp256r1.G })); snapshot.Storages.Add(keyValidator, new StorageItem(new CandidateState())); - ret = Check_Vote(snapshot, account.ToArray(), ECCurve.Secp256r1.G.ToArray(), true); + ret = Check_Vote(snapshot, account.ToArray(), ECCurve.Secp256r1.G.ToArray(), true, _persistingBlock); ret.State.Should().BeTrue(); ret.Result.Should().BeTrue(); } @@ -813,8 +816,7 @@ public void TestVote() internal (bool State, bool Result) Transfer4TesingOnBalanceChanging(BigInteger amount, bool addVotes) { var snapshot = _snapshot.Clone(); - snapshot.PersistingBlock = Blockchain.GenesisBlock; - var engine = ApplicationEngine.Create(TriggerType.Application, Blockchain.GenesisBlock, snapshot); + var engine = ApplicationEngine.Create(TriggerType.Application, Blockchain.GenesisBlock, snapshot, Blockchain.GenesisBlock); ScriptBuilder sb = new ScriptBuilder(); var tmp = engine.ScriptContainer.GetScriptHashesForVerifying(engine.Snapshot); UInt160 from = engine.ScriptContainer.GetScriptHashesForVerifying(engine.Snapshot)[0]; @@ -843,29 +845,29 @@ public void TestVote() return (true, result.GetBoolean()); } - internal static bool Check_OnPersist(StoreView snapshot) + internal static bool Check_OnPersist(StoreView snapshot, Block persistingBlock) { var script = new ScriptBuilder(); script.EmitSysCall(ApplicationEngine.System_Contract_NativeOnPersist); - var engine = ApplicationEngine.Create(TriggerType.OnPersist, null, snapshot); + var engine = ApplicationEngine.Create(TriggerType.OnPersist, null, snapshot, persistingBlock); engine.LoadScript(script.ToArray()); return engine.Execute() == VMState.HALT; } - internal static bool Check_PostPersist(StoreView snapshot) + internal static bool Check_PostPersist(StoreView snapshot, Block persistingBlock) { var script = new ScriptBuilder(); script.EmitSysCall(ApplicationEngine.System_Contract_NativePostPersist); - var engine = ApplicationEngine.Create(TriggerType.PostPersist, null, snapshot); + var engine = ApplicationEngine.Create(TriggerType.PostPersist, null, snapshot, persistingBlock); engine.LoadScript(script.ToArray()); return engine.Execute() == VMState.HALT; } - internal static (BigInteger Value, bool State) Check_GetGasPerBlock(StoreView snapshot) + internal static (BigInteger Value, bool State) Check_GetGasPerBlock(StoreView snapshot, Block persistingBlock) { - var engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot); + var engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot, persistingBlock); engine.LoadScript(NativeContract.NEO.Script, pcount: 0, configureState: p => p.ScriptHash = NativeContract.NEO.Hash); @@ -884,10 +886,10 @@ internal static (BigInteger Value, bool State) Check_GetGasPerBlock(StoreView sn return (((VM.Types.Integer)result).GetInteger(), true); } - internal static (VM.Types.Boolean Value, bool State) Check_SetGasPerBlock(StoreView snapshot, BigInteger gasPerBlock) + internal static (VM.Types.Boolean Value, bool State) Check_SetGasPerBlock(StoreView snapshot, BigInteger gasPerBlock, Block persistingBlock) { UInt160 committeeMultiSigAddr = NativeContract.NEO.GetCommitteeAddress(snapshot); - var engine = ApplicationEngine.Create(TriggerType.Application, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), snapshot); + var engine = ApplicationEngine.Create(TriggerType.Application, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), snapshot, persistingBlock); engine.LoadScript(NativeContract.NEO.Script, pcount: 1, configureState: p => p.ScriptHash = NativeContract.NEO.Hash); @@ -907,10 +909,10 @@ internal static (VM.Types.Boolean Value, bool State) Check_SetGasPerBlock(StoreV return (((VM.Types.Boolean)result).GetBoolean(), true); } - internal static (bool State, bool Result) Check_Vote(StoreView snapshot, byte[] account, byte[] pubkey, bool signAccount) + internal static (bool State, bool Result) Check_Vote(StoreView snapshot, byte[] account, byte[] pubkey, bool signAccount, Block persistingBlock) { var engine = ApplicationEngine.Create(TriggerType.Application, - new Nep17NativeContractExtensions.ManualWitness(signAccount ? new UInt160(account) : UInt160.Zero), snapshot); + new Nep17NativeContractExtensions.ManualWitness(signAccount ? new UInt160(account) : UInt160.Zero), snapshot, persistingBlock); engine.LoadScript(NativeContract.NEO.Script, pcount: 2, configureState: p => p.ScriptHash = NativeContract.NEO.Hash); @@ -935,10 +937,10 @@ internal static (bool State, bool Result) Check_Vote(StoreView snapshot, byte[] return (true, result.GetBoolean()); } - internal static (bool State, bool Result) Check_RegisterValidator(StoreView snapshot, byte[] pubkey) + internal static (bool State, bool Result) Check_RegisterValidator(StoreView snapshot, byte[] pubkey, Block persistingBlock) { var engine = ApplicationEngine.Create(TriggerType.Application, - new Nep17NativeContractExtensions.ManualWitness(Contract.CreateSignatureRedeemScript(ECPoint.DecodePoint(pubkey, ECCurve.Secp256r1)).ToScriptHash()), snapshot); + new Nep17NativeContractExtensions.ManualWitness(Contract.CreateSignatureRedeemScript(ECPoint.DecodePoint(pubkey, ECCurve.Secp256r1)).ToScriptHash()), snapshot, persistingBlock); engine.LoadScript(NativeContract.NEO.Script, pcount: 1, configureState: p => p.ScriptHash = NativeContract.NEO.Hash); @@ -958,9 +960,9 @@ internal static (bool State, bool Result) Check_RegisterValidator(StoreView snap return (true, result.GetBoolean()); } - internal static ECPoint[] Check_GetCommittee(StoreView snapshot) + internal static ECPoint[] Check_GetCommittee(StoreView snapshot, Block persistingBlock) { - var engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot); + var engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot, persistingBlock); engine.LoadScript(NativeContract.NEO.Script, pcount: 0, configureState: p => p.ScriptHash = NativeContract.NEO.Hash); @@ -976,14 +978,14 @@ internal static ECPoint[] Check_GetCommittee(StoreView snapshot) return (result as VM.Types.Array).Select(u => u.GetSpan().AsSerializable()).ToArray(); } - internal static (BigInteger Value, bool State) Check_UnclaimedGas(StoreView snapshot, byte[] address) + internal static (BigInteger Value, bool State) Check_UnclaimedGas(StoreView snapshot, byte[] address, Block persistingBlock) { - var engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot); + var engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot, persistingBlock); engine.LoadScript(NativeContract.NEO.Script, pcount: 2, configureState: p => p.ScriptHash = NativeContract.NEO.Hash); var script = new ScriptBuilder(); - script.EmitPush(snapshot.PersistingBlock.Index); + script.EmitPush(persistingBlock.Index); script.EmitPush(address); script.EmitPush("unclaimedGas"); engine.LoadScript(script.ToArray()); @@ -1035,10 +1037,10 @@ internal static StorageKey CreateStorageKey(byte prefix, byte[] key = null) return storageKey; } - internal static (bool State, bool Result) Check_UnregisterCandidate(StoreView snapshot, byte[] pubkey) + internal static (bool State, bool Result) Check_UnregisterCandidate(StoreView snapshot, byte[] pubkey, Block persistingBlock) { var engine = ApplicationEngine.Create(TriggerType.Application, - new Nep17NativeContractExtensions.ManualWitness(Contract.CreateSignatureRedeemScript(ECPoint.DecodePoint(pubkey, ECCurve.Secp256r1)).ToScriptHash()), snapshot); + new Nep17NativeContractExtensions.ManualWitness(Contract.CreateSignatureRedeemScript(ECPoint.DecodePoint(pubkey, ECCurve.Secp256r1)).ToScriptHash()), snapshot, persistingBlock); engine.LoadScript(NativeContract.NEO.Script, pcount: 1, configureState: p => p.ScriptHash = NativeContract.NEO.Hash); diff --git a/tests/neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs b/tests/neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs index 888dbdc233..d0dee61fc8 100644 --- a/tests/neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs +++ b/tests/neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs @@ -22,9 +22,8 @@ public void TestSetup() { TestBlockchain.InitializeMockNeoSystem(); _snapshot = Blockchain.Singleton.GetSnapshot(); - _snapshot.PersistingBlock = new Block() { Index = 0 }; - ApplicationEngine engine = ApplicationEngine.Create(TriggerType.OnPersist, _snapshot.PersistingBlock, _snapshot, 0); + ApplicationEngine engine = ApplicationEngine.Create(TriggerType.OnPersist, null, _snapshot, new Block(), 0); NativeContract.ContractManagement.OnPersist(engine); } @@ -57,14 +56,14 @@ public void Check_SetMaxBlockSize() // Fake blockchain - snapshot.PersistingBlock = new Block() { Index = 1000, PrevHash = UInt256.Zero }; + Block block = new Block() { Index = 1000, PrevHash = UInt256.Zero }; snapshot.Blocks.Add(UInt256.Zero, new Neo.Ledger.TrimmedBlock() { NextConsensus = UInt160.Zero }); UInt160 committeeMultiSigAddr = NativeContract.NEO.GetCommitteeAddress(snapshot); // Without signature - var ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(null), + var ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(null), block, "setMaxBlockSize", new ContractParameter(ContractParameterType.Integer) { Value = 1024 }); ret.Should().BeOfType(); ret.GetBoolean().Should().BeFalse(); @@ -77,7 +76,7 @@ public void Check_SetMaxBlockSize() Assert.ThrowsException(() => { - NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), + NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), block, "setMaxBlockSize", new ContractParameter(ContractParameterType.Integer) { Value = Neo.Network.P2P.Message.PayloadMaxSize + 1 }); }); @@ -87,7 +86,7 @@ public void Check_SetMaxBlockSize() // With signature - ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), + ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), block, "setMaxBlockSize", new ContractParameter(ContractParameterType.Integer) { Value = 1024 }); ret.Should().BeOfType(); ret.GetBoolean().Should().BeTrue(); @@ -104,14 +103,14 @@ public void Check_SetMaxBlockSystemFee() // Fake blockchain - snapshot.PersistingBlock = new Block() { Index = 1000, PrevHash = UInt256.Zero }; + Block block = new Block() { Index = 1000, PrevHash = UInt256.Zero }; snapshot.Blocks.Add(UInt256.Zero, new Neo.Ledger.TrimmedBlock() { NextConsensus = UInt160.Zero }); UInt160 committeeMultiSigAddr = NativeContract.NEO.GetCommitteeAddress(snapshot); // Without signature - var ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(null), + var ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(null), block, "setMaxBlockSystemFee", new ContractParameter(ContractParameterType.Integer) { Value = 1024 * (long)NativeContract.GAS.Factor }); ret.Should().BeOfType(); ret.GetBoolean().Should().BeFalse(); @@ -124,7 +123,7 @@ public void Check_SetMaxBlockSystemFee() Assert.ThrowsException(() => { - NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), + NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), block, "setMaxBlockSystemFee", new ContractParameter(ContractParameterType.Integer) { Value = -1000 }); }); @@ -134,7 +133,7 @@ public void Check_SetMaxBlockSystemFee() // With signature - ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), + ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), block, "setMaxBlockSystemFee", new ContractParameter(ContractParameterType.Integer) { Value = 1024 * (long)NativeContract.GAS.Factor }); ret.Should().BeOfType(); ret.GetBoolean().Should().BeTrue(); @@ -151,12 +150,12 @@ public void Check_SetMaxTransactionsPerBlock() // Fake blockchain - snapshot.PersistingBlock = new Block() { Index = 1000, PrevHash = UInt256.Zero }; + Block block = new Block() { Index = 1000, PrevHash = UInt256.Zero }; snapshot.Blocks.Add(UInt256.Zero, new TrimmedBlock() { NextConsensus = UInt160.Zero }); // Without signature - var ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(), + var ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(), block, "setMaxTransactionsPerBlock", new ContractParameter(ContractParameterType.Integer) { Value = 1 }); ret.Should().BeOfType(); ret.GetBoolean().Should().BeFalse(); @@ -167,7 +166,7 @@ public void Check_SetMaxTransactionsPerBlock() // With signature - ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(NativeContract.NEO.GetCommitteeAddress(snapshot)), + ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(NativeContract.NEO.GetCommitteeAddress(snapshot)), block, "setMaxTransactionsPerBlock", new ContractParameter(ContractParameterType.Integer) { Value = 1 }); ret.Should().BeOfType(); ret.GetBoolean().Should().BeTrue(); @@ -184,12 +183,12 @@ public void Check_SetFeePerByte() // Fake blockchain - snapshot.PersistingBlock = new Block() { Index = 1000, PrevHash = UInt256.Zero }; + Block block = new Block() { Index = 1000, PrevHash = UInt256.Zero }; snapshot.Blocks.Add(UInt256.Zero, new TrimmedBlock() { NextConsensus = UInt160.Zero }); // Without signature - var ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(), + var ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(), block, "setFeePerByte", new ContractParameter(ContractParameterType.Integer) { Value = 1 }); ret.Should().BeOfType(); ret.GetBoolean().Should().BeFalse(); @@ -200,7 +199,7 @@ public void Check_SetFeePerByte() // With signature UInt160 committeeMultiSigAddr = NativeContract.NEO.GetCommitteeAddress(snapshot); - ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), + ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), block, "setFeePerByte", new ContractParameter(ContractParameterType.Integer) { Value = 1 }); ret.Should().BeOfType(); ret.GetBoolean().Should().BeTrue(); @@ -217,14 +216,14 @@ public void Check_SetBaseExecFee() // Fake blockchain - snapshot.PersistingBlock = new Block() { Index = 1000, PrevHash = UInt256.Zero }; + Block block = new Block() { Index = 1000, PrevHash = UInt256.Zero }; snapshot.Blocks.Add(UInt256.Zero, new Neo.Ledger.TrimmedBlock() { NextConsensus = UInt160.Zero }); - NativeContract.Policy.Initialize(ApplicationEngine.Create(TriggerType.Application, null, snapshot, 0)); + NativeContract.Policy.Initialize(ApplicationEngine.Create(TriggerType.Application, null, snapshot, block, 0)); // Without signature - var ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(), + var ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(), block, "setExecFeeFactor", new ContractParameter(ContractParameterType.Integer) { Value = 50 }); ret.Should().BeOfType(); ret.GetBoolean().Should().BeFalse(); @@ -237,7 +236,7 @@ public void Check_SetBaseExecFee() UInt160 committeeMultiSigAddr = NativeContract.NEO.GetCommitteeAddress(snapshot); Assert.ThrowsException(() => { - NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), + NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), block, "setExecFeeFactor", new ContractParameter(ContractParameterType.Integer) { Value = 100500 }); }); @@ -246,7 +245,7 @@ public void Check_SetBaseExecFee() ret.GetInteger().Should().Be(30); // Proper set - ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), + ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), block, "setExecFeeFactor", new ContractParameter(ContractParameterType.Integer) { Value = 50 }); ret.Should().BeOfType(); ret.GetBoolean().Should().BeTrue(); @@ -263,14 +262,14 @@ public void Check_SetStoragePrice() // Fake blockchain - snapshot.PersistingBlock = new Block() { Index = 1000, PrevHash = UInt256.Zero }; + Block block = new Block() { Index = 1000, PrevHash = UInt256.Zero }; snapshot.Blocks.Add(UInt256.Zero, new Neo.Ledger.TrimmedBlock() { NextConsensus = UInt160.Zero }); - NativeContract.Policy.Initialize(ApplicationEngine.Create(TriggerType.Application, null, snapshot, 0)); + NativeContract.Policy.Initialize(ApplicationEngine.Create(TriggerType.Application, null, snapshot, block, 0)); // Without signature - var ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(), + var ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(), block, "setStoragePrice", new ContractParameter(ContractParameterType.Integer) { Value = 100500 }); ret.Should().BeOfType(); ret.GetBoolean().Should().BeFalse(); @@ -283,7 +282,7 @@ public void Check_SetStoragePrice() UInt160 committeeMultiSigAddr = NativeContract.NEO.GetCommitteeAddress(snapshot); Assert.ThrowsException(() => { - NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), + NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), block, "setStoragePrice", new ContractParameter(ContractParameterType.Integer) { Value = 100000000 }); }); @@ -292,7 +291,7 @@ public void Check_SetStoragePrice() ret.GetInteger().Should().Be(100000); // Proper set - ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), + ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), block, "setStoragePrice", new ContractParameter(ContractParameterType.Integer) { Value = 300300 }); ret.Should().BeOfType(); ret.GetBoolean().Should().BeTrue(); @@ -309,12 +308,12 @@ public void Check_BlockAccount() // Fake blockchain - snapshot.PersistingBlock = new Block() { Index = 1000, PrevHash = UInt256.Zero }; + Block block = new Block() { Index = 1000, PrevHash = UInt256.Zero }; snapshot.Blocks.Add(UInt256.Zero, new TrimmedBlock() { NextConsensus = UInt160.Zero }); // Without signature - var ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(UInt160.Zero), + var ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(UInt160.Zero), block, "blockAccount", new ContractParameter(ContractParameterType.ByteArray) { Value = UInt160.Parse("0xa400ff00ff00ff00ff00ff00ff00ff00ff00ff01").ToArray() }); ret.Should().BeOfType(); @@ -323,14 +322,14 @@ public void Check_BlockAccount() // With signature UInt160 committeeMultiSigAddr = NativeContract.NEO.GetCommitteeAddress(snapshot); - ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), + ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), block, "blockAccount", new ContractParameter(ContractParameterType.ByteArray) { Value = UInt160.Parse("0xa400ff00ff00ff00ff00ff00ff00ff00ff00ff01").ToArray() }); ret.Should().BeOfType(); ret.GetBoolean().Should().BeTrue(); // Same account - ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), + ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), block, "blockAccount", new ContractParameter(ContractParameterType.ByteArray) { Value = UInt160.Parse("0xa400ff00ff00ff00ff00ff00ff00ff00ff00ff01").ToArray() }); ret.Should().BeOfType(); @@ -338,7 +337,7 @@ public void Check_BlockAccount() // Account B - ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), + ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), block, "blockAccount", new ContractParameter(ContractParameterType.ByteArray) { Value = UInt160.Parse("0xb400ff00ff00ff00ff00ff00ff00ff00ff00ff01").ToArray() }); ret.Should().BeOfType(); @@ -358,14 +357,14 @@ public void Check_Block_UnblockAccount() // Fake blockchain - snapshot.PersistingBlock = new Block() { Index = 1000, PrevHash = UInt256.Zero }; + Block block = new Block() { Index = 1000, PrevHash = UInt256.Zero }; snapshot.Blocks.Add(UInt256.Zero, new TrimmedBlock() { NextConsensus = UInt160.Zero }); UInt160 committeeMultiSigAddr = NativeContract.NEO.GetCommitteeAddress(snapshot); // Block without signature - var ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(), + var ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(), block, "blockAccount", new ContractParameter(ContractParameterType.Hash160) { Value = UInt160.Zero }); ret.Should().BeOfType(); ret.GetBoolean().Should().BeFalse(); @@ -374,7 +373,7 @@ public void Check_Block_UnblockAccount() // Block with signature - ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), + ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), block, "blockAccount", new ContractParameter(ContractParameterType.Hash160) { Value = UInt160.Zero }); ret.Should().BeOfType(); ret.GetBoolean().Should().BeTrue(); @@ -383,7 +382,7 @@ public void Check_Block_UnblockAccount() // Unblock without signature - ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(), + ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(), block, "unblockAccount", new ContractParameter(ContractParameterType.Hash160) { Value = UInt160.Zero }); ret.Should().BeOfType(); ret.GetBoolean().Should().BeFalse(); @@ -392,7 +391,7 @@ public void Check_Block_UnblockAccount() // Unblock with signature - ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), + ret = NativeContract.Policy.Call(snapshot, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), block, "unblockAccount", new ContractParameter(ContractParameterType.Hash160) { Value = UInt160.Zero }); ret.Should().BeOfType(); ret.GetBoolean().Should().BeTrue(); diff --git a/tests/neo.UnitTests/SmartContract/Native/UT_RoleManagement.cs b/tests/neo.UnitTests/SmartContract/Native/UT_RoleManagement.cs index bbee62a469..24db8906f5 100644 --- a/tests/neo.UnitTests/SmartContract/Native/UT_RoleManagement.cs +++ b/tests/neo.UnitTests/SmartContract/Native/UT_RoleManagement.cs @@ -23,22 +23,18 @@ public void TestSetup() { TestBlockchain.InitializeMockNeoSystem(); _snapshot = Blockchain.Singleton.GetSnapshot(); - _snapshot.PersistingBlock = new Block() { Index = 0 }; } [TestMethod] public void TestSetAndGet() { var snapshot1 = _snapshot.Clone(); - snapshot1.PersistingBlock = new Block - { - Index = 0, - }; UInt160 committeeMultiSigAddr = NativeContract.NEO.GetCommitteeAddress(snapshot1); ECPoint[] validators = NativeContract.NEO.ComputeNextBlockValidators(snapshot1); var ret = NativeContract.RoleManagement.Call( snapshot1, new Nep17NativeContractExtensions.ManualWitness(committeeMultiSigAddr), + new Block(), "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() } diff --git a/tests/neo.UnitTests/SmartContract/UT_ApplicationEngine.cs b/tests/neo.UnitTests/SmartContract/UT_ApplicationEngine.cs index 36a67f026c..be99c15830 100644 --- a/tests/neo.UnitTests/SmartContract/UT_ApplicationEngine.cs +++ b/tests/neo.UnitTests/SmartContract/UT_ApplicationEngine.cs @@ -95,10 +95,10 @@ public void TestCreateDummyBlock() { var snapshot = Blockchain.Singleton.GetSnapshot(); byte[] SyscallSystemRuntimeCheckWitnessHash = new byte[] { 0x68, 0xf8, 0x27, 0xec, 0x8c }; - ApplicationEngine.Run(SyscallSystemRuntimeCheckWitnessHash, snapshot); - snapshot.PersistingBlock.Version.Should().Be(0); - snapshot.PersistingBlock.PrevHash.Should().Be(Blockchain.GenesisBlock.Hash); - snapshot.PersistingBlock.MerkleRoot.Should().Be(new UInt256()); + ApplicationEngine engine = ApplicationEngine.Run(SyscallSystemRuntimeCheckWitnessHash, snapshot); + engine.PersistingBlock.Version.Should().Be(0); + engine.PersistingBlock.PrevHash.Should().Be(Blockchain.GenesisBlock.Hash); + engine.PersistingBlock.MerkleRoot.Should().Be(new UInt256()); } } } diff --git a/tests/neo.UnitTests/SmartContract/UT_ApplicationEngineProvider.cs b/tests/neo.UnitTests/SmartContract/UT_ApplicationEngineProvider.cs index ccfd7ff138..ad8e37b107 100644 --- a/tests/neo.UnitTests/SmartContract/UT_ApplicationEngineProvider.cs +++ b/tests/neo.UnitTests/SmartContract/UT_ApplicationEngineProvider.cs @@ -28,14 +28,14 @@ public void TestSetAppEngineProvider() var provider = new TestProvider(); ApplicationEngine.SetApplicationEngineProvider(provider).Should().BeTrue(); - using var appEngine = ApplicationEngine.Create(TriggerType.Application, null, null, 0); + using var appEngine = ApplicationEngine.Create(TriggerType.Application, null, null, null, 0); (appEngine is TestEngine).Should().BeTrue(); } [TestMethod] public void TestDefaultAppEngineProvider() { - using var appEngine = ApplicationEngine.Create(TriggerType.Application, null, null, 0); + using var appEngine = ApplicationEngine.Create(TriggerType.Application, null, null, null, 0); (appEngine is ApplicationEngine).Should().BeTrue(); } @@ -63,16 +63,16 @@ public void TestCanResetAppEngineProviderTwice() class TestProvider : IApplicationEngineProvider { - public ApplicationEngine Create(TriggerType trigger, IVerifiable container, StoreView snapshot, long gas) + public ApplicationEngine Create(TriggerType trigger, IVerifiable container, StoreView snapshot, Block persistingBlock, long gas) { - return new TestEngine(trigger, container, snapshot, gas); + return new TestEngine(trigger, container, snapshot, persistingBlock, gas); } } class TestEngine : ApplicationEngine { - public TestEngine(TriggerType trigger, IVerifiable container, StoreView snapshot, long gas) - : base(trigger, container, snapshot, gas) + public TestEngine(TriggerType trigger, IVerifiable container, StoreView snapshot, Block persistingBlock, long gas) + : base(trigger, container, snapshot, persistingBlock, gas) { } } diff --git a/tests/neo.UnitTests/SmartContract/UT_InteropPrices.cs b/tests/neo.UnitTests/SmartContract/UT_InteropPrices.cs index cdcd78247f..53b8f559af 100644 --- a/tests/neo.UnitTests/SmartContract/UT_InteropPrices.cs +++ b/tests/neo.UnitTests/SmartContract/UT_InteropPrices.cs @@ -21,7 +21,7 @@ public void ApplicationEngineFixedPrices() { // System.Runtime.CheckWitness: f827ec8c (price is 200) byte[] SyscallSystemRuntimeCheckWitnessHash = new byte[] { 0x68, 0xf8, 0x27, 0xec, 0x8c }; - using (ApplicationEngine ae = ApplicationEngine.Create(TriggerType.Application, null, null, 0)) + using (ApplicationEngine ae = ApplicationEngine.Create(TriggerType.Application, null, null, null, 0)) { ae.LoadScript(SyscallSystemRuntimeCheckWitnessHash); ApplicationEngine.System_Runtime_CheckWitness.FixedPrice.Should().Be(0_00001024L); @@ -29,7 +29,7 @@ public void ApplicationEngineFixedPrices() // System.Storage.GetContext: 9bf667ce (price is 1) byte[] SyscallSystemStorageGetContextHash = new byte[] { 0x68, 0x9b, 0xf6, 0x67, 0xce }; - using (ApplicationEngine ae = ApplicationEngine.Create(TriggerType.Application, null, null, 0)) + using (ApplicationEngine ae = ApplicationEngine.Create(TriggerType.Application, null, null, null, 0)) { ae.LoadScript(SyscallSystemStorageGetContextHash); ApplicationEngine.System_Storage_GetContext.FixedPrice.Should().Be(0_00000016L); @@ -37,7 +37,7 @@ public void ApplicationEngineFixedPrices() // System.Storage.Get: 925de831 (price is 100) byte[] SyscallSystemStorageGetHash = new byte[] { 0x68, 0x92, 0x5d, 0xe8, 0x31 }; - using (ApplicationEngine ae = ApplicationEngine.Create(TriggerType.Application, null, null, 0)) + using (ApplicationEngine ae = ApplicationEngine.Create(TriggerType.Application, null, null, null, 0)) { ae.LoadScript(SyscallSystemStorageGetHash); ApplicationEngine.System_Storage_Get.FixedPrice.Should().Be(32768L); diff --git a/tests/neo.UnitTests/SmartContract/UT_InteropService.NEO.cs b/tests/neo.UnitTests/SmartContract/UT_InteropService.NEO.cs index a45b2bed46..477eccf54e 100644 --- a/tests/neo.UnitTests/SmartContract/UT_InteropService.NEO.cs +++ b/tests/neo.UnitTests/SmartContract/UT_InteropService.NEO.cs @@ -131,7 +131,6 @@ public void TestAccount_IsStandard() public void TestContract_Create() { var snapshot = Blockchain.Singleton.GetSnapshot().Clone(); - snapshot.PersistingBlock = new Block() { }; var nef = new NefFile() { Script = new byte[byte.MaxValue], @@ -177,8 +176,6 @@ public void TestContract_Create() public void TestContract_Update() { var snapshot = Blockchain.Singleton.GetSnapshot().Clone(); - snapshot.PersistingBlock = new Block() { }; - var nef = new NefFile() { Script = new byte[] { 0x01 }, @@ -241,7 +238,6 @@ public void TestContract_Update_Invalid() nefFile.CheckSum = NefFile.ComputeChecksum(nefFile); var snapshot = Blockchain.Singleton.GetSnapshot().Clone(); - snapshot.PersistingBlock = new Block(); Assert.ThrowsException(() => snapshot.UpdateContract(null, null, new byte[] { 0x01 })); Assert.ThrowsException(() => snapshot.UpdateContract(null, nefFile.ToArray(), null)); diff --git a/tests/neo.UnitTests/SmartContract/UT_InteropService.cs b/tests/neo.UnitTests/SmartContract/UT_InteropService.cs index 60ff884f44..04dfa63916 100644 --- a/tests/neo.UnitTests/SmartContract/UT_InteropService.cs +++ b/tests/neo.UnitTests/SmartContract/UT_InteropService.cs @@ -220,7 +220,7 @@ public void TestExecutionEngine_GetCallingScriptHash() Nef = new NefFile { Script = scriptA.ToArray() }, Hash = scriptA.ToArray().ToScriptHash() }; - engine = GetEngine(true, true, false); + engine = GetEngine(true, true, addScript: false); engine.Snapshot.AddContract(contract.Hash, contract); using ScriptBuilder scriptB = new ScriptBuilder(); @@ -281,9 +281,7 @@ public void TestRuntime_Log() public void TestRuntime_GetTime() { Block block = new Block(); - TestUtils.SetupBlockWithValues(block, UInt256.Zero, out _, out _, out _, out _, out _, out _, 0); - var engine = GetEngine(true, true); - engine.Snapshot.PersistingBlock = block; + var engine = GetEngine(true, true, hasBlock: true); engine.GetTime().Should().Be(block.Timestamp); } @@ -619,8 +617,6 @@ public void TestContract_Call() public void TestContract_Destroy() { var snapshot = Blockchain.Singleton.GetSnapshot().Clone(); - snapshot.PersistingBlock = new Block(); - var state = TestUtils.GetContract(); var scriptHash = UInt160.Parse("0xcb9f3b7c6fb1cf2c13a40637c189bdd066a272b4"); var storageItem = new StorageItem @@ -660,31 +656,13 @@ public static void LogEvent(object sender, LogEventArgs args) tx.Script = new byte[] { 0x01, 0x02, 0x03 }; } - private static ApplicationEngine GetEngine(bool hasContainer = false, bool hasSnapshot = false, bool addScript = true, long gas = 20_00000000) + private static ApplicationEngine GetEngine(bool hasContainer = false, bool hasSnapshot = false, bool hasBlock = false, bool addScript = true, long gas = 20_00000000) { - var tx = TestUtils.GetTransaction(UInt160.Zero); - var snapshot = Blockchain.Singleton.GetSnapshot().Clone(); - ApplicationEngine engine; - if (hasContainer && hasSnapshot) - { - engine = ApplicationEngine.Create(TriggerType.Application, tx, snapshot, gas); - } - else if (hasContainer && !hasSnapshot) - { - engine = ApplicationEngine.Create(TriggerType.Application, tx, null, gas); - } - else if (!hasContainer && hasSnapshot) - { - engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot, gas); - } - else - { - engine = ApplicationEngine.Create(TriggerType.Application, null, null, gas); - } - if (addScript) - { - engine.LoadScript(new byte[] { 0x01 }); - } + var tx = hasContainer ? TestUtils.GetTransaction(UInt160.Zero) : null; + var snapshot = hasSnapshot ? Blockchain.Singleton.GetSnapshot().Clone() : null; + var block = hasBlock ? new Block() : null; + ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Application, tx, snapshot, block, gas); + if (addScript) engine.LoadScript(new byte[] { 0x01 }); return engine; } } diff --git a/tests/neo.UnitTests/SmartContract/UT_Syscalls.cs b/tests/neo.UnitTests/SmartContract/UT_Syscalls.cs index d39bcf9a8b..029c04c623 100644 --- a/tests/neo.UnitTests/SmartContract/UT_Syscalls.cs +++ b/tests/neo.UnitTests/SmartContract/UT_Syscalls.cs @@ -279,7 +279,7 @@ public void System_Runtime_GasLeft() // Execute - var engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot, 100_000_000); + var engine = ApplicationEngine.Create(TriggerType.Application, null, snapshot, null, 100_000_000); engine.LoadScript(script.ToArray()); Assert.AreEqual(engine.Execute(), VMState.HALT);