From 885333da79d22dd8e39bcbcb69e391321cbe9027 Mon Sep 17 00:00:00 2001 From: Tommo-L Date: Fri, 28 Aug 2020 10:59:57 +0800 Subject: [PATCH 1/5] fix incentive for committee --- src/neo/SmartContract/Native/Tokens/NeoToken.cs | 8 ++++++++ .../SmartContract/Native/Tokens/UT_NeoToken.cs | 5 +++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/neo/SmartContract/Native/Tokens/NeoToken.cs b/src/neo/SmartContract/Native/Tokens/NeoToken.cs index c84e04977e..46a52580ac 100644 --- a/src/neo/SmartContract/Native/Tokens/NeoToken.cs +++ b/src/neo/SmartContract/Native/Tokens/NeoToken.cs @@ -111,6 +111,14 @@ protected override void OnPersist(ApplicationEngine engine) var pubkey = committee.OrderBy(p => p).ElementAt(index); var account = Contract.CreateSignatureRedeemScript(pubkey).ToScriptHash(); GAS.Mint(engine, account, gasPerBlock * CommitteeRewardRatio / 100); + if (engine.Snapshot.PersistingBlock.Index == 1) + { + // Genesis block reward + + pubkey = committee.OrderBy(p => p).ElementAt(0); + account = Contract.CreateSignatureRedeemScript(pubkey).ToScriptHash(); + GAS.Mint(engine, account, gasPerBlock * CommitteeRewardRatio / 100); + } // Set next validators diff --git a/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs b/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs index 37a7772920..bc0e9e8c65 100644 --- a/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs +++ b/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs @@ -393,7 +393,7 @@ 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()) { @@ -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); } } From c62deeeaaf78b6b56af12ea5e6eef6533f8078b7 Mon Sep 17 00:00:00 2001 From: Tommo-L Date: Thu, 3 Sep 2020 15:26:53 +0800 Subject: [PATCH 2/5] fix --- src/neo/Ledger/Blockchain.cs | 3 +-- .../SmartContract/Native/Tokens/NeoToken.cs | 24 +++++++++---------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/neo/Ledger/Blockchain.cs b/src/neo/Ledger/Blockchain.cs index f186d9363f..fedeeaffbe 100644 --- a/src/neo/Ledger/Blockchain.cs +++ b/src/neo/Ledger/Blockchain.cs @@ -98,7 +98,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); @@ -464,7 +464,6 @@ private void Persist(Block block) } } snapshot.BlockHashIndex.GetAndChange().Set(block); - if (block.Index > 0) { using ApplicationEngine engine = ApplicationEngine.Create(TriggerType.System, null, snapshot); engine.LoadScript(postPersistScript); diff --git a/src/neo/SmartContract/Native/Tokens/NeoToken.cs b/src/neo/SmartContract/Native/Tokens/NeoToken.cs index 18d17396f8..1fcf4c25ee 100644 --- a/src/neo/SmartContract/Native/Tokens/NeoToken.cs +++ b/src/neo/SmartContract/Native/Tokens/NeoToken.cs @@ -106,6 +106,17 @@ protected override void OnPersist(ApplicationEngine engine) { base.OnPersist(engine); + // Set next validators + + var committee = GetCommitteeMembers(engine.Snapshot).ToArray(); + StorageItem storage = engine.Snapshot.Storages.GetAndChange(CreateStorageKey(Prefix_NextValidators), () => new StorageItem()); + storage.Value = committee.Take(ProtocolSettings.Default.ValidatorsCount).OrderBy(p => p).ToArray().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); @@ -114,19 +125,6 @@ protected override void OnPersist(ApplicationEngine engine) var pubkey = committee.OrderBy(p => p).ElementAt(index); var account = Contract.CreateSignatureRedeemScript(pubkey).ToScriptHash(); GAS.Mint(engine, account, gasPerBlock * CommitteeRewardRatio / 100); - if (engine.Snapshot.PersistingBlock.Index == 1) - { - // Genesis block reward - - pubkey = committee.OrderBy(p => p).ElementAt(0); - 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)] From a8b3f54b2a012cc5f158aa694d596a5cf1e157ea Mon Sep 17 00:00:00 2001 From: erikzhang Date: Thu, 3 Sep 2020 15:46:45 +0800 Subject: [PATCH 3/5] Update Blockchain.cs --- src/neo/Ledger/Blockchain.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/neo/Ledger/Blockchain.cs b/src/neo/Ledger/Blockchain.cs index fedeeaffbe..a792c751f1 100644 --- a/src/neo/Ledger/Blockchain.cs +++ b/src/neo/Ledger/Blockchain.cs @@ -464,8 +464,8 @@ private void Persist(Block block) } } snapshot.BlockHashIndex.GetAndChange().Set(block); + using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.System, null, snapshot)) { - using ApplicationEngine engine = ApplicationEngine.Create(TriggerType.System, null, snapshot); engine.LoadScript(postPersistScript); if (engine.Execute() != VMState.HALT) throw new InvalidOperationException(); ApplicationExecuted application_executed = new ApplicationExecuted(engine); From d234d13e2ec2d5e377ba23d821fc8e93b6b9b216 Mon Sep 17 00:00:00 2001 From: erikzhang Date: Thu, 3 Sep 2020 15:57:09 +0800 Subject: [PATCH 4/5] Update NeoToken.cs --- src/neo/SmartContract/Native/Tokens/NeoToken.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/neo/SmartContract/Native/Tokens/NeoToken.cs b/src/neo/SmartContract/Native/Tokens/NeoToken.cs index 1fcf4c25ee..ea8c399c3f 100644 --- a/src/neo/SmartContract/Native/Tokens/NeoToken.cs +++ b/src/neo/SmartContract/Native/Tokens/NeoToken.cs @@ -108,9 +108,8 @@ protected override void OnPersist(ApplicationEngine engine) // Set next validators - var committee = GetCommitteeMembers(engine.Snapshot).ToArray(); StorageItem storage = engine.Snapshot.Storages.GetAndChange(CreateStorageKey(Prefix_NextValidators), () => new StorageItem()); - storage.Value = committee.Take(ProtocolSettings.Default.ValidatorsCount).OrderBy(p => p).ToArray().ToByteArray(); + storage.Value = GetValidators(engine.Snapshot).ToByteArray(); } protected override void PostPersist(ApplicationEngine engine) @@ -121,8 +120,7 @@ protected override void PostPersist(ApplicationEngine engine) 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); } From a13ba7502632f063b7a99d4b140090c71f01b1c6 Mon Sep 17 00:00:00 2001 From: Tommo-L Date: Thu, 3 Sep 2020 17:00:28 +0800 Subject: [PATCH 5/5] fix ut --- .../neo.UnitTests/SmartContract/Native/Tokens/UT_GasToken.cs | 4 ++-- .../neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) 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 bc0e9e8c65..066a7911f5 100644 --- a/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs +++ b/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs @@ -397,7 +397,7 @@ public void Check_CommitteeBonus() 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());