zkas: Implement debug symbols in the compiled binary

This commit is contained in:
x
2026-01-06 17:21:44 +00:00
parent 43b9695884
commit 3aa0e3b722
27 changed files with 280 additions and 94 deletions

View File

@@ -133,7 +133,7 @@ impl RlnIdentity {
vec![epoch, external_nullifier, x, y, internal_nullifier, identity_root.inner()];
info!(target: "crypto::rln::create_proof", "[RLN] Creating proof for event {}", event.id());
let signal_zkbin = ZkBinary::decode(RLN2_SIGNAL_ZKBIN)?;
let signal_zkbin = ZkBinary::decode(RLN2_SIGNAL_ZKBIN, false)?;
let signal_circuit = ZkCircuit::new(witnesses, &signal_zkbin);
let proof = Proof::create(proving_key, &[signal_circuit], &public_inputs, &mut OsRng)?;

View File

@@ -603,7 +603,7 @@ impl Client {
let identity_tree: MerkleTree = deserialize_async(&identity_tree).await?;
// Retrieve the ZK proving key from the db
let signal_zkbin = ZkBinary::decode(RLN2_SIGNAL_ZKBIN)?;
let signal_zkbin = ZkBinary::decode(RLN2_SIGNAL_ZKBIN, false)?;
let signal_circuit = ZkCircuit::new(empty_witnesses(&signal_zkbin)?, &signal_zkbin);
let Some(proving_key) = self.server.server_store.get("rlnv2-diff-signal-pk")? else {
return Err(Error::DatabaseError(

View File

@@ -155,7 +155,7 @@ impl IrcServer {
let rln_identity_store = darkirc.sled.open_tree("rln_identity_store")?;
// Generate RLN proving and verifying keys, if needed
let rln_signal_zkbin = ZkBinary::decode(RLN2_SIGNAL_ZKBIN)?;
let rln_signal_zkbin = ZkBinary::decode(RLN2_SIGNAL_ZKBIN, false)?;
let rln_signal_circuit =
ZkCircuit::new(empty_witnesses(&rln_signal_zkbin)?, &rln_signal_zkbin);
@@ -184,7 +184,7 @@ impl IrcServer {
if server_store.get("rlnv2-diff-slash-pk")?.is_none() {
info!(target: "irc::server", "[RLN] Creating RlnV2_Diff_Slash ProvingKey");
let zkbin = ZkBinary::decode(RLN2_SLASH_ZKBIN)?;
let zkbin = ZkBinary::decode(RLN2_SLASH_ZKBIN, false)?;
let circuit = ZkCircuit::new(empty_witnesses(&zkbin).unwrap(), &zkbin);
let provingkey = ProvingKey::build(zkbin.k, &circuit);
let mut buf = vec![];
@@ -194,7 +194,7 @@ impl IrcServer {
if server_store.get("rlnv2-diff-slash-vk")?.is_none() {
info!(target: "irc::server", "[RLN] Creating RlnV2_Diff_Slash VerifyingKey");
let zkbin = ZkBinary::decode(RLN2_SIGNAL_ZKBIN)?;
let zkbin = ZkBinary::decode(RLN2_SIGNAL_ZKBIN, false)?;
let circuit = ZkCircuit::new(empty_witnesses(&zkbin).unwrap(), &zkbin);
let verifyingkey = VerifyingKey::build(zkbin.k, &circuit);
let mut buf = vec![];

View File

@@ -2126,7 +2126,7 @@ impl Drk {
return Err(Error::Custom("Fee circuit not found".to_string()))
};
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1)?;
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1, false)?;
let fee_circuit = ZkCircuit::new(empty_witnesses(&fee_zkbin)?, &fee_zkbin);
@@ -2141,7 +2141,7 @@ impl Drk {
return Err(Error::DatabaseError("[dao_mint] DAO Mint circuit not found".to_string()))
};
let dao_mint_zkbin = ZkBinary::decode(&dao_mint_zkbin.1)?;
let dao_mint_zkbin = ZkBinary::decode(&dao_mint_zkbin.1, false)?;
let dao_mint_circuit = ZkCircuit::new(empty_witnesses(&dao_mint_zkbin)?, &dao_mint_zkbin);
@@ -2464,7 +2464,7 @@ impl Drk {
))
};
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1)?;
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1, false)?;
let fee_circuit = ZkCircuit::new(empty_witnesses(&fee_zkbin)?, &fee_zkbin);
@@ -2490,8 +2490,8 @@ impl Drk {
))
};
let propose_burn_zkbin = ZkBinary::decode(&propose_burn_zkbin.1)?;
let propose_main_zkbin = ZkBinary::decode(&propose_main_zkbin.1)?;
let propose_burn_zkbin = ZkBinary::decode(&propose_burn_zkbin.1, false)?;
let propose_main_zkbin = ZkBinary::decode(&propose_main_zkbin.1, false)?;
let propose_burn_circuit =
ZkCircuit::new(empty_witnesses(&propose_burn_zkbin)?, &propose_burn_zkbin);
@@ -2644,7 +2644,7 @@ impl Drk {
return Err(Error::Custom("[dao_generic_proposal_tx] Fee circuit not found".to_string()))
};
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1)?;
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1, false)?;
let fee_circuit = ZkCircuit::new(empty_witnesses(&fee_zkbin)?, &fee_zkbin);
@@ -2670,8 +2670,8 @@ impl Drk {
))
};
let propose_burn_zkbin = ZkBinary::decode(&propose_burn_zkbin.1)?;
let propose_main_zkbin = ZkBinary::decode(&propose_main_zkbin.1)?;
let propose_burn_zkbin = ZkBinary::decode(&propose_burn_zkbin.1, false)?;
let propose_main_zkbin = ZkBinary::decode(&propose_main_zkbin.1, false)?;
let propose_burn_circuit =
ZkCircuit::new(empty_witnesses(&propose_burn_zkbin)?, &propose_burn_zkbin);
@@ -2848,7 +2848,7 @@ impl Drk {
return Err(Error::Custom("[dao_vote] Fee circuit not found".to_string()))
};
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1)?;
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1, false)?;
let fee_circuit = ZkCircuit::new(empty_witnesses(&fee_zkbin)?, &fee_zkbin);
@@ -2870,8 +2870,8 @@ impl Drk {
return Err(Error::Custom("[dao_vote] DAO Vote Main circuit not found".to_string()))
};
let dao_vote_burn_zkbin = ZkBinary::decode(&dao_vote_burn_zkbin.1)?;
let dao_vote_main_zkbin = ZkBinary::decode(&dao_vote_main_zkbin.1)?;
let dao_vote_burn_zkbin = ZkBinary::decode(&dao_vote_burn_zkbin.1, false)?;
let dao_vote_main_zkbin = ZkBinary::decode(&dao_vote_main_zkbin.1, false)?;
let dao_vote_burn_circuit =
ZkCircuit::new(empty_witnesses(&dao_vote_burn_zkbin)?, &dao_vote_burn_zkbin);
@@ -3110,9 +3110,9 @@ impl Drk {
return Err(Error::Custom("[dao_exec_transfer] Fee circuit not found".to_string()))
};
let mint_zkbin = ZkBinary::decode(&mint_zkbin.1)?;
let burn_zkbin = ZkBinary::decode(&burn_zkbin.1)?;
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1)?;
let mint_zkbin = ZkBinary::decode(&mint_zkbin.1, false)?;
let burn_zkbin = ZkBinary::decode(&burn_zkbin.1, false)?;
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1, false)?;
let mint_circuit = ZkCircuit::new(empty_witnesses(&mint_zkbin)?, &mint_zkbin);
let burn_circuit = ZkCircuit::new(empty_witnesses(&burn_zkbin)?, &burn_zkbin);
@@ -3155,10 +3155,10 @@ impl Drk {
))
};
let dao_exec_zkbin = ZkBinary::decode(&dao_exec_zkbin.1)?;
let dao_auth_transfer_zkbin = ZkBinary::decode(&dao_auth_transfer_zkbin.1)?;
let dao_exec_zkbin = ZkBinary::decode(&dao_exec_zkbin.1, false)?;
let dao_auth_transfer_zkbin = ZkBinary::decode(&dao_auth_transfer_zkbin.1, false)?;
let dao_auth_transfer_enc_coin_zkbin =
ZkBinary::decode(&dao_auth_transfer_enc_coin_zkbin.1)?;
ZkBinary::decode(&dao_auth_transfer_enc_coin_zkbin.1, false)?;
let dao_exec_circuit = ZkCircuit::new(empty_witnesses(&dao_exec_zkbin)?, &dao_exec_zkbin);
let dao_auth_transfer_circuit =
@@ -3403,7 +3403,7 @@ impl Drk {
else {
return Err(Error::Custom("[dao_exec_generic] Fee circuit not found".to_string()))
};
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1)?;
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1, false)?;
let fee_circuit = ZkCircuit::new(empty_witnesses(&fee_zkbin)?, &fee_zkbin);
let fee_pk = ProvingKey::build(fee_zkbin.k, &fee_circuit);
@@ -3422,7 +3422,7 @@ impl Drk {
"[dao_exec_generic] DAO {namespace} circuit not found"
)))
};
let dao_exec_zkbin = ZkBinary::decode(&dao_exec_zkbin.1)?;
let dao_exec_zkbin = ZkBinary::decode(&dao_exec_zkbin.1, false)?;
let dao_exec_circuit = ZkCircuit::new(empty_witnesses(&dao_exec_zkbin)?, &dao_exec_zkbin);
let dao_exec_pk = ProvingKey::build(dao_exec_zkbin.k, &dao_exec_circuit);

