/// <summary> /// Update the candidate information,if it's not evil node. /// </summary> /// <param name="input">UpdateCandidateInformationInput</param> /// <returns></returns> public override Empty UpdateCandidateInformation(UpdateCandidateInformationInput input) { var candidateInformation = State.CandidateInformationMap[input.Pubkey]; if (input.IsEvilNode) { var publicKeyByte = ByteArrayHelper.HexStringToByteArray(input.Pubkey); State.BlackList.Value.Value.Add(ByteString.CopyFrom(publicKeyByte)); State.ProfitContract.RemoveBeneficiary.Send(new RemoveBeneficiaryInput { SchemeId = State.SubsidyHash.Value, Beneficiary = Address.FromPublicKey(publicKeyByte) }); Context.LogDebug(() => $"Marked {input.Pubkey.Substring(0, 10)} as an evil node."); // TODO: Set to null. State.CandidateInformationMap[input.Pubkey] = new CandidateInformation(); var candidates = State.Candidates.Value; candidates.Value.Remove(ByteString.CopyFrom(publicKeyByte)); State.Candidates.Value = candidates; return(new Empty()); } candidateInformation.ProducedBlocks = candidateInformation.ProducedBlocks.Add(input.RecentlyProducedBlocks); candidateInformation.MissedTimeSlots = candidateInformation.MissedTimeSlots.Add(input.RecentlyMissedTimeSlots); State.CandidateInformationMap[input.Pubkey] = candidateInformation; return(new Empty()); }
/// <summary> /// Update the candidate information,if it's not evil node. /// </summary> /// <param name="input">UpdateCandidateInformationInput</param> /// <returns></returns> public override Empty UpdateCandidateInformation(UpdateCandidateInformationInput input) { Assert( Context.GetContractAddressByName(SmartContractConstants.ConsensusContractSystemName) == Context.Sender, "Only consensus contract can update candidate information."); var candidateInformation = State.CandidateInformationMap[input.Pubkey]; if (candidateInformation == null) { return(new Empty()); } if (input.IsEvilNode) { var publicKeyByte = ByteArrayHelper.HexStringToByteArray(input.Pubkey); State.BlackList.Value.Value.Add(ByteString.CopyFrom(publicKeyByte)); if (State.ProfitContract.Value == null) { State.ProfitContract.Value = Context.GetContractAddressByName(SmartContractConstants.ProfitContractSystemName); } State.ProfitContract.RemoveBeneficiary.Send(new RemoveBeneficiaryInput { SchemeId = State.SubsidyHash.Value, Beneficiary = Address.FromPublicKey(publicKeyByte) }); Context.LogDebug(() => $"Marked {input.Pubkey.Substring(0, 10)} as an evil node."); Context.Fire(new EvilMinerDetected { Pubkey = input.Pubkey }); State.CandidateInformationMap.Remove(input.Pubkey); var candidates = State.Candidates.Value; candidates.Value.Remove(ByteString.CopyFrom(publicKeyByte)); State.Candidates.Value = candidates; return(new Empty()); } candidateInformation.ProducedBlocks = candidateInformation.ProducedBlocks.Add(input.RecentlyProducedBlocks); candidateInformation.MissedTimeSlots = candidateInformation.MissedTimeSlots.Add(input.RecentlyMissedTimeSlots); State.CandidateInformationMap[input.Pubkey] = candidateInformation; return(new Empty()); }