harness.rs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. /* This file is part of DarkFi (https://dark.fi)
  2. *
  3. * Copyright (C) 2020-2022 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. consensus::{
  21. ValidatorState, ValidatorStatePtr, TESTNET_BOOTSTRAP_TIMESTAMP, TESTNET_GENESIS_HASH_BYTES,
  22. TESTNET_GENESIS_TIMESTAMP, TESTNET_INITIAL_DISTRIBUTION,
  23. },
  24. wallet::WalletDb,
  25. zk::{empty_witnesses, ProvingKey, ZkCircuit},
  26. zkas::ZkBinary,
  27. Result,
  28. };
  29. use darkfi_sdk::{
  30. crypto::{pasta_prelude::*, ContractId, Keypair, DAO_CONTRACT_ID, MONEY_CONTRACT_ID},
  31. db::SMART_CONTRACT_ZKAS_DB_NAME,
  32. };
  33. use darkfi_serial::serialize;
  34. use log::{info, warn};
  35. use rand::rngs::OsRng;
  36. use darkfi_money_contract::{MONEY_CONTRACT_ZKAS_BURN_NS_V1, MONEY_CONTRACT_ZKAS_MINT_NS_V1};
  37. use darkfi_dao_contract::{
  38. DAO_CONTRACT_ZKAS_DAO_EXEC_NS, DAO_CONTRACT_ZKAS_DAO_MINT_NS,
  39. DAO_CONTRACT_ZKAS_DAO_PROPOSE_BURN_NS, DAO_CONTRACT_ZKAS_DAO_PROPOSE_MAIN_NS,
  40. DAO_CONTRACT_ZKAS_DAO_VOTE_BURN_NS, DAO_CONTRACT_ZKAS_DAO_VOTE_MAIN_NS,
  41. };
  42. pub fn init_logger() -> Result<()> {
  43. let mut cfg = simplelog::ConfigBuilder::new();
  44. cfg.add_filter_ignore("sled".to_string());
  45. if let Err(_) = simplelog::TermLogger::init(
  46. //simplelog::LevelFilter::Info,
  47. simplelog::LevelFilter::Debug,
  48. //simplelog::LevelFilter::Trace,
  49. cfg.build(),
  50. simplelog::TerminalMode::Mixed,
  51. simplelog::ColorChoice::Auto,
  52. ) {
  53. warn!(target: "dao", "Logger already initialized");
  54. }
  55. Ok(())
  56. }
  57. pub struct DaoTestHarness {
  58. /// Minting all new coins
  59. pub faucet_kp: Keypair,
  60. /// Governance token holder 1
  61. pub alice_kp: Keypair,
  62. /// Governance token holder 2
  63. pub bob_kp: Keypair,
  64. /// Governance token holder 3
  65. pub charlie_kp: Keypair,
  66. /// Receiver for treasury tokens
  67. pub rachel_kp: Keypair,
  68. /// DAO keypair
  69. pub dao_kp: Keypair,
  70. pub alice_state: ValidatorStatePtr,
  71. pub money_contract_id: ContractId,
  72. pub dao_contract_id: ContractId,
  73. pub proving_keys: HashMap<[u8; 32], Vec<(&'static str, ProvingKey)>>,
  74. pub money_mint_zkbin: ZkBinary,
  75. pub money_mint_pk: ProvingKey,
  76. pub money_burn_zkbin: ZkBinary,
  77. pub money_burn_pk: ProvingKey,
  78. pub dao_mint_zkbin: ZkBinary,
  79. pub dao_mint_pk: ProvingKey,
  80. pub dao_propose_burn_zkbin: ZkBinary,
  81. pub dao_propose_burn_pk: ProvingKey,
  82. pub dao_propose_main_zkbin: ZkBinary,
  83. pub dao_propose_main_pk: ProvingKey,
  84. pub dao_vote_burn_zkbin: ZkBinary,
  85. pub dao_vote_burn_pk: ProvingKey,
  86. pub dao_vote_main_zkbin: ZkBinary,
  87. pub dao_vote_main_pk: ProvingKey,
  88. pub dao_exec_zkbin: ZkBinary,
  89. pub dao_exec_pk: ProvingKey,
  90. }
  91. impl DaoTestHarness {
  92. pub async fn new() -> Result<Self> {
  93. let faucet_kp = Keypair::random(&mut OsRng);
  94. let alice_kp = Keypair::random(&mut OsRng);
  95. let bob_kp = Keypair::random(&mut OsRng);
  96. let charlie_kp = Keypair::random(&mut OsRng);
  97. let rachel_kp = Keypair::random(&mut OsRng);
  98. let dao_kp = Keypair::random(&mut OsRng);
  99. let faucet_pubkeys = vec![faucet_kp.public];
  100. let alice_wallet = WalletDb::new("sqlite::memory:", "foo").await?;
  101. let alice_sled_db = sled::Config::new().temporary(true).open()?;
  102. let alice_state = ValidatorState::new(
  103. &alice_sled_db,
  104. *TESTNET_BOOTSTRAP_TIMESTAMP,
  105. *TESTNET_GENESIS_TIMESTAMP,
  106. *TESTNET_GENESIS_HASH_BYTES,
  107. *TESTNET_INITIAL_DISTRIBUTION,
  108. alice_wallet,
  109. faucet_pubkeys,
  110. false,
  111. )
  112. .await?;
  113. let money_contract_id = *MONEY_CONTRACT_ID;
  114. let dao_contract_id = *DAO_CONTRACT_ID;
  115. let alice_sled = alice_state.read().await.blockchain.sled_db.clone();
  116. let money_db_handle = alice_state.read().await.blockchain.contracts.lookup(
  117. &alice_sled,
  118. &money_contract_id,
  119. SMART_CONTRACT_ZKAS_DB_NAME,
  120. )?;
  121. let dao_db_handle = alice_state.read().await.blockchain.contracts.lookup(
  122. &alice_sled,
  123. &dao_contract_id,
  124. SMART_CONTRACT_ZKAS_DB_NAME,
  125. )?;
  126. info!(target: "dao", "Decoding bincode");
  127. let money_mint_zkbin =
  128. money_db_handle.get(&serialize(&MONEY_CONTRACT_ZKAS_MINT_NS_V1))?.unwrap();
  129. let money_mint_zkbin = ZkBinary::decode(&money_mint_zkbin)?;
  130. let money_mint_witnesses = empty_witnesses(&money_mint_zkbin);
  131. let money_mint_circuit = ZkCircuit::new(money_mint_witnesses, money_mint_zkbin.clone());
  132. let money_burn_zkbin =
  133. money_db_handle.get(&serialize(&MONEY_CONTRACT_ZKAS_BURN_NS_V1))?.unwrap();
  134. let money_burn_zkbin = ZkBinary::decode(&money_burn_zkbin)?;
  135. let money_burn_witnesses = empty_witnesses(&money_burn_zkbin);
  136. let money_burn_circuit = ZkCircuit::new(money_burn_witnesses, money_burn_zkbin.clone());
  137. let dao_mint_zkbin =
  138. dao_db_handle.get(&serialize(&DAO_CONTRACT_ZKAS_DAO_MINT_NS))?.unwrap();
  139. let dao_mint_zkbin = ZkBinary::decode(&dao_mint_zkbin)?;
  140. let dao_mint_witnesses = empty_witnesses(&dao_mint_zkbin);
  141. let dao_mint_circuit = ZkCircuit::new(dao_mint_witnesses, dao_mint_zkbin.clone());
  142. let dao_propose_burn_zkbin =
  143. dao_db_handle.get(&serialize(&DAO_CONTRACT_ZKAS_DAO_PROPOSE_BURN_NS))?.unwrap();
  144. let dao_propose_burn_zkbin = ZkBinary::decode(&dao_propose_burn_zkbin)?;
  145. let dao_propose_burn_witnesses = empty_witnesses(&dao_propose_burn_zkbin);
  146. let dao_propose_burn_circuit =
  147. ZkCircuit::new(dao_propose_burn_witnesses, dao_propose_burn_zkbin.clone());
  148. let dao_propose_main_zkbin =
  149. dao_db_handle.get(&serialize(&DAO_CONTRACT_ZKAS_DAO_PROPOSE_MAIN_NS))?.unwrap();
  150. let dao_propose_main_zkbin = ZkBinary::decode(&dao_propose_main_zkbin)?;
  151. let dao_propose_main_witnesses = empty_witnesses(&dao_propose_main_zkbin);
  152. let dao_propose_main_circuit =
  153. ZkCircuit::new(dao_propose_main_witnesses, dao_propose_main_zkbin.clone());
  154. let dao_vote_burn_zkbin =
  155. dao_db_handle.get(&serialize(&DAO_CONTRACT_ZKAS_DAO_VOTE_BURN_NS))?.unwrap();
  156. let dao_vote_burn_zkbin = ZkBinary::decode(&dao_vote_burn_zkbin)?;
  157. let dao_vote_burn_witnesses = empty_witnesses(&dao_vote_burn_zkbin);
  158. let dao_vote_burn_circuit =
  159. ZkCircuit::new(dao_vote_burn_witnesses, dao_vote_burn_zkbin.clone());
  160. let dao_vote_main_zkbin =
  161. dao_db_handle.get(&serialize(&DAO_CONTRACT_ZKAS_DAO_VOTE_MAIN_NS))?.unwrap();
  162. let dao_vote_main_zkbin = ZkBinary::decode(&dao_vote_main_zkbin)?;
  163. let dao_vote_main_witnesses = empty_witnesses(&dao_vote_main_zkbin);
  164. let dao_vote_main_circuit =
  165. ZkCircuit::new(dao_vote_main_witnesses, dao_vote_main_zkbin.clone());
  166. let dao_exec_zkbin =
  167. dao_db_handle.get(&serialize(&DAO_CONTRACT_ZKAS_DAO_EXEC_NS))?.unwrap();
  168. let dao_exec_zkbin = ZkBinary::decode(&dao_exec_zkbin)?;
  169. let dao_exec_witnesses = empty_witnesses(&dao_exec_zkbin);
  170. let dao_exec_circuit = ZkCircuit::new(dao_exec_witnesses, dao_exec_zkbin.clone());
  171. info!(target: "dao", "Creating zk proving keys");
  172. let k = 13;
  173. let mut proving_keys = HashMap::<[u8; 32], Vec<(&str, ProvingKey)>>::new();
  174. let money_mint_pk = ProvingKey::build(k, &money_mint_circuit);
  175. let money_burn_pk = ProvingKey::build(k, &money_burn_circuit);
  176. let dao_mint_pk = ProvingKey::build(k, &dao_mint_circuit);
  177. let dao_propose_burn_pk = ProvingKey::build(k, &dao_propose_burn_circuit);
  178. let dao_propose_main_pk = ProvingKey::build(k, &dao_propose_main_circuit);
  179. let dao_vote_burn_pk = ProvingKey::build(k, &dao_vote_burn_circuit);
  180. let dao_vote_main_pk = ProvingKey::build(k, &dao_vote_main_circuit);
  181. let dao_exec_pk = ProvingKey::build(k, &dao_exec_circuit);
  182. let pks = vec![
  183. (MONEY_CONTRACT_ZKAS_MINT_NS_V1, money_mint_pk.clone()),
  184. (MONEY_CONTRACT_ZKAS_BURN_NS_V1, money_burn_pk.clone()),
  185. (DAO_CONTRACT_ZKAS_DAO_MINT_NS, dao_mint_pk.clone()),
  186. (DAO_CONTRACT_ZKAS_DAO_PROPOSE_BURN_NS, dao_propose_burn_pk.clone()),
  187. (DAO_CONTRACT_ZKAS_DAO_PROPOSE_MAIN_NS, dao_propose_burn_pk.clone()),
  188. (DAO_CONTRACT_ZKAS_DAO_VOTE_BURN_NS, dao_propose_burn_pk.clone()),
  189. (DAO_CONTRACT_ZKAS_DAO_VOTE_MAIN_NS, dao_propose_burn_pk.clone()),
  190. (DAO_CONTRACT_ZKAS_DAO_EXEC_NS, dao_propose_burn_pk.clone()),
  191. ];
  192. proving_keys.insert(dao_contract_id.inner().to_repr(), pks);
  193. Ok(Self {
  194. faucet_kp,
  195. alice_kp,
  196. bob_kp,
  197. charlie_kp,
  198. rachel_kp,
  199. dao_kp,
  200. alice_state,
  201. money_contract_id,
  202. dao_contract_id,
  203. proving_keys,
  204. money_mint_pk,
  205. money_mint_zkbin,
  206. money_burn_pk,
  207. money_burn_zkbin,
  208. dao_mint_zkbin,
  209. dao_mint_pk,
  210. dao_propose_burn_zkbin,
  211. dao_propose_burn_pk,
  212. dao_propose_main_zkbin,
  213. dao_propose_main_pk,
  214. dao_vote_burn_zkbin,
  215. dao_vote_burn_pk,
  216. dao_vote_main_zkbin,
  217. dao_vote_main_pk,
  218. dao_exec_zkbin,
  219. dao_exec_pk,
  220. })
  221. }
  222. }