ideas:

Groth16 Circuit for proof of channel balance:

A proof attesting that given these public values:

class StateTransitionBalance:
	previous_root: zkhash # Merkle root of the channel ledger before the update
	new_root: zkhash # Merkle root of the channel ledger after the update
	value_added: TokenValue
	value_removed: TokenValue

The prover knows the following witness:

class StateTransitionBalanceWitness:
	previous_notes: list[Note]
	new_notes: list[Note]
	notes_merkle_path: list[list[zkhash]] # each path is the path against the 
							# root of the state after the update of all the previous notes
	notes_merkle_path_selectors: list[list[bool]]

such that the following constraints hold: