From df15b6f9c076a240bd72803ab7c9e2064ff7443e Mon Sep 17 00:00:00 2001 From: Luchuan Date: Sat, 22 Aug 2020 16:52:57 +0800 Subject: [PATCH] Add incentive for committee (#1847) --- .../SmartContract/Native/Tokens/NeoToken.cs | 13 +++++++++++- .../Native/Tokens/UT_NeoToken.cs | 21 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/neo/SmartContract/Native/Tokens/NeoToken.cs b/src/neo/SmartContract/Native/Tokens/NeoToken.cs index 01c3311f8d..73cc7aa514 100644 --- a/src/neo/SmartContract/Native/Tokens/NeoToken.cs +++ b/src/neo/SmartContract/Native/Tokens/NeoToken.cs @@ -102,8 +102,19 @@ internal override void Initialize(ApplicationEngine engine) protected override void OnPersist(ApplicationEngine engine) { base.OnPersist(engine); + + // Distribute GAS for committee + + var gasPerBlock = GetGasPerBlock(engine.Snapshot); + var committee = GetCommitteeMembers(engine.Snapshot).ToArray(); + var pubkey = committee[engine.Snapshot.PersistingBlock.Index % ProtocolSettings.Default.CommitteeMembersCount]; + 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 = GetValidators(engine.Snapshot).ToByteArray(); + storage.Value = committee[..ProtocolSettings.Default.ValidatorsCount].ToByteArray(); } [ContractMethod(0_05000000, CallFlags.AllowModifyStates)] diff --git a/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs b/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs index 4fae26a467..e723092325 100644 --- a/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs +++ b/tests/neo.UnitTests/SmartContract/Native/Tokens/UT_NeoToken.cs @@ -389,6 +389,27 @@ public void Check_BalanceOf() NativeContract.NEO.BalanceOf(snapshot, account).Should().Be(0); } + [TestMethod] + public void Check_CommitteeBonus() + { + var snapshot = Blockchain.Singleton.GetSnapshot(); + snapshot.PersistingBlock = new Block { Index = 0 }; + + using (ScriptBuilder sb = new ScriptBuilder()) + { + sb.EmitAppCall(NativeContract.NEO.Hash, "onPersist"); + sb.Emit(OpCode.RET); + ApplicationEngine engine = ApplicationEngine.Create(TriggerType.System, null, snapshot, (long)(20 * NativeContract.GAS.Factor)); + engine.LoadScript(sb.ToArray()); + engine.Execute(); + engine.State.Should().Be(VM.VMState.HALT); + + var committee = Blockchain.StandbyCommittee; + 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); + } + } + [TestMethod] public void Check_Initialize() {