예제 #1
0
        public void Add(AuditorResultMessage resultMessage, RawPubKey auditor)
        {
            if (!pendingAggregates.TryGetValue(resultMessage.Apex, out var aggregate))
            {
                return;
            }

            //add the signature to the aggregate
            aggregate.Add(resultMessage, auditor);
        }
예제 #2
0
            public void Add(AuditorResultMessage result, RawPubKey auditor)
            {
                lock (syncRoot)
                {
                    if (IsProcessed || processedAuditors.Any(a => a.Equals(auditor)))
                    {
                        return;
                    }

                    processedAuditors.Add(auditor);

                    var signature = new Ed25519Signature {
                        Signature = result.Signature, Signer = auditor
                    };
                    if (signature.IsValid(resultMessageItem.Hash) &&
                        !(resultMessageItem.IsTxResultMessage && result.TxSignature == null))
                    {
                        resultMessageItem.ResultEnvelope.Signatures.Add(signature);
                        if (resultMessageItem.IsTxResultMessage)
                        {
                            var txSignature = new Ed25519Signature {
                                Signature = result.TxSignature, Signer = auditor
                            };
                            ((ITransactionResultMessage)resultMessageItem.ResultMessage).TxSignatures.Add(txSignature);
                        }
                    }
                    var majorityResult = CheckMajority();
                    if (majorityResult == MajorityResults.Unknown)
                    {
                        return;
                    }

                    OnResult(majorityResult);
                    resultManager.Remove(resultMessageItem.Apex);
                    IsProcessed = true;
                }
            }