17 from test_commands
import mock
18 from test_commands
import scenario
20 from os.path
import join, exists
22 from typing
import Dict, List, Any
26 web3: Any, bob: str, alice: str, charlie: str, mixer: str) ->
None:
28 print(f
" Alice : {web3.eth.getBalance(alice)}")
29 print(f
" Bob : {web3.eth.getBalance(bob)}")
30 print(f
" Charlie : {web3.eth.getBalance(charlie)}")
31 print(f
" Mixer : {web3.eth.getBalance(mixer)}")
38 web3, eth = mock.open_test_web3()
41 keystore = mock.init_test_keystore()
43 deployer_eth_address = eth.accounts[0]
44 bob_eth_address = eth.accounts[1]
45 alice_eth_address = eth.accounts[2]
46 charlie_eth_address = eth.accounts[3]
49 prover_client =
ProverClient(mock.TEST_PROVER_SERVER_ENDPOINT)
50 prover_config = prover_client.get_configuration()
51 pp = prover_config.pairing_parameters
52 assert prover_client.get_configuration().zksnark_name == zksnark_name
55 tree_depth = zeth.core.constants.ZETH_MERKLE_TREE_DEPTH
56 zeth_client, _contract_desc = MixerClient.deploy(
71 tree_depth, tree_hash)
72 mixer_instance = zeth_client.mixer_instance
75 def _mk_wallet(name: str, sk: ZethAddressPriv) -> Wallet:
76 wallet_dir = join(mock.TEST_NOTE_DIR, name +
"-eth")
77 if exists(wallet_dir):
80 shutil.rmtree(wallet_dir)
81 return Wallet(mixer_instance, name, wallet_dir, sk, tree_hash)
83 sk_alice = keystore[
'Alice'].addr_sk
84 sk_bob = keystore[
'Bob'].addr_sk
85 sk_charlie = keystore[
'Charlie'].addr_sk
86 alice_wallet = _mk_wallet(
'alice', sk_alice)
87 bob_wallet = _mk_wallet(
'bob', sk_bob)
88 charlie_wallet = _mk_wallet(
'charlie', sk_charlie)
93 out_ev: List[MixOutputEvents]) \
94 -> Dict[str, List[ZethNoteDescription]]:
97 'alice': alice_wallet.receive_notes(out_ev, pp),
98 'bob': bob_wallet.receive_notes(out_ev, pp),
99 'charlie': charlie_wallet.receive_notes(out_ev, pp),
101 alice_wallet.update_and_save_state(block_num)
102 bob_wallet.update_and_save_state(block_num)
103 charlie_wallet.update_and_save_state(block_num)
104 block_num = block_num + 1
107 print(
"[INFO] 4. Running tests (asset mixed: Ether)...")
108 print(
"- Initial balances: ")
114 zeth_client.mixer_instance.address)
117 result_deposit_bob_to_bob = scenario.bob_deposit(
124 print(
"- Balances after Bob's deposit: ")
130 zeth_client.mixer_instance.address
136 recovered_notes = _receive_notes(result_deposit_bob_to_bob.output_events)
137 assert(len(recovered_notes[
'alice']) == 0), \
138 "Alice decrypted a ciphertext that was not encrypted with her key!"
144 assert(len(recovered_notes[
'bob']) == 2), \
145 f
"Bob recovered {len(recovered_notes['bob'])} notes, expected 2"
148 result_transfer_bob_to_charlie = scenario.bob_to_charlie(
152 recovered_notes[
'bob'][0].as_input(),
157 result_double_spending =
None
159 result_double_spending = scenario.bob_to_charlie(
163 recovered_notes[
'bob'][0].as_input(),
166 except Exception
as e:
167 print(f
"Bob's double spending successfully rejected! (msg: {e})")
168 assert(result_double_spending
is None), \
169 "Bob managed to spend the same note twice!"
171 print(
"- Balances after Bob's transfer to Charlie: ")
177 zeth_client.mixer_instance.address
181 recovered_notes = _receive_notes(
182 result_transfer_bob_to_charlie.output_events)
183 notes_charlie = recovered_notes[
'charlie']
184 assert(len(notes_charlie) == 1), \
185 f
"Charlie decrypted {len(notes_charlie)}. Expected 1!"
187 input_charlie_withdraw = notes_charlie[0]
189 charlie_balance_before_withdrawal = eth.getBalance(charlie_eth_address)
190 _ = scenario.charlie_withdraw(
194 input_charlie_withdraw.as_input(),
197 charlie_balance_after_withdrawal = eth.getBalance(charlie_eth_address)
198 print(
"Balances after Charlie's withdrawal: ")
204 zeth_client.mixer_instance.address)
205 if charlie_balance_after_withdrawal <= charlie_balance_before_withdrawal:
206 raise Exception(
"Charlie's balance did not increase after withdrawal")
209 result_double_spending =
None
213 result_double_spending = scenario.charlie_double_withdraw(
218 input_charlie_withdraw.as_input(),
221 except Exception
as e:
222 print(f
"Charlie's double spending successfully rejected! (msg: {e})")
223 print(
"Balances after Charlie's double withdrawal attempt: ")
224 assert(result_double_spending
is None), \
225 "Charlie managed to withdraw the same note twice!"
231 zeth_client.mixer_instance.address)
235 result_deposit_bob_to_bob = scenario.charlie_corrupt_bob_deposit(
246 recovered_notes = _receive_notes(
247 result_deposit_bob_to_bob.output_events)
248 assert(len(recovered_notes[
'bob']) == 2), \
249 f
"Bob recovered {len(recovered_notes['bob'])} notes, expected 2"
251 print(
"- Balances after Bob's last deposit: ")
257 zeth_client.mixer_instance.address)
260 "========================================\n" +
262 "========================================\n")
265 if __name__ ==
'__main__':