View File

@@ -540,7 +540,7 @@ impl Drk {
return Err(Error::Custom("[deploy_contract] Fee circuit not found".to_string()))
};
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1)?;
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1, false)?;
let fee_circuit = ZkCircuit::new(empty_witnesses(&fee_zkbin)?, &fee_zkbin);
@@ -603,7 +603,7 @@ impl Drk {
return Err(Error::Custom("[lock_contract] Fee circuit not found".to_string()))
};
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1)?;
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1, false)?;
let fee_circuit = ZkCircuit::new(empty_witnesses(&fee_zkbin)?, &fee_zkbin);

View File

@@ -1400,7 +1400,7 @@ impl Drk {
return Err(Error::Custom("Fee circuit not found".to_string()))
};
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1)?;
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1, false)?;
let fee_circuit = ZkCircuit::new(empty_witnesses(&fee_zkbin)?, &fee_zkbin);

View File

@@ -125,8 +125,8 @@ impl Drk {
return Err(Error::Custom("Burn circuit not found".to_string()))
};
let mint_zkbin = ZkBinary::decode(&mint_zkbin.1)?;
let burn_zkbin = ZkBinary::decode(&burn_zkbin.1)?;
let mint_zkbin = ZkBinary::decode(&mint_zkbin.1, false)?;
let burn_zkbin = ZkBinary::decode(&burn_zkbin.1, false)?;
let mint_circuit = ZkCircuit::new(empty_witnesses(&mint_zkbin)?, &mint_zkbin);
let burn_circuit = ZkCircuit::new(empty_witnesses(&burn_zkbin)?, &burn_zkbin);
@@ -228,8 +228,8 @@ impl Drk {
return Err(Error::Custom("Burn circuit not found".to_string()))
};
let mint_zkbin = ZkBinary::decode(&mint_zkbin.1)?;
let burn_zkbin = ZkBinary::decode(&burn_zkbin.1)?;
let mint_zkbin = ZkBinary::decode(&mint_zkbin.1, false)?;
let burn_zkbin = ZkBinary::decode(&burn_zkbin.1, false)?;
let mint_circuit = ZkCircuit::new(empty_witnesses(&mint_zkbin)?, &mint_zkbin);
let burn_circuit = ZkCircuit::new(empty_witnesses(&burn_zkbin)?, &burn_zkbin);

