diff --git a/src/neo/Ledger/Blockchain.cs b/src/neo/Ledger/Blockchain.cs index 3c27ecfacc..50e3a66944 100644 --- a/src/neo/Ledger/Blockchain.cs +++ b/src/neo/Ledger/Blockchain.cs @@ -100,7 +100,7 @@ static Blockchain() } using (ScriptBuilder sb = new ScriptBuilder()) { - foreach (NativeContract contract in new NativeContract[] { NativeContract.Oracle }) + foreach (NativeContract contract in new NativeContract[] { NativeContract.NEO, NativeContract.Oracle }) { sb.EmitAppCall(contract.Hash, "postPersist"); sb.Emit(OpCode.DROP); @@ -477,9 +477,8 @@ private void Persist(Block block) } } snapshot.BlockHashIndex.GetAndChange().Set(block); - if (block.Index > 0) + using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.System, null, snapshot)) { - using ApplicationEngine engine = ApplicationEngine.Create(TriggerType.System, null, snapshot); engine.LoadScript(postPersistScript); if (engine.Execute() != VMState.HALT) throw new InvalidOperationException(); ApplicationExecuted application_executed = new ApplicationExecuted(engine); diff --git a/src/neo/SmartContract/Native/Tokens/NeoToken.cs b/src/neo/SmartContract/Native/Tokens/NeoToken.cs index 4dd5983fa8..ea8c399c3f 100644 --- a/src/neo/SmartContract/Native/Tokens/NeoToken.cs +++ b/src/neo/SmartContract/Native/Tokens/NeoToken.cs @@ -106,19 +106,23 @@ protected override void OnPersist(ApplicationEngine engine) { base.OnPersist(engine); + // Set next validators + + StorageItem storage = engine.Snapshot.Storages.GetAndChange(CreateStorageKey(Prefix_NextValidators), () => new StorageItem()); + storage.Value = GetValidators(engine.Snapshot).ToByteArray(); + } + + protected override void PostPersist(ApplicationEngine engine) + { + base.PostPersist(engine); + // Distribute GAS for committee int index = (int)(engine.Snapshot.PersistingBlock.Index % (uint)ProtocolSettings.Default.CommitteeMembersCount); var gasPerBlock = GetGasPerBlock(engine.Snapshot); - var committee = GetCommitteeMembers(engine.Snapshot).ToArray(); - var pubkey = committee.OrderBy(p => p).ElementAt(index); + var pubkey = GetCommittee(engine.Snapshot)[index]; var account = Contract.CreateSignatureRedeemScript(pubkey).ToScriptHash(); GAS.Mint(engine, account, gasPerBlock * CommitteeRewardRatio / 100); - - // Set next validators - - StorageItem storage = engine.Snapshot.Storages.GetAndChange(CreateStorageKey(Prefix_NextValidators), () => new StorageItem()); - storage.Value = committee.Take(ProtocolSettings.Default.ValidatorsCount).OrderBy(p => p).ToArray().ToByteArray(); } [ContractMethod(0_05000000, CallFlags.AllowModifyStates)] diff --git a/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_GasToken.cs b/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_GasToken.cs index 0a25d9973a..37871e87c8 100644 --- a/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_GasToken.cs +++ b/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_GasToken.cs @@ -44,7 +44,7 @@ public void Check_BalanceOfTransferAndBurn() var keyCount = snapshot.Storages.GetChangeSet().Count(); var supply = NativeContract.GAS.TotalSupply(snapshot); - supply.Should().Be(3000000000000000); + supply.Should().Be(3000000025000000); // 3000000000000000 + 25000000 (neo holder reward) // Check unclaim @@ -68,7 +68,7 @@ public void Check_BalanceOfTransferAndBurn() unclaim.State.Should().BeTrue(); supply = NativeContract.GAS.TotalSupply(snapshot); - supply.Should().Be(3000050000000000); + supply.Should().Be(3000050025000000); snapshot.Storages.GetChangeSet().Count().Should().Be(keyCount + 3); // Gas diff --git a/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs b/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs index 37a7772920..066a7911f5 100644 --- a/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs +++ b/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs @@ -393,11 +393,11 @@ public void Check_BalanceOf() public void Check_CommitteeBonus() { var snapshot = Blockchain.Singleton.GetSnapshot(); - snapshot.PersistingBlock = new Block { Index = 0 }; + snapshot.PersistingBlock = new Block { Index = 1 }; using (ScriptBuilder sb = new ScriptBuilder()) { - sb.EmitAppCall(NativeContract.NEO.Hash, "onPersist"); + sb.EmitAppCall(NativeContract.NEO.Hash, "postPersist"); sb.Emit(OpCode.RET); ApplicationEngine engine = ApplicationEngine.Create(TriggerType.System, null, snapshot, (long)(20 * NativeContract.GAS.Factor)); engine.LoadScript(sb.ToArray()); @@ -406,7 +406,8 @@ public void Check_CommitteeBonus() var committee = Blockchain.StandbyCommittee.OrderBy(p => p).ToArray(); NativeContract.GAS.BalanceOf(snapshot, Contract.CreateSignatureContract(committee[0]).ScriptHash.ToArray()).Should().Be(25000000); - NativeContract.GAS.BalanceOf(snapshot, Contract.CreateSignatureContract(committee[1]).ScriptHash.ToArray()).Should().Be(0); + NativeContract.GAS.BalanceOf(snapshot, Contract.CreateSignatureContract(committee[1]).ScriptHash.ToArray()).Should().Be(25000000); + NativeContract.GAS.BalanceOf(snapshot, Contract.CreateSignatureContract(committee[2]).ScriptHash.ToArray()).Should().Be(0); } }