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); }
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); }
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); }