Внедрение 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;
}