serde_json序列化程序不适用于某些 crate 中定义的结构

serde_json serializer not working for structs defined in certain crates

提问人:Ethan Cemer 提问时间:8/10/2023 最后编辑:Ethan Cemer 更新时间:8/11/2023 访问量:18

问:

在本教程应用程序中测试这些 Web 程序集绑定的过程中,每当我在 JS 环境中测试序列化程序时,我都会发现此 crate 中的序列化程序存在问题。

对于上下文,以下是我发现问题的方式:

起初我意识到 wasm 教程的 elgamalEncrypt 绑定失败......我通过更改来解决这个问题

 pub fn elgamalEncrypt(
    pk: wasm_bindgen::Clamped<Vec<u8>>,
    message: wasm_bindgen::Clamped<Vec<u8>>,
    r: wasm_bindgen::Clamped<Vec<u8>>,
) -> Vec<u8> {
    let pk: G1Affine = serde_json::from_slice(&pk[..]).unwrap();
    let message: Vec<Fr> = serde_json::from_slice(&message[..]).unwrap();
    let r: Fr = serde_json::from_slice(&r[..]).unwrap();

    let output = crate::circuit::modules::elgamal::ElGamalGadget::encrypt(pk, message, r);

    serde_json::to_vec(&output).unwrap()
}

对此

/// Encrypt using elgamal in browser. Input message
#[wasm_bindgen]
#[allow(non_snake_case)]
pub fn elgamalEncrypt(
    pk: wasm_bindgen::Clamped<Vec<u8>>,
    message: wasm_bindgen::Clamped<Vec<u8>>,
    r: wasm_bindgen::Clamped<Vec<u8>>,
) -> Vec<u8> {
    let pk: [[u64; 4]; 2] = serde_json::from_slice(&pk[..]).unwrap();
    let pk: G1Affine = G1Affine {
        x: Fq::from_raw(pk[0]),
        y: Fq::from_raw(pk[1]),
    };
    let message: Vec<[u64; 4]> = serde_json::from_slice(&message[..]).unwrap();
    let message: Vec<Fr> = message.iter().map(|b| vecu64_to_field(b)).collect();
    let r: [u64; 4] = serde_json::from_slice(&r[..]).unwrap();
    let r: Fr = vecu64_to_field(&r);

    let output = crate::circuit::modules::elgamal::ElGamalGadget::encrypt(pk, message, r);

    serde_json::to_vec(&output).unwrap()
}

这阻止了这种绑定的失败。 但是随后 elgamalDecrypt 在 wasm 教程应用程序中不再正确解密消息......

最终,我通过在 wasm 绑定中实质上复制这些序列化程序的功能,在这里“修复”了这个 PR 中的问题。

我们之所以还没有合并这些变化,是因为感觉我们是在给一个更深层次的问题贴上创可贴。如果未调用序列化程序,则这些更改绝对有意义,但最终我们需要找出serde_json序列化程序未正确触发的原因。

javascript 序列化 webassembly rust-cargo serde-json

评论


答: 暂无答案