diff --git a/src/neo/Ledger/MemoryPool.cs b/src/neo/Ledger/MemoryPool.cs index 998b56e3a2..749b2d1d6f 100644 --- a/src/neo/Ledger/MemoryPool.cs +++ b/src/neo/Ledger/MemoryPool.cs @@ -62,6 +62,7 @@ public class MemoryPool : IReadOnlyCollection private int _maxTxPerBlock; private long _feePerByte; + private uint _baseExecFee; /// /// Total maximum capacity of transactions the pool can hold. @@ -109,8 +110,10 @@ internal bool LoadPolicy(StoreView snapshot) { _maxTxPerBlock = (int)NativeContract.Policy.GetMaxTransactionsPerBlock(snapshot); long newFeePerByte = NativeContract.Policy.GetFeePerByte(snapshot); - bool policyChanged = newFeePerByte > _feePerByte; + uint newBaseExecFee = NativeContract.Policy.GetBaseExecFee(snapshot); + bool policyChanged = newFeePerByte > _feePerByte || newBaseExecFee > _baseExecFee; _feePerByte = newFeePerByte; + _baseExecFee = newBaseExecFee; return policyChanged; } diff --git a/src/neo/Network/P2P/Payloads/BlockBase.cs b/src/neo/Network/P2P/Payloads/BlockBase.cs index b724f5e074..ca14c69252 100644 --- a/src/neo/Network/P2P/Payloads/BlockBase.cs +++ b/src/neo/Network/P2P/Payloads/BlockBase.cs @@ -3,6 +3,7 @@ using Neo.IO.Json; using Neo.Persistence; using Neo.SmartContract; +using Neo.SmartContract.Native; using Neo.Wallets; using System; using System.IO; @@ -118,7 +119,7 @@ public virtual bool Verify(StoreView snapshot) if (prev_header == null) return false; if (prev_header.Index + 1 != Index) return false; if (prev_header.Timestamp >= Timestamp) return false; - if (!this.VerifyWitnesses(snapshot, 1_00000000)) return false; + if (!this.VerifyWitnesses(snapshot, 3000000 * NativeContract.Policy.GetBaseExecFee(snapshot))) return false; return true; } } diff --git a/src/neo/Network/P2P/Payloads/ConsensusPayload.cs b/src/neo/Network/P2P/Payloads/ConsensusPayload.cs index dbf2732fbc..c515b6044f 100644 --- a/src/neo/Network/P2P/Payloads/ConsensusPayload.cs +++ b/src/neo/Network/P2P/Payloads/ConsensusPayload.cs @@ -124,7 +124,7 @@ public bool Verify(StoreView snapshot) { if (BlockIndex <= snapshot.Height) return false; - return this.VerifyWitnesses(snapshot, 0_02000000); + return this.VerifyWitnesses(snapshot, 60000 * NativeContract.Policy.GetBaseExecFee(snapshot)); } } } diff --git a/src/neo/SmartContract/ApplicationEngine.OpCodePrices.cs b/src/neo/SmartContract/ApplicationEngine.OpCodePrices.cs index 41bd1f7a29..e1e912993c 100644 --- a/src/neo/SmartContract/ApplicationEngine.OpCodePrices.cs +++ b/src/neo/SmartContract/ApplicationEngine.OpCodePrices.cs @@ -7,190 +7,190 @@ partial class ApplicationEngine { public static readonly IReadOnlyDictionary OpCodePrices = new Dictionary { - [OpCode.PUSHINT8] = 30, - [OpCode.PUSHINT16] = 30, - [OpCode.PUSHINT32] = 30, - [OpCode.PUSHINT64] = 30, - [OpCode.PUSHINT128] = 120, - [OpCode.PUSHINT256] = 120, - [OpCode.PUSHA] = 120, - [OpCode.PUSHNULL] = 30, - [OpCode.PUSHDATA1] = 180, - [OpCode.PUSHDATA2] = 13000, - [OpCode.PUSHDATA4] = 110000, - [OpCode.PUSHM1] = 30, - [OpCode.PUSH0] = 30, - [OpCode.PUSH1] = 30, - [OpCode.PUSH2] = 30, - [OpCode.PUSH3] = 30, - [OpCode.PUSH4] = 30, - [OpCode.PUSH5] = 30, - [OpCode.PUSH6] = 30, - [OpCode.PUSH7] = 30, - [OpCode.PUSH8] = 30, - [OpCode.PUSH9] = 30, - [OpCode.PUSH10] = 30, - [OpCode.PUSH11] = 30, - [OpCode.PUSH12] = 30, - [OpCode.PUSH13] = 30, - [OpCode.PUSH14] = 30, - [OpCode.PUSH15] = 30, - [OpCode.PUSH16] = 30, - [OpCode.NOP] = 30, - [OpCode.JMP] = 70, - [OpCode.JMP_L] = 70, - [OpCode.JMPIF] = 70, - [OpCode.JMPIF_L] = 70, - [OpCode.JMPIFNOT] = 70, - [OpCode.JMPIFNOT_L] = 70, - [OpCode.JMPEQ] = 70, - [OpCode.JMPEQ_L] = 70, - [OpCode.JMPNE] = 70, - [OpCode.JMPNE_L] = 70, - [OpCode.JMPGT] = 70, - [OpCode.JMPGT_L] = 70, - [OpCode.JMPGE] = 70, - [OpCode.JMPGE_L] = 70, - [OpCode.JMPLT] = 70, - [OpCode.JMPLT_L] = 70, - [OpCode.JMPLE] = 70, - [OpCode.JMPLE_L] = 70, - [OpCode.CALL] = 22000, - [OpCode.CALL_L] = 22000, - [OpCode.CALLA] = 22000, - [OpCode.ABORT] = 30, - [OpCode.ASSERT] = 30, - [OpCode.THROW] = 22000, - [OpCode.TRY] = 100, - [OpCode.TRY_L] = 100, - [OpCode.ENDTRY] = 100, - [OpCode.ENDTRY_L] = 100, + [OpCode.PUSHINT8] = 4, + [OpCode.PUSHINT16] = 4, + [OpCode.PUSHINT32] = 4, + [OpCode.PUSHINT64] = 4, + [OpCode.PUSHINT128] = 5, + [OpCode.PUSHINT256] = 5, + [OpCode.PUSHA] = 20, + [OpCode.PUSHNULL] = 2, + [OpCode.PUSHDATA1] = 6, + [OpCode.PUSHDATA2] = 40, + [OpCode.PUSHDATA4] = 1000, + [OpCode.PUSHM1] = 4, + [OpCode.PUSH0] = 4, + [OpCode.PUSH1] = 4, + [OpCode.PUSH2] = 4, + [OpCode.PUSH3] = 4, + [OpCode.PUSH4] = 4, + [OpCode.PUSH5] = 4, + [OpCode.PUSH6] = 4, + [OpCode.PUSH7] = 4, + [OpCode.PUSH8] = 4, + [OpCode.PUSH9] = 4, + [OpCode.PUSH10] = 4, + [OpCode.PUSH11] = 4, + [OpCode.PUSH12] = 4, + [OpCode.PUSH13] = 4, + [OpCode.PUSH14] = 4, + [OpCode.PUSH15] = 4, + [OpCode.PUSH16] = 4, + [OpCode.NOP] = 1, + [OpCode.JMP] = 2, + [OpCode.JMP_L] = 2, + [OpCode.JMPIF] = 2, + [OpCode.JMPIF_L] = 2, + [OpCode.JMPIFNOT] = 2, + [OpCode.JMPIFNOT_L] = 2, + [OpCode.JMPEQ] = 4, + [OpCode.JMPEQ_L] = 4, + [OpCode.JMPNE] = 4, + [OpCode.JMPNE_L] = 4, + [OpCode.JMPGT] = 4, + [OpCode.JMPGT_L] = 4, + [OpCode.JMPGE] = 4, + [OpCode.JMPGE_L] = 4, + [OpCode.JMPLT] = 4, + [OpCode.JMPLT_L] = 4, + [OpCode.JMPLE] = 4, + [OpCode.JMPLE_L] = 4, + [OpCode.CALL] = 10, + [OpCode.CALL_L] = 10, + [OpCode.CALLA] = 20, + [OpCode.ABORT] = 0, + [OpCode.ASSERT] = 2, + [OpCode.THROW] = 100, + [OpCode.TRY] = 5, + [OpCode.TRY_L] = 5, + [OpCode.ENDTRY] = 3, + [OpCode.ENDTRY_L] = 3, [OpCode.ENDFINALLY] = 100, [OpCode.RET] = 0, [OpCode.SYSCALL] = 0, - [OpCode.DEPTH] = 60, - [OpCode.DROP] = 60, - [OpCode.NIP] = 60, - [OpCode.XDROP] = 400, - [OpCode.CLEAR] = 400, - [OpCode.DUP] = 60, - [OpCode.OVER] = 60, - [OpCode.PICK] = 60, - [OpCode.TUCK] = 60, - [OpCode.SWAP] = 60, - [OpCode.ROT] = 60, - [OpCode.ROLL] = 400, - [OpCode.REVERSE3] = 60, - [OpCode.REVERSE4] = 60, - [OpCode.REVERSEN] = 400, - [OpCode.INITSSLOT] = 400, - [OpCode.INITSLOT] = 800, - [OpCode.LDSFLD0] = 60, - [OpCode.LDSFLD1] = 60, - [OpCode.LDSFLD2] = 60, - [OpCode.LDSFLD3] = 60, - [OpCode.LDSFLD4] = 60, - [OpCode.LDSFLD5] = 60, - [OpCode.LDSFLD6] = 60, - [OpCode.LDSFLD] = 60, - [OpCode.STSFLD0] = 60, - [OpCode.STSFLD1] = 60, - [OpCode.STSFLD2] = 60, - [OpCode.STSFLD3] = 60, - [OpCode.STSFLD4] = 60, - [OpCode.STSFLD5] = 60, - [OpCode.STSFLD6] = 60, - [OpCode.STSFLD] = 60, - [OpCode.LDLOC0] = 60, - [OpCode.LDLOC1] = 60, - [OpCode.LDLOC2] = 60, - [OpCode.LDLOC3] = 60, - [OpCode.LDLOC4] = 60, - [OpCode.LDLOC5] = 60, - [OpCode.LDLOC6] = 60, - [OpCode.LDLOC] = 60, - [OpCode.STLOC0] = 60, - [OpCode.STLOC1] = 60, - [OpCode.STLOC2] = 60, - [OpCode.STLOC3] = 60, - [OpCode.STLOC4] = 60, - [OpCode.STLOC5] = 60, - [OpCode.STLOC6] = 60, - [OpCode.STLOC] = 60, - [OpCode.LDARG0] = 60, - [OpCode.LDARG1] = 60, - [OpCode.LDARG2] = 60, - [OpCode.LDARG3] = 60, - [OpCode.LDARG4] = 60, - [OpCode.LDARG5] = 60, - [OpCode.LDARG6] = 60, - [OpCode.LDARG] = 60, - [OpCode.STARG0] = 60, - [OpCode.STARG1] = 60, - [OpCode.STARG2] = 60, - [OpCode.STARG3] = 60, - [OpCode.STARG4] = 60, - [OpCode.STARG5] = 60, - [OpCode.STARG6] = 60, - [OpCode.STARG] = 60, - [OpCode.NEWBUFFER] = 80000, - [OpCode.MEMCPY] = 80000, - [OpCode.CAT] = 80000, - [OpCode.SUBSTR] = 80000, - [OpCode.LEFT] = 80000, - [OpCode.RIGHT] = 80000, - [OpCode.INVERT] = 100, - [OpCode.AND] = 200, - [OpCode.OR] = 200, - [OpCode.XOR] = 200, - [OpCode.EQUAL] = 200, - [OpCode.NOTEQUAL] = 200, - [OpCode.SIGN] = 100, - [OpCode.ABS] = 100, - [OpCode.NEGATE] = 100, - [OpCode.INC] = 100, - [OpCode.DEC] = 100, - [OpCode.ADD] = 200, - [OpCode.SUB] = 200, - [OpCode.MUL] = 300, - [OpCode.DIV] = 300, - [OpCode.MOD] = 300, - [OpCode.SHL] = 300, - [OpCode.SHR] = 300, - [OpCode.NOT] = 100, - [OpCode.BOOLAND] = 200, - [OpCode.BOOLOR] = 200, - [OpCode.NZ] = 100, - [OpCode.NUMEQUAL] = 200, - [OpCode.NUMNOTEQUAL] = 200, - [OpCode.LT] = 200, - [OpCode.LE] = 200, - [OpCode.GT] = 200, - [OpCode.GE] = 200, - [OpCode.MIN] = 200, - [OpCode.MAX] = 200, - [OpCode.WITHIN] = 200, - [OpCode.PACK] = 7000, - [OpCode.UNPACK] = 7000, - [OpCode.NEWARRAY0] = 400, - [OpCode.NEWARRAY] = 15000, - [OpCode.NEWARRAY_T] = 15000, - [OpCode.NEWSTRUCT0] = 400, - [OpCode.NEWSTRUCT] = 15000, - [OpCode.NEWMAP] = 200, - [OpCode.SIZE] = 150, - [OpCode.HASKEY] = 270000, - [OpCode.KEYS] = 500, - [OpCode.VALUES] = 7000, - [OpCode.PICKITEM] = 270000, - [OpCode.APPEND] = 15000, - [OpCode.SETITEM] = 270000, - [OpCode.REVERSEITEMS] = 500, - [OpCode.REMOVE] = 500, - [OpCode.CLEARITEMS] = 400, - [OpCode.ISNULL] = 60, - [OpCode.ISTYPE] = 60, - [OpCode.CONVERT] = 80000, + [OpCode.DEPTH] = 5, + [OpCode.DROP] = 2, + [OpCode.NIP] = 2, + [OpCode.XDROP] = 100, + [OpCode.CLEAR] = 50, + [OpCode.DUP] = 3, + [OpCode.OVER] = 3, + [OpCode.PICK] = 10, + [OpCode.TUCK] = 4, + [OpCode.SWAP] = 2, + [OpCode.ROT] = 2, + [OpCode.ROLL] = 15, + [OpCode.REVERSE3] = 2, + [OpCode.REVERSE4] = 2, + [OpCode.REVERSEN] = 40, + [OpCode.INITSSLOT] = 50, + [OpCode.INITSLOT] = 100, + [OpCode.LDSFLD0] = 2, + [OpCode.LDSFLD1] = 2, + [OpCode.LDSFLD2] = 2, + [OpCode.LDSFLD3] = 2, + [OpCode.LDSFLD4] = 2, + [OpCode.LDSFLD5] = 2, + [OpCode.LDSFLD6] = 2, + [OpCode.LDSFLD] = 2, + [OpCode.STSFLD0] = 2, + [OpCode.STSFLD1] = 2, + [OpCode.STSFLD2] = 2, + [OpCode.STSFLD3] = 2, + [OpCode.STSFLD4] = 2, + [OpCode.STSFLD5] = 2, + [OpCode.STSFLD6] = 2, + [OpCode.STSFLD] = 2, + [OpCode.LDLOC0] = 2, + [OpCode.LDLOC1] = 2, + [OpCode.LDLOC2] = 2, + [OpCode.LDLOC3] = 2, + [OpCode.LDLOC4] = 2, + [OpCode.LDLOC5] = 2, + [OpCode.LDLOC6] = 2, + [OpCode.LDLOC] = 2, + [OpCode.STLOC0] = 2, + [OpCode.STLOC1] = 2, + [OpCode.STLOC2] = 2, + [OpCode.STLOC3] = 2, + [OpCode.STLOC4] = 2, + [OpCode.STLOC5] = 2, + [OpCode.STLOC6] = 2, + [OpCode.STLOC] = 2, + [OpCode.LDARG0] = 2, + [OpCode.LDARG1] = 2, + [OpCode.LDARG2] = 2, + [OpCode.LDARG3] = 2, + [OpCode.LDARG4] = 2, + [OpCode.LDARG5] = 2, + [OpCode.LDARG6] = 2, + [OpCode.LDARG] = 2, + [OpCode.STARG0] = 2, + [OpCode.STARG1] = 2, + [OpCode.STARG2] = 2, + [OpCode.STARG3] = 2, + [OpCode.STARG4] = 2, + [OpCode.STARG5] = 2, + [OpCode.STARG6] = 2, + [OpCode.STARG] = 2, + [OpCode.NEWBUFFER] = 300, + [OpCode.MEMCPY] = 2000, + [OpCode.CAT] = 4000, + [OpCode.SUBSTR] = 4000, + [OpCode.LEFT] = 4000, + [OpCode.RIGHT] = 4000, + [OpCode.INVERT] = 6, + [OpCode.AND] = 9, + [OpCode.OR] = 9, + [OpCode.XOR] = 9, + [OpCode.EQUAL] = 50, + [OpCode.NOTEQUAL] = 50, + [OpCode.SIGN] = 6, + [OpCode.ABS] = 6, + [OpCode.NEGATE] = 6, + [OpCode.INC] = 7, + [OpCode.DEC] = 7, + [OpCode.ADD] = 9, + [OpCode.SUB] = 9, + [OpCode.MUL] = 9, + [OpCode.DIV] = 9, + [OpCode.MOD] = 9, + [OpCode.SHL] = 9, + [OpCode.SHR] = 9, + [OpCode.NOT] = 3, + [OpCode.BOOLAND] = 4, + [OpCode.BOOLOR] = 4, + [OpCode.NZ] = 3, + [OpCode.NUMEQUAL] = 4, + [OpCode.NUMNOTEQUAL] = 4, + [OpCode.LT] = 4, + [OpCode.LE] = 4, + [OpCode.GT] = 4, + [OpCode.GE] = 4, + [OpCode.MIN] = 9, + [OpCode.MAX] = 9, + [OpCode.WITHIN] = 9, + [OpCode.PACK] = 500, + [OpCode.UNPACK] = 500, + [OpCode.NEWARRAY0] = 10, + [OpCode.NEWARRAY] = 500, + [OpCode.NEWARRAY_T] = 800, + [OpCode.NEWSTRUCT0] = 10, + [OpCode.NEWSTRUCT] = 500, + [OpCode.NEWMAP] = 20, + [OpCode.SIZE] = 20, + [OpCode.HASKEY] = 50, + [OpCode.KEYS] = 200, + [OpCode.VALUES] = 400, + [OpCode.PICKITEM] = 50, + [OpCode.APPEND] = 500, + [OpCode.SETITEM] = 500, + [OpCode.REVERSEITEMS] = 5000, + [OpCode.REMOVE] = 50, + [OpCode.CLEARITEMS] = 500, + [OpCode.ISNULL] = 3, + [OpCode.ISTYPE] = 6, + [OpCode.CONVERT] = 50, }; } } diff --git a/src/neo/SmartContract/ApplicationEngine.cs b/src/neo/SmartContract/ApplicationEngine.cs index b6eccabcf2..2af355ed52 100644 --- a/src/neo/SmartContract/ApplicationEngine.cs +++ b/src/neo/SmartContract/ApplicationEngine.cs @@ -3,6 +3,7 @@ using Neo.Network.P2P.Payloads; using Neo.Persistence; using Neo.Plugins; +using Neo.SmartContract.Native; using Neo.VM; using Neo.VM.Types; using System; @@ -47,6 +48,7 @@ private class InvocationState private List disposables; private readonly Dictionary invocationCounter = new Dictionary(); private readonly Dictionary invocationStates = new Dictionary(); + private readonly uint base_exec_fee; public static IReadOnlyDictionary Services => services; private List Disposables => disposables ??= new List(); @@ -67,6 +69,7 @@ protected ApplicationEngine(TriggerType trigger, IVerifiable container, StoreVie this.ScriptContainer = container; this.Snapshot = snapshot; this.gas_amount = gas; + this.base_exec_fee = snapshot is null ? PolicyContract.DefaultBaseExecFee : NativeContract.Policy.GetBaseExecFee(Snapshot); } protected internal void AddGas(long gas) @@ -270,7 +273,7 @@ protected override void OnSysCall(uint method) protected override void PreExecuteInstruction() { if (CurrentContext.InstructionPointer < CurrentContext.Script.Length) - AddGas(OpCodePrices[CurrentContext.CurrentInstruction.OpCode]); + AddGas(base_exec_fee * OpCodePrices[CurrentContext.CurrentInstruction.OpCode]); } private static Block CreateDummyBlock(StoreView snapshot) diff --git a/src/neo/SmartContract/Native/PolicyContract.cs b/src/neo/SmartContract/Native/PolicyContract.cs index 1002debb7c..687eb84703 100644 --- a/src/neo/SmartContract/Native/PolicyContract.cs +++ b/src/neo/SmartContract/Native/PolicyContract.cs @@ -14,12 +14,15 @@ public sealed class PolicyContract : NativeContract { public override string Name => "Policy"; public override int Id => -3; + public const uint DefaultBaseExecFee = 30; + private const uint MaxBaseExecFee = 10000; private const byte Prefix_MaxTransactionsPerBlock = 23; private const byte Prefix_FeePerByte = 10; private const byte Prefix_BlockedAccount = 15; private const byte Prefix_MaxBlockSize = 12; private const byte Prefix_MaxBlockSystemFee = 17; + private const byte Prefix_BaseExecFee = 18; public PolicyContract() { @@ -58,6 +61,14 @@ public long GetFeePerByte(StoreView snapshot) return (long)(BigInteger)item; } + [ContractMethod(0_01000000, CallFlags.AllowStates)] + public uint GetBaseExecFee(StoreView snapshot) + { + StorageItem item = snapshot.Storages.TryGet(CreateStorageKey(Prefix_BaseExecFee)); + if (item is null) return DefaultBaseExecFee; + return (uint)(BigInteger)item; + } + [ContractMethod(0_01000000, CallFlags.AllowStates)] public bool IsBlocked(StoreView snapshot, UInt160 account) { @@ -104,6 +115,16 @@ private bool SetFeePerByte(ApplicationEngine engine, long value) return true; } + [ContractMethod(0_03000000, CallFlags.AllowModifyStates)] + private bool SetBaseExecFee(ApplicationEngine engine, uint value) + { + if (value == 0 || value > MaxBaseExecFee) throw new ArgumentOutOfRangeException(nameof(value)); + if (!CheckCommittee(engine)) return false; + StorageItem storage = engine.Snapshot.Storages.GetAndChange(CreateStorageKey(Prefix_BaseExecFee), () => new StorageItem()); + storage.Set(value); + return true; + } + [ContractMethod(0_03000000, CallFlags.AllowModifyStates)] private bool BlockAccount(ApplicationEngine engine, UInt160 account) { diff --git a/src/neo/Wallets/Wallet.cs b/src/neo/Wallets/Wallet.cs index 603c6a50a6..34ee1b16f9 100644 --- a/src/neo/Wallets/Wallet.cs +++ b/src/neo/Wallets/Wallet.cs @@ -372,6 +372,7 @@ public long CalculateNetworkFee(StoreView snapshot, Transaction tx) foreach (UInt160 hash in hashes) { byte[] witness_script = GetAccount(hash)?.Contract?.Script; + uint base_exec_fee = NativeContract.Policy.GetBaseExecFee(snapshot); if (witness_script is null && tx.Witnesses != null) { @@ -411,19 +412,19 @@ public long CalculateNetworkFee(StoreView snapshot, Transaction tx) else if (witness_script.IsSignatureContract()) { size += 67 + witness_script.GetVarSize(); - networkFee += ApplicationEngine.OpCodePrices[OpCode.PUSHDATA1] + ApplicationEngine.OpCodePrices[OpCode.PUSHDATA1] + ApplicationEngine.OpCodePrices[OpCode.PUSHNULL] + ApplicationEngine.ECDsaVerifyPrice; + networkFee += base_exec_fee * (ApplicationEngine.OpCodePrices[OpCode.PUSHDATA1] + ApplicationEngine.OpCodePrices[OpCode.PUSHDATA1] + ApplicationEngine.OpCodePrices[OpCode.PUSHNULL]) + ApplicationEngine.ECDsaVerifyPrice; } else if (witness_script.IsMultiSigContract(out int m, out int n)) { int size_inv = 66 * m; size += IO.Helper.GetVarSize(size_inv) + size_inv + witness_script.GetVarSize(); - networkFee += ApplicationEngine.OpCodePrices[OpCode.PUSHDATA1] * m; + networkFee += base_exec_fee * ApplicationEngine.OpCodePrices[OpCode.PUSHDATA1] * m; using (ScriptBuilder sb = new ScriptBuilder()) - networkFee += ApplicationEngine.OpCodePrices[(OpCode)sb.EmitPush(m).ToArray()[0]]; - networkFee += ApplicationEngine.OpCodePrices[OpCode.PUSHDATA1] * n; + networkFee += base_exec_fee * ApplicationEngine.OpCodePrices[(OpCode)sb.EmitPush(m).ToArray()[0]]; + networkFee += base_exec_fee * ApplicationEngine.OpCodePrices[OpCode.PUSHDATA1] * n; using (ScriptBuilder sb = new ScriptBuilder()) - networkFee += ApplicationEngine.OpCodePrices[(OpCode)sb.EmitPush(n).ToArray()[0]]; - networkFee += ApplicationEngine.OpCodePrices[OpCode.PUSHNULL] + ApplicationEngine.ECDsaVerifyPrice * n; + networkFee += base_exec_fee * ApplicationEngine.OpCodePrices[(OpCode)sb.EmitPush(n).ToArray()[0]]; + networkFee += base_exec_fee * ApplicationEngine.OpCodePrices[OpCode.PUSHNULL] + ApplicationEngine.ECDsaVerifyPrice * n; } else { diff --git a/tests/neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs b/tests/neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs index c8e4c4e028..8a7b4c921b 100644 --- a/tests/neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs +++ b/tests/neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs @@ -176,9 +176,9 @@ public void FeeIsMultiSigContract() } var sizeGas = tx.Size * NativeContract.Policy.GetFeePerByte(snapshot); - Assert.AreEqual(2000810, verificationGas); + Assert.AreEqual(2001020, verificationGas); Assert.AreEqual(347000, sizeGas); - Assert.AreEqual(2347810, tx.NetworkFee); + Assert.AreEqual(2348020, tx.NetworkFee); } } @@ -219,7 +219,7 @@ public void FeeIsSignatureContractDetailed() Assert.IsNull(tx.Witnesses); // check pre-computed network fee (already guessing signature sizes) - tx.NetworkFee.Should().Be(1244390L); + tx.NetworkFee.Should().Be(1244420L); // ---- // Sign @@ -256,7 +256,6 @@ public void FeeIsSignatureContractDetailed() verificationGas += engine.GasConsumed; } } - Assert.AreEqual(verificationGas, 1000390); // ------------------ // check tx_size cost @@ -285,7 +284,7 @@ public void FeeIsSignatureContractDetailed() // final check: verification_cost and tx_size Assert.AreEqual(244000, sizeGas); - Assert.AreEqual(1000390, verificationGas); + Assert.AreEqual(1000420, verificationGas); // final assert Assert.AreEqual(tx.NetworkFee, verificationGas + sizeGas); @@ -372,7 +371,7 @@ public void FeeIsSignatureContract_TestScope_Global() // get sizeGas var sizeGas = tx.Size * NativeContract.Policy.GetFeePerByte(snapshot); // final check on sum: verification_cost + tx_size - Assert.AreEqual(1244390, verificationGas + sizeGas); + Assert.AreEqual(1244420, verificationGas + sizeGas); // final assert Assert.AreEqual(tx.NetworkFee, verificationGas + sizeGas); } @@ -459,7 +458,7 @@ public void FeeIsSignatureContract_TestScope_CurrentHash_GAS() // get sizeGas var sizeGas = tx.Size * NativeContract.Policy.GetFeePerByte(snapshot); // final check on sum: verification_cost + tx_size - Assert.AreEqual(1265390, verificationGas + sizeGas); + Assert.AreEqual(1265420, verificationGas + sizeGas); // final assert Assert.AreEqual(tx.NetworkFee, verificationGas + sizeGas); } @@ -549,7 +548,7 @@ public void FeeIsSignatureContract_TestScope_CalledByEntry_Plus_GAS() // get sizeGas var sizeGas = tx.Size * NativeContract.Policy.GetFeePerByte(snapshot); // final check on sum: verification_cost + tx_size - Assert.AreEqual(1265390, verificationGas + sizeGas); + Assert.AreEqual(1265420, verificationGas + sizeGas); // final assert Assert.AreEqual(tx.NetworkFee, verificationGas + sizeGas); } @@ -691,7 +690,7 @@ public void FeeIsSignatureContract_TestScope_CurrentHash_NEO_GAS() // get sizeGas var sizeGas = tx.Size * NativeContract.Policy.GetFeePerByte(snapshot); // final check on sum: verification_cost + tx_size - Assert.AreEqual(1285390, verificationGas + sizeGas); + Assert.AreEqual(1285420, verificationGas + sizeGas); // final assert Assert.AreEqual(tx.NetworkFee, verificationGas + sizeGas); } @@ -1041,7 +1040,7 @@ public void FeeIsSignatureContract_TestScope_FeeOnly_Default() // get sizeGas var sizeGas = tx.Size * NativeContract.Policy.GetFeePerByte(snapshot); // final check on sum: verification_cost + tx_size - Assert.AreEqual(1244390, verificationGas + sizeGas); + Assert.AreEqual(1244420, verificationGas + sizeGas); // final assert Assert.AreEqual(tx.NetworkFee, verificationGas + sizeGas); }