Beispiel #1
0
        public static bool TryGetRequiredValidations(ILedgerState state, TransactionRequiredValidationFactory factory, Transaction transaction, out List <TransactionRequiredValidation> validations)
        {
            var dictionary = new Dictionary <Address, TransactionRequiredValidation>();

            foreach (var input in transaction.GetInputs())
            {
                var address = input.Address;
                if (!dictionary.ContainsKey(address))
                {
                    TransactionRequiredValidation validation;
                    if (!factory.TryGetRequiredValidations(state, input.Address, transaction.Declarations, out validation))
                    {
                        validations = new List <TransactionRequiredValidation>();
                        return(false);
                    }
                    dictionary.Add(address, validation);
                }
            }
            validations = dictionary.Values.ToList();
            return(true);
        }
Beispiel #2
0
        private static bool TryGetRequiredSignatures(ILedgerState state, TransactionRequiredValidationFactory factory, Transaction transaction, out List <TransactionRequiredValidation> list)
        {
            var validations = new Dictionary <string, TransactionRequiredValidation>();

            foreach (var input in transaction.GetInputs())
            {
                if (!validations.ContainsKey(input.Address.Encoded))
                {
                    TransactionRequiredValidation required;
                    if (!factory.TryGetRequiredValidations(state, input.Address, transaction.Declarations, out required))
                    {
                        list = null;
                        return(false);
                    }
                    validations.Add(input.Address.Encoded, required);
                }
            }

            list = validations.Values.ToList();
            return(true);
        }
Beispiel #3
0
        public static bool CheckSignatures(this SignedTransaction transaction, TransactionRequiredValidationFactory factory, Network network, long timestamp, ILedgerState state = null)
        {
            var hash = transaction.Hash;

            // get required signatures
            List <TransactionRequiredValidation> requireds;

            if (!TryGetRequiredValidations(state, factory, transaction.Transaction, out requireds))
            {
                return(false);
            }

            var signatures = transaction.Signatures.Select(signature => new SignatureRequired(signature)).ToList();

            // check required signatures and declarations are set
            foreach (var required in requireds)
            {
                if (!required.IsValid(signatures, transaction.Transaction, timestamp))
                {
                    return(false);
                }
            }

            // TODO we dont accept transactions with useless declarations

            // we try to optimize by checking signatures only at the end
            // verify signatures
            foreach (var signature in signatures)
            {
                // we dont accept transactions with useless signatures
                if (!signature.Required || !signature.Verify(hash, network))
                {
                    return(false);
                }
            }

            return(true);
        }