whisky_csl/tx_parser/
required_signatures.rs

1use std::collections::HashSet;
2
3use crate::{blake2b256, csl};
4use whisky_common::WError;
5
6use super::TxParser;
7
8impl TxParser {
9    pub fn required_signatures(&mut self) -> Result<Vec<String>, WError> {
10        let mut required_signer_hashes = vec![];
11        let required_signers_key_hashes = self
12            .csl_tx_body
13            .required_signers()
14            .unwrap_or(csl::Ed25519KeyHashes::new());
15        for i in 0..required_signers_key_hashes.len() {
16            let signer = required_signers_key_hashes.get(i);
17            required_signer_hashes.push(signer.to_hex())
18        }
19        self.tx_body.required_signatures = required_signer_hashes.clone();
20        Ok(required_signer_hashes)
21    }
22
23    pub fn check_all_required_signers(&self) -> bool {
24        let signers = &self.tx_body.required_signatures;
25        let mut signer_set: HashSet<String> = HashSet::new();
26        let fixed_tx = csl::FixedTransaction::from_hex(&self.tx_hex).unwrap();
27        for signer in signers {
28            signer_set.insert(signer.clone());
29        }
30        // for i in 0..signers.len() {
31        //     signer_set.insert(signers.get(i));
32        // }
33        let csl_vkeys = self
34            .csl_witness_set
35            .vkeys()
36            .unwrap_or(csl::Vkeywitnesses::new());
37        for i in 0..csl_vkeys.len() {
38            let vkey_witness = csl_vkeys.get(i);
39            let pub_key = vkey_witness.vkey().public_key();
40            if !pub_key.verify(&blake2b256(&fixed_tx.raw_body()), &vkey_witness.signature()) {
41                return false;
42            } else {
43                signer_set.remove(&pub_key.hash().to_hex());
44            };
45        }
46        signer_set.is_empty()
47    }
48}