Внедрение grpc в gnark v0.8.1, как преобразовать доказательство, ключ проверки и публичный свидетель в собственный тип?

В гнарке v0.8.1,

Сначала нам нужно преобразовать эти 3 в нативные, т. е. мы конвертируем их в[]byte.
Я попробовал реализоватьSerialize()иDeSerialize(), но я сталкиваюсь с ошибками.

Проблема: Groth16.Proof — это интерфейс, и его реализация зависит от кривой. Итак, как нам обрабатывать их одновременно, во время преобразования []byte и приведения их типов?

      func Serialize(x any) ([]byte, error) {
    var buf bytes.Buffer
    enc := gob.NewEncoder(&buf)
    if err := enc.Encode(x); err != nil {
        return nil, err
    }
    fmt.Printf("buf.Bytes(): %v\n", buf.Bytes())
    return buf.Bytes(), nil
}

func DeSerialize(x []byte, returnType string) (interface{}, error) {
    fmt.Printf("x: %v\n", x)
    fmt.Printf("returnType: %v\n", returnType)
    buf := bytes.NewBuffer(x)
    dec := gob.NewDecoder(buf)
    switch returnType {
    case "proof":
        var proof groth16.Proof
        gob.Register(internal.Proof{})
        if err := dec.Decode(&proof); err != nil {
            fmt.Printf("----> Decode err: %v\n", err)
            return groth16.NewProof(ecc.BN254), err
        }
        return proof, nil

    case "publicWitness":
        var w witness.Witness
        if err := dec.Decode(&w); err != nil {
            res, _ := frontend.NewWitness(nil, ecc.BN254.ScalarField())
            return res, err
        }
        return w, nil

    case "verificationKey":
        var vk groth16.VerifyingKey
        if err := dec.Decode(&vk); err != nil {
            return vk, err
        }
        return vk, nil
    default:
        return nil, errors.New("wrong returnType")
    }

}

В приведенном выше коде я получаю сообщение об ошибке: Ошибка декодирования: gob: тип локального интерфейса *groth16.Proof можно декодировать только из типа удаленного интерфейса; получен конкретный тип

      Proof = struct {
    Ar G1Affine = struct {
        X[4] uint;
        Y Element;
    };
    Krs G1Affine;
    Bs G2Affine = struct {
        X E2 = struct {
            A0 Element;
            A1 Element;
        };
        Y E2;
    };
    Commitment G1Affine;
    CommitmentPok G1Affine;
}

0 ответов

Другие вопросы по тегам