state.rs 3.1 KB

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