View File

@@ -301,9 +301,9 @@ impl Drk {
return Err(Error::Custom("Fee circuit not found".to_string()))
};
let mint_zkbin = ZkBinary::decode(&mint_zkbin.1)?;
let auth_mint_zkbin = ZkBinary::decode(&auth_mint_zkbin.1)?;
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1)?;
let mint_zkbin = ZkBinary::decode(&mint_zkbin.1, false)?;
let auth_mint_zkbin = ZkBinary::decode(&auth_mint_zkbin.1, false)?;
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1, false)?;
let mint_circuit = ZkCircuit::new(empty_witnesses(&mint_zkbin)?, &mint_zkbin);
let auth_mint_circuit =
@@ -409,8 +409,8 @@ impl Drk {
return Err(Error::Custom("Fee circuit not found".to_string()))
};
let auth_mint_zkbin = ZkBinary::decode(&auth_mint_zkbin.1)?;
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1)?;
let auth_mint_zkbin = ZkBinary::decode(&auth_mint_zkbin.1, false)?;
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1, false)?;
let auth_mint_circuit =
ZkCircuit::new(empty_witnesses(&auth_mint_zkbin)?, &auth_mint_zkbin);

View File

@@ -95,9 +95,9 @@ impl Drk {
return Err(Error::Custom("Fee circuit not found".to_string()))
};
let mint_zkbin = ZkBinary::decode(&mint_zkbin.1)?;
let burn_zkbin = ZkBinary::decode(&burn_zkbin.1)?;
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1)?;
let mint_zkbin = ZkBinary::decode(&mint_zkbin.1, false)?;
let burn_zkbin = ZkBinary::decode(&burn_zkbin.1, false)?;
let fee_zkbin = ZkBinary::decode(&fee_zkbin.1, false)?;
let mint_circuit = ZkCircuit::new(empty_witnesses(&mint_zkbin)?, &mint_zkbin);
let burn_circuit = ZkCircuit::new(empty_witnesses(&burn_zkbin)?, &burn_zkbin);

