harness.rs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. /* This file is part of DarkFi (https://dark.fi)
  2. *
  3. * Copyright (C) 2020-2023 Dyne.org foundation
  4. *
  5. * This program is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU Affero General Public License as
  7. * published by the Free Software Foundation, either version 3 of the
  8. * License, or (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU Affero General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU Affero General Public License
  16. * along with this program. If not, see <https://www.gnu.org/licenses/>.
  17. */
  18. use std::collections::HashMap;
  19. use darkfi::{
  20. blockchain::BlockInfo,
  21. runtime::vm_runtime::SMART_CONTRACT_ZKAS_DB_NAME,
  22. util::time::TimeKeeper,
  23. validator::{Validator, ValidatorConfig, ValidatorPtr},
  24. zk::{empty_witnesses, ProvingKey, ZkCircuit},
  25. zkas::ZkBinary,
  26. Result,
  27. };
  28. use darkfi_sdk::crypto::{
  29. pasta_prelude::*, ContractId, Keypair, DAO_CONTRACT_ID, MONEY_CONTRACT_ID,
  30. };
  31. use darkfi_serial::{deserialize, serialize};
  32. use log::{info, warn};
  33. use rand::rngs::OsRng;
  34. use darkfi_money_contract::{MONEY_CONTRACT_ZKAS_BURN_NS_V1, MONEY_CONTRACT_ZKAS_MINT_NS_V1};
  35. use darkfi_dao_contract::{
  36. DAO_CONTRACT_ZKAS_DAO_EXEC_NS, DAO_CONTRACT_ZKAS_DAO_MINT_NS,
  37. DAO_CONTRACT_ZKAS_DAO_PROPOSE_BURN_NS, DAO_CONTRACT_ZKAS_DAO_PROPOSE_MAIN_NS,
  38. DAO_CONTRACT_ZKAS_DAO_VOTE_BURN_NS, DAO_CONTRACT_ZKAS_DAO_VOTE_MAIN_NS,
  39. };
  40. pub fn init_logger() -> Result<()> {
  41. let mut cfg = simplelog::ConfigBuilder::new();
  42. cfg.add_filter_ignore("sled".to_string());
  43. if let Err(_) = simplelog::TermLogger::init(
  44. //simplelog::LevelFilter::Info,
  45. simplelog::LevelFilter::Debug,
  46. //simplelog::LevelFilter::Trace,
  47. cfg.build(),
  48. simplelog::TerminalMode::Mixed,
  49. simplelog::ColorChoice::Auto,
  50. ) {
  51. warn!(target: "dao", "Logger already initialized");
  52. }
  53. Ok(())
  54. }
  55. pub struct DaoTestHarness {
  56. /// Minting all new coins
  57. pub faucet_kp: Keypair,
  58. /// Governance token holder 1
  59. pub alice_kp: Keypair,
  60. /// Governance token holder 2
  61. pub bob_kp: Keypair,
  62. /// Governance token holder 3
  63. pub charlie_kp: Keypair,
  64. /// Receiver for treasury tokens
  65. pub rachel_kp: Keypair,
  66. /// DAO keypair
  67. pub dao_kp: Keypair,
  68. pub alice_validator: ValidatorPtr,
  69. pub money_contract_id: ContractId,
  70. pub dao_contract_id: ContractId,
  71. pub proving_keys: HashMap<[u8; 32], Vec<(&'static str, ProvingKey)>>,
  72. pub money_mint_zkbin: ZkBinary,
  73. pub money_mint_pk: ProvingKey,
  74. pub money_burn_zkbin: ZkBinary,
  75. pub money_burn_pk: ProvingKey,
  76. pub dao_mint_zkbin: ZkBinary,
  77. pub dao_mint_pk: ProvingKey,
  78. pub dao_propose_burn_zkbin: ZkBinary,
  79. pub dao_propose_burn_pk: ProvingKey,
  80. pub dao_propose_main_zkbin: ZkBinary,
  81. pub dao_propose_main_pk: ProvingKey,
  82. pub dao_vote_burn_zkbin: ZkBinary,
  83. pub dao_vote_burn_pk: ProvingKey,
  84. pub dao_vote_main_zkbin: ZkBinary,
  85. pub dao_vote_main_pk: ProvingKey,
  86. pub dao_exec_zkbin: ZkBinary,
  87. pub dao_exec_pk: ProvingKey,
  88. }
  89. impl DaoTestHarness {
  90. pub async fn new() -> Result<Self> {
  91. let faucet_kp = Keypair::random(&mut OsRng);
  92. let alice_kp = Keypair::random(&mut OsRng);
  93. let bob_kp = Keypair::random(&mut OsRng);
  94. let charlie_kp = Keypair::random(&mut OsRng);
  95. let rachel_kp = Keypair::random(&mut OsRng);
  96. let dao_kp = Keypair::random(&mut OsRng);
  97. let faucet_pubkeys = vec![faucet_kp.public];
  98. let alice_sled_db = sled::Config::new().temporary(true).open()?;
  99. // NOTE: we are not using consensus constants here so we
  100. // don't get circular dependencies.
  101. let genesis_block = BlockInfo::default();
  102. let time_keeper = TimeKeeper::new(genesis_block.header.timestamp, 10, 90, 0);
  103. let config = ValidatorConfig::new(time_keeper, genesis_block, faucet_pubkeys.to_vec());
  104. let alice_validator = Validator::new(&alice_sled_db, config).await?;
  105. let money_contract_id = *MONEY_CONTRACT_ID;
  106. let dao_contract_id = *DAO_CONTRACT_ID;
  107. let alice_sled = alice_validator.read().await.blockchain.sled_db.clone();
  108. let money_db_handle = alice_validator.read().await.blockchain.contracts.lookup(
  109. &alice_sled,
  110. &money_contract_id,
  111. SMART_CONTRACT_ZKAS_DB_NAME,
  112. )?;
  113. let dao_db_handle = alice_validator.read().await.blockchain.contracts.lookup(
  114. &alice_sled,
  115. &dao_contract_id,
  116. SMART_CONTRACT_ZKAS_DB_NAME,
  117. )?;
  118. info!(target: "dao", "Creating zk proving keys");
  119. macro_rules! mkpk {
  120. ($ns:expr, $db_handle:expr) => {{
  121. let zkas_bytes = $db_handle.get(&serialize(&$ns))?.unwrap();
  122. let (zkbin, _): (Vec<u8>, Vec<u8>) = deserialize(&zkas_bytes)?;
  123. let zkbin = ZkBinary::decode(&zkbin)?;
  124. let witnesses = empty_witnesses(&zkbin);
  125. let circuit = ZkCircuit::new(witnesses, zkbin.clone());
  126. (zkbin, ProvingKey::build(13, &circuit))
  127. }};
  128. }
  129. let (money_mint_zkbin, money_mint_pk) =
  130. mkpk!(MONEY_CONTRACT_ZKAS_MINT_NS_V1, money_db_handle);
  131. let (money_burn_zkbin, money_burn_pk) =
  132. mkpk!(MONEY_CONTRACT_ZKAS_BURN_NS_V1, money_db_handle);
  133. let (dao_mint_zkbin, dao_mint_pk) = mkpk!(DAO_CONTRACT_ZKAS_DAO_MINT_NS, dao_db_handle);
  134. let (dao_propose_burn_zkbin, dao_propose_burn_pk) =
  135. mkpk!(DAO_CONTRACT_ZKAS_DAO_PROPOSE_BURN_NS, dao_db_handle);
  136. let (dao_propose_main_zkbin, dao_propose_main_pk) =
  137. mkpk!(DAO_CONTRACT_ZKAS_DAO_PROPOSE_MAIN_NS, dao_db_handle);
  138. let (dao_vote_burn_zkbin, dao_vote_burn_pk) =
  139. mkpk!(DAO_CONTRACT_ZKAS_DAO_VOTE_BURN_NS, dao_db_handle);
  140. let (dao_vote_main_zkbin, dao_vote_main_pk) =
  141. mkpk!(DAO_CONTRACT_ZKAS_DAO_VOTE_MAIN_NS, dao_db_handle);
  142. let (dao_exec_zkbin, dao_exec_pk) = mkpk!(DAO_CONTRACT_ZKAS_DAO_EXEC_NS, dao_db_handle);
  143. let mut proving_keys = HashMap::<[u8; 32], Vec<(&str, ProvingKey)>>::new();
  144. let pks = vec![
  145. (MONEY_CONTRACT_ZKAS_MINT_NS_V1, money_mint_pk.clone()),
  146. (MONEY_CONTRACT_ZKAS_BURN_NS_V1, money_burn_pk.clone()),
  147. (DAO_CONTRACT_ZKAS_DAO_MINT_NS, dao_mint_pk.clone()),
  148. (DAO_CONTRACT_ZKAS_DAO_PROPOSE_BURN_NS, dao_propose_burn_pk.clone()),
  149. (DAO_CONTRACT_ZKAS_DAO_PROPOSE_MAIN_NS, dao_propose_burn_pk.clone()),
  150. (DAO_CONTRACT_ZKAS_DAO_VOTE_BURN_NS, dao_propose_burn_pk.clone()),
  151. (DAO_CONTRACT_ZKAS_DAO_VOTE_MAIN_NS, dao_propose_burn_pk.clone()),
  152. (DAO_CONTRACT_ZKAS_DAO_EXEC_NS, dao_propose_burn_pk.clone()),
  153. ];
  154. proving_keys.insert(dao_contract_id.inner().to_repr(), pks);
  155. Ok(Self {
  156. faucet_kp,
  157. alice_kp,
  158. bob_kp,
  159. charlie_kp,
  160. rachel_kp,
  161. dao_kp,
  162. alice_validator,
  163. money_contract_id,
  164. dao_contract_id,
  165. proving_keys,
  166. money_mint_pk,
  167. money_mint_zkbin,
  168. money_burn_pk,
  169. money_burn_zkbin,
  170. dao_mint_zkbin,
  171. dao_mint_pk,
  172. dao_propose_burn_zkbin,
  173. dao_propose_burn_pk,
  174. dao_propose_main_zkbin,
  175. dao_propose_main_pk,
  176. dao_vote_burn_zkbin,
  177. dao_vote_burn_pk,
  178. dao_vote_main_zkbin,
  179. dao_vote_main_pk,
  180. dao_exec_zkbin,
  181. dao_exec_pk,
  182. })
  183. }
  184. }