state.rs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. use std::{any::Any, collections::HashMap};
  2. use darkfi_serial::{SerialDecodable, SerialEncodable};
  3. use incrementalmerkletree::{bridgetree::BridgeTree, Tree};
  4. use pasta_curves::{group::Group, pallas};
  5. use darkfi::crypto::{constants::MERKLE_DEPTH, merkle_node::MerkleNode, nullifier::Nullifier};
  6. use crate::util::HashableBase;
  7. #[derive(Clone, SerialEncodable, SerialDecodable)]
  8. pub struct DaoBulla(pub pallas::Base);
  9. type MerkleTree = BridgeTree<MerkleNode, MERKLE_DEPTH>;
  10. pub struct ProposalVotes {
  11. // TODO: might be more logical to have 'yes_votes_commit' and 'no_votes_commit'
  12. /// Weighted vote commit
  13. pub yes_votes_commit: pallas::Point,
  14. /// All value staked in the vote
  15. pub all_votes_commit: pallas::Point,
  16. /// Vote nullifiers
  17. pub vote_nulls: Vec<Nullifier>,
  18. }
  19. impl ProposalVotes {
  20. pub fn nullifier_exists(&self, nullifier: &Nullifier) -> bool {
  21. self.vote_nulls.iter().any(|n| n == nullifier)
  22. }
  23. }
  24. /// This DAO state is for all DAOs on the network. There should only be a single instance.
  25. pub struct State {
  26. dao_bullas: Vec<DaoBulla>,
  27. pub dao_tree: MerkleTree,
  28. pub dao_roots: Vec<MerkleNode>,
  29. //proposal_bullas: Vec<pallas::Base>,
  30. pub proposal_tree: MerkleTree,
  31. pub proposal_roots: Vec<MerkleNode>,
  32. pub proposal_votes: HashMap<HashableBase, ProposalVotes>,
  33. }
  34. impl State {
  35. pub fn new() -> Box<dyn Any + Send> {
  36. Box::new(Self {
  37. dao_bullas: Vec::new(),
  38. dao_tree: MerkleTree::new(100),
  39. dao_roots: Vec::new(),
  40. //proposal_bullas: Vec::new(),
  41. proposal_tree: MerkleTree::new(100),
  42. proposal_roots: Vec::new(),
  43. proposal_votes: HashMap::new(),
  44. })
  45. }
  46. pub fn add_dao_bulla(&mut self, bulla: DaoBulla) {
  47. let node = MerkleNode(bulla.0);
  48. self.dao_bullas.push(bulla);
  49. self.dao_tree.append(&node);
  50. self.dao_roots.push(self.dao_tree.root(0).unwrap());
  51. }
  52. pub fn add_proposal_bulla(&mut self, bulla: pallas::Base) {
  53. let node = MerkleNode(bulla);
  54. //self.proposal_bullas.push(bulla);
  55. self.proposal_tree.append(&node);
  56. self.proposal_roots.push(self.proposal_tree.root(0).unwrap());
  57. self.proposal_votes.insert(
  58. HashableBase(bulla),
  59. ProposalVotes {
  60. yes_votes_commit: pallas::Point::identity(),
  61. all_votes_commit: pallas::Point::identity(),
  62. vote_nulls: Vec::new(),
  63. },
  64. );
  65. }
  66. pub fn lookup_proposal_votes(&self, proposal_bulla: pallas::Base) -> Option<&ProposalVotes> {
  67. self.proposal_votes.get(&HashableBase(proposal_bulla))
  68. }
  69. pub fn lookup_proposal_votes_mut(
  70. &mut self,
  71. proposal_bulla: pallas::Base,
  72. ) -> Option<&mut ProposalVotes> {
  73. self.proposal_votes.get_mut(&HashableBase(proposal_bulla))
  74. }
  75. pub fn is_valid_dao_merkle(&self, root: &MerkleNode) -> bool {
  76. self.dao_roots.iter().any(|m| m == root)
  77. }
  78. // TODO: This never gets called.
  79. pub fn _is_valid_proposal_merkle(&self, root: &MerkleNode) -> bool {
  80. self.proposal_roots.iter().any(|m| m == root)
  81. }
  82. }