View File

@@ -164,7 +164,7 @@ fn main() -> ExitCode {
println!("Wrote output to {}", &output);
if eflag {
let zkbin = ZkBinary::decode(&bincode).unwrap();
let zkbin = ZkBinary::decode(&bincode, true).unwrap();
println!("{zkbin:#?}");
}

View File

@@ -28,17 +28,18 @@ from darkfi_sdk.zkas import (MockProver, ZkBinary, ZkCircuit, ProvingKey,
def eprint(fstr, *args):
print("error: " + fstr, *args, file=sys.stderr)
def show_trace(opcodes, trace):
print(f"{'Line':<4} {'Opcode':<22} {'Type':<10} {'Values'}")
def show_trace(zkbin, opcodes, trace):
print(f"{'Line':<6} {'Source':<12} {'Opcode':<22} {'Result':<20} {'Values'}")
for i, (opcode, (optype, args)) in enumerate(zip(opcodes, trace)):
if args:
args = ", ".join([str(arg) for arg in args])
args = f"[{args}]"
else:
args = ""
opcode = str(opcode)
optype = str(optype)
print(f"{i:<4} {opcode:<22} {optype:<10} {args}")
# Get source location from debug info
loc = zkbin.opcode_location(i)
source = f"L{loc[0]}:C{loc[1]}" if loc else "-"
# Get result variable name for assignments
result = zkbin.heap_name(i) or "-" # Simplified - would need proper heap tracking
args_str = f"[{', '.join(str(a) for a in args)}]" if args else ""
print(f"{i:<6} {source:<12} {str(opcode):<22} {result:<20} {args_str}")
def load_circuit_witness(circuit, witness_file):
# We attempt to decode the witnesses from the JSON file.
@@ -147,7 +148,7 @@ def main(witness_file, source_file, mock=False, trace=False):
return -3
if trace:
show_trace(zkbin.opcodes(), circuit.opvalues())
show_trace(zkbin, zkbin.opcodes(), circuit.opvalues())
print("Verifying ZK proof...")
verify_status = proof.verify(verifying_key, instances)