首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在结构中存储数据的最佳方法是以zokrates进行比较吗?

在结构中存储数据的最佳方法是以zokrates进行比较吗?
EN

Ethereum用户
提问于 2022-12-05 08:09:09
回答 1查看 56关注 0票数 1

我需要你帮我用佐克拉底语构造数据。

我有两个数据,比如Attr(公共)和Res(私有)。

Res数据是这样的(不是固定的,键可以变化,但将与Attr相同)。

代码语言:javascript
复制
{
    age: "21",
    income: "1000",
    gender: "male"
    ...
}

Attr也有类似的键和一些比较数据,比如小于、大于或等于。例如,年龄大于18岁,但小于25岁(18500)。

构建Attr的最佳方式是什么,这样我就可以将它们与Res.进行比较。这两个数据将以zokrate脚本的私有和公共输入方式传递。

项目简介。

基本上,我试图生成两个数据公开(Attr)和私有(Res)的ZKP证明。如果将公共数据与私有数据进行比较,如果私有数据满足公共数据的要求,则应生成ZKP证据。谢谢!

编辑:

请检查以下结构,以zokrate表示。

代码语言:javascript
复制
struct PrivateData {
    u8 age;
    field monthlySpends;
    field userGender;

}
//Contains values which will be compared with private data using the equals operator
struct Eq {
    u8 age;
    field monthlySpends;
    field userGender;
}
//Contains values which will be compared with private data using less than operator
struct Lt{
    u8 age;
    field monthlySpends;
}
//Contains values which will be compared with private data using greater than operator
struct Gt{
    u8 age;
    field monthlySpends;
}


struct PublicData {
    Lt lessThan;
    Eq equalsTo;
    Gt greaterThan;
}

现在我想相应地比较它的值,静态代码看起来像这样(它不正确,但它可能有助于清除我想要实现的目标)。

代码语言:javascript
复制
def main(PrivateData x, PublicData y) {
    log("Checkin if privateData age is {}, is greater than  required template data age is {}", x.age, y.greaterThan.age);
    assert(x.age > y.greaterThan.age);
    log("Checkin if privateData monthlySpends is {}, is greater than  required template data monthlySpends is {}", x.monthlySpends, y.greaterThan.monthlySpends);
    assert(x.monthlySpends > y.greaterThan.monthlySpends);


    log("Checkin if privateData age is {}, is less than  required template data age is {}", x.age, y.lessThan.age);
    assert(x.age < y.lessThan.age);
    log("Checkin if privateData monthlySpends is {}, is less than  required template data monthlySpends is {}", x.monthlySpends, y.lessThan.monthlySpends);
    assert(x.monthlySpends < y.lessThan.monthlySpends);

    log("Checkin if privateData age is {}, is equals to  required template data age is {}", x.age, y.equalsTo.age);
    assert(x.age == y.equalsTo.age);
    log("Checkin if privateData monthlySpends is {}, is equals to  required template data monthlySpends is {}", x.monthlySpends, y.equalsTo.monthlySpends);
    assert(x.monthlySpends == y.equalsTo.monthlySpends);
    log("Checking if privateData gender {}, is equals to required template data gender {}", x.userGender, y.equalsTo.userGender);
    assert(x.userGender == y.equalsTo.userGender);
    return;
}

您能指导正确和最优的方法来构造和比较这种类型的代码吗?Struct属性可能有多达25个值,因此需要一个动态解决方案。如果您甚至可以提供一个提示,比如我应该使用哪种数据结构,就像某种树一样?Struct数据是固定的,但是有些属性可能是空的,所以我们也需要检查它,目前使用"0“来表示空值,因为无法找到在zokrate中使用null的方法。

这是输入的JSON

代码语言:javascript
复制
[
    {
       "age":"26",
       "monthlySpends":"0",
       "userGender":"0"
    },
    {
        "lessThan":{
            "age": "25",
            "monthlySpends": "0"
        },
        "equalsTo":{
            "age": "0",
            "monthlySpends": "0",
            "userGender": "0"
        },
        "greaterThan":{
            "age":"0",
            "monthlySpends":"0"
        }
    }
 ]
EN

回答 1

Ethereum用户

发布于 2022-12-05 10:57:56

构建它们的最佳方法是主观的--无论是哪种方式,您都必须迭代至少一个数据文件,以确定它们共享哪些参数。

如果这是为了简单起见,那么在时隙0,1,2...etc上构造可比较的参数,并使用两者中的较短作为比较基。

对于ZKP来说,这违背了知识(包含的数据)必须被共享以进行比较的整个前提。

如果您想使用相同的结构,可以对参数进行散列(没有它们的值),以确保结构本身是相同的,但是没有数据的连续性,在本例中ZKP的前提是不可获得的。

编辑:

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/140603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档