diff --git a/src/mpn/circuits/deposit_circuit.rs b/src/mpn/circuits/deposit_circuit.rs index 0170185b..508716b7 100644 --- a/src/mpn/circuits/deposit_circuit.rs +++ b/src/mpn/circuits/deposit_circuit.rs @@ -163,6 +163,8 @@ impl Circuit for DepositCircuit { let src_balances_hash_wit = AllocatedNum::alloc(&mut *cs, || Ok(trans.before_balances_hash.into()))?; + let src_checksum_wit = AllocatedNum::alloc(&mut *cs, || Ok(trans.checksum.into()))?; + let src_token_id_wit = AllocatedNum::alloc(&mut *cs, || { Ok(Into::::into(trans.before_balance.token_id).into()) })?; @@ -206,6 +208,7 @@ impl Circuit for DepositCircuit { &src_withdraw_nonce_wit.clone().into(), &src_addr_wit.x.clone().into(), &src_addr_wit.y.clone().into(), + &src_checksum_wit.clone().into(), &src_balances_hash_wit.clone().into(), ], )?; @@ -272,6 +275,7 @@ impl Circuit for DepositCircuit { &src_withdraw_nonce_wit.clone().into(), &tx_pub_key_wit.x.clone().into(), &tx_pub_key_wit.y.clone().into(), + &src_checksum_wit.clone().into(), // TODO: NEW CHECKSUM! &new_balances_hash_wit, ], )?; diff --git a/src/mpn/circuits/update_circuit.rs b/src/mpn/circuits/update_circuit.rs index f9219121..9d113a4b 100644 --- a/src/mpn/circuits/update_circuit.rs +++ b/src/mpn/circuits/update_circuit.rs @@ -110,6 +110,9 @@ impl Circuit for UpdateCircuit { // Sender address should be on curve in case transaction slot is non-empty src_addr_wit.assert_on_curve(&mut *cs, &enabled_wit)?; + let src_checksum_wit = + AllocatedPoint::alloc(&mut *cs, || Ok(trans.src_before.checksum))?; + let src_before_balances_hash = AllocatedNum::alloc(&mut *cs, || Ok(trans.src_before_balances_hash.into()))?; let dst_before_balances_hash = @@ -245,6 +248,7 @@ impl Circuit for UpdateCircuit { &src_withdraw_nonce_wit.clone().into(), &src_addr_wit.x.clone().into(), &src_addr_wit.y.clone().into(), + &src_checksum_wit.clone().into(), &src_before_balances_hash.clone().into(), ], )?; @@ -323,6 +327,7 @@ impl Circuit for UpdateCircuit { &src_withdraw_nonce_wit.clone().into(), &src_addr_wit.x.clone().into(), &src_addr_wit.y.clone().into(), + &src_checksum_wit.clone().into(), // TODO: UPDATE CHECKSUM! &src_balance_final_root, ], )?; @@ -340,6 +345,9 @@ impl Circuit for UpdateCircuit { // Destination address should be on curve in case transaction slot is non-empty tx_dst_addr_wit.assert_on_curve(&mut *cs, &enabled_wit)?; + let dst_checksum_wit = + AllocatedNum::alloc(&mut *cs, || Ok(trans.dst_before.CHECKSUM.into()))?; + let tx_dst_index_wit = UnsignedInteger::alloc( &mut *cs, (trans.dst_index as u64).into(), @@ -362,6 +370,7 @@ impl Circuit for UpdateCircuit { &dst_withdraw_nonce_wit.clone().into(), &dst_addr_wit.x.clone().into(), &dst_addr_wit.y.clone().into(), + &dst_checksum_wit.clone().into(), &dst_before_balances_hash.clone().into(), ], )?; @@ -397,6 +406,7 @@ impl Circuit for UpdateCircuit { &dst_withdraw_nonce_wit.clone().into(), &tx_dst_addr_wit.x.clone().into(), &tx_dst_addr_wit.y.clone().into(), + &dst_checksum_wit.clone().into(), // TODO: UPDATE CHECKSUM! &dst_balance_final_root, ], )?; diff --git a/src/mpn/circuits/withdraw_circuit.rs b/src/mpn/circuits/withdraw_circuit.rs index 4848f398..c4dce5e9 100644 --- a/src/mpn/circuits/withdraw_circuit.rs +++ b/src/mpn/circuits/withdraw_circuit.rs @@ -240,6 +240,8 @@ impl Circuit for WithdrawCircuit { let src_addr_wit = AllocatedPoint::alloc(&mut *cs, || Ok(trans.before.address))?; src_addr_wit.assert_on_curve(&mut *cs, &enabled_wit)?; + let src_checksum_wit = AllocatedPoint::alloc(&mut *cs, || Ok(trans.before.checksum))?; + let src_balances_before_token_hash_wit = AllocatedNum::alloc(&mut *cs, || Ok(trans.before_token_hash.into()))?; @@ -347,6 +349,7 @@ impl Circuit for WithdrawCircuit { &src_withdraw_nonce_wit.clone().into(), &src_addr_wit.x.clone().into(), &src_addr_wit.y.clone().into(), + &src_checksum_wit.clone().into(), &src_balances_before_token_hash_wit.clone().into(), ], )?; @@ -391,6 +394,7 @@ impl Circuit for WithdrawCircuit { + Number::constant::(BellmanFr::one())), &tx_pub_key_wit.x.clone().into(), &tx_pub_key_wit.y.clone().into(), + &src_checksum_wit.clone().into(), // TODO: NEW CHECKSUM! &balance_final_root, ], )?; diff --git a/src/zk/mod.rs b/src/zk/mod.rs index 852b505d..300eb7e4 100644 --- a/src/zk/mod.rs +++ b/src/zk/mod.rs @@ -62,6 +62,7 @@ pub struct MpnAccount { pub withdraw_nonce: u32, // Increased on MpnWithdrawals pub address: jubjub::PointAffine, pub tokens: HashMap, + pub checksum: ZkScalar, } impl MpnAccount { diff --git a/src/zk/state/mod.rs b/src/zk/state/mod.rs index acc6efd4..86af29d8 100644 --- a/src/zk/state/mod.rs +++ b/src/zk/state/mod.rs @@ -94,14 +94,14 @@ impl KvStoreStateManager { mpn_contract_id: ContractId, index: u64, ) -> Result { - let cells = (0..4) + let cells = (0..5) .map(|i| Self::get_data(db, mpn_contract_id, &ZkDataLocator(vec![index, i as u64]))) .collect::, StateManagerError>>()?; let mut token_indices = HashSet::new(); for (k, _) in db .pairs(keys::local_value( &mpn_contract_id, - &ZkDataLocator(vec![index, 4]), + &ZkDataLocator(vec![index, 5]), true, ))? .into_iter() @@ -116,12 +116,12 @@ impl KvStoreStateManager { let tok = Self::get_data( db, mpn_contract_id, - &ZkDataLocator(vec![index, 4, i as u64, 0]), + &ZkDataLocator(vec![index, 5, i as u64, 0]), )?; let bal = Self::get_data( db, mpn_contract_id, - &ZkDataLocator(vec![index, 4, i as u64, 1]), + &ZkDataLocator(vec![index, 5, i as u64, 1]), )?; let tok_is_zero: bool = tok.is_zero().into(); if !tok_is_zero { @@ -132,6 +132,7 @@ impl KvStoreStateManager { tx_nonce: cells[0].try_into()?, withdraw_nonce: cells[1].try_into()?, address: jubjub::PointAffine(cells[2], cells[3]), + checksum: cells[4], tokens, }) } @@ -174,6 +175,7 @@ impl KvStoreStateManager { (acc.withdraw_nonce as u64).into(), acc.address.0, acc.address.1, + acc.checksum, ]; vals.into_iter() .enumerate() @@ -191,14 +193,14 @@ impl KvStoreStateManager { Self::set_data( db, mpn_contract_id, - ZkDataLocator(vec![index, 4, *ind as u64, 0]), + ZkDataLocator(vec![index, 5, *ind as u64, 0]), money.token_id.into(), size_diff, )?; Self::set_data( db, mpn_contract_id, - ZkDataLocator(vec![index, 4, *ind as u64, 1]), + ZkDataLocator(vec![index, 5, *ind as u64, 1]), ZkScalar::from(money.amount), size_diff, )?;