纵观历史,总是有类似的技术在同一时间上市,它们寻求相似的结果,但以不同的方式解决问题。当这种市场现象发生时,我们应该尝试客观地评估每项技术。
由于 STARK 阵营和 SNARK 阵营都对各自的技术充满热情,我们认为对这两种技术进行客观比较会很有趣。
零知识证明的想法最初是在1980年的一份学术论文中——《交互性证明系统的知识复杂度》中被提出。论文中提到:证明者可以在不披露信息本身的情况下向验证者证实信息的真实性。
从更技术的角度说,ZKP 是证明者与验证者两方之间的一个协议,证明者可以在不透露证明本身之外任何信息的前提下,让验证者确认某项证明是有效的。这是证明的“零知识”部分——没有知识或信息可以支持这条证明,除了证明本身。这听起来毫无道理,也似乎是不可能的。正是如此,这些技术才更加重要。
经常拿来解释 ZKP 的例子是一个名叫《寻找 Waldo》的游戏。证明者如何利用零知识来向验证者证明他知道 Waldo 在图中的哪个地方。一般的情况来说,证明者只需要在图上指出 Waldo 的位置即可,或者说 Waldo 在红白条纹的帐篷旁边,这样通过提供知识来向验证者证明他确实知道 Waldo 在哪儿。

但是如果用零知识的方法,证明者需要拿出一张纸,在中间剪个洞,并将洞放在 Waldo 上面来展示给验证者。这样,验证者可以看到 Waldo,知道证明者说的是真的,而且过程中也没有任何知识/信息的泄露。
当今市场上最引人注目的两种零知识技术是 zk-STARKs 和 zk-SNARKs。两者都是双方证明知识的方法的缩写:zk-STARK代表零知识可扩展透明知识论证,zk-SNARK代表零知识简洁非交互式知识论证。这篇文章将深入探讨从文化和技术角度探讨这两种不同的零知识技术之间的核心差异。此外,这两种零知识技术本质上都是非交互的,这意味着代码可以自主部署和运行。
以下是两者对比的数据表格



zk-SNARKs 是匿名加密交易的有用工具。但它们也有助于为隐私币以外的越来越多的其他应用程序提供动力。例如,Celo 是一种加密货币协议,专注于移动支付,并渴望创造一个更具包容性的金融世界。
Mohan 特别指出了 zk-SNARKs 如何帮助发展中国家的人们。

“如果我们现在考虑这些人如何能够使用加密货币,这几乎是不可能的,他们没有使用 Metamask,而是将 10,000 美元投入到一个随机的 DeFi 项目中,”他说。Mohan 补充说,使用 zk-SNARKs,手机用户可以立即与区块链同步——保留与加密相同的无需许可属性,但这种属性不具备高度技术能力的设备上。

尽管有他们的承诺,zk-SNARKs 仍然非常小众。即使在像加密这样的高科技行业,很多人也不知道他们是什么。但随着越来越多的公司开始采用这项技术,这种情况可能会发生变化。
其中包括Aleo,这是一家最近从蓝筹风险投资公司筹集了 2800 万美元的初创公司,旨在构建工具,让 Web 开发人员将零知识证明集成到各种 Internet 应用程序中——该项目承诺让消费者在不泄露信息的情况下浏览 Web大量个人数据。
🚀 Aleo定义了互联网的新标准。它采用创新的方法来保障安全、隐私和数据所有权。用户不再需要牺牲他们永远无法返回的信息,Web 服务也不会冒他们的个人数据的风险。
服务提供商必须管理在存储、处理或披露不当时可能危及其业务的机密数据。
Aleo介绍
在EloquentRuby(第21页,第一版,第六次打印)一书中,作者(RussOlsen)提倡使用each方法而不是for循环,这与我在其他地方读到的所有内容一致。但是作者还继续说,这样做的一个原因是for循环实际上调用了each方法,所以为什么不直接删掉中间人并使用each?所以我想知道这实际上是如何工作的。为了调查,我确实在github上的Ruby存储库上进行了搜索,但发现很难确定我在哪里/如何看到它的实际效果。重述问题:我如何证明Rubyfor循环实际上是使用each方法实现的? 最佳答案 您可以通过编写一个实现每个的类来展
我正在阅读我的ruby书。查看下面的代码,moduleDestroydefdestroy(anyObject)@anyObject=anyObjectputs"Iwilldestroytheobject:#{anyObject}"endendclassUserincludeDestroyattr_accessor:name,:emaildefinitialize(name,email)@name=name@email=emailendendmy_info=User.new("Bob","Bob@example.com")puts"Soyournameis:#{my_info.name}
我一直在使用text-align:justify均匀分布菜单。按照这个tutorial它工作得很好。但是,当我使用ReactJS创建View时它会中断。可以在此处找到比较:http://jsfiddle.net/j7pLprza/1/.我使用这两个简单的组件来填充菜单:varMenuItem=React.createClass({render:function(){return({this.props.title});}});varTopMenus=React.createClass({render:function(){return({this.props.menus.map(fun
在thisanswer有一个简单的函数可以为包含原始值的数组返回数组相等性。但是,我不确定它为什么会起作用。这是函数:functionarrays_equal(a,b){return!!a&&!!b&&!(a我最感兴趣的是下半场;这一点:!(a为什么和>比较数组时工作,但==不是吗?小于和大于方法在JavaScript中如何工作? 最佳答案 与/>,数组首先转换为字符串,因此不提供检查相等性的可靠方法。==不起作用,因为对象是通过引用检查的:[]==[];//false,twoseparateobjectsvara=[];a==a;
我正在尝试证明我的XML在Nifi上的格式正确。我已经根据一些模式验证了它,但有时我没有模式,所以只想确认它的格式是否正确。然而,所有的XML处理器似乎都需要一个模式或类似的东西,而不仅仅是显示它的格式正确。谁能提供一些帮助?非常感谢 最佳答案 要添加到kjhughes的答案(特定于NiFi),如果您始终知道根标记(我们称之为“根”),则可以使用thisSOpost中提到的XSD。与ValidateXml处理器。如果不知道根标签,可以使用ExecuteGroovyScript将“Failurestrategy”属性设置为“trans
我正在为正在优化的(Win7)C++例程编写回归测试,该例程以前释放并重新分配了许多巨大的缓冲区:内存流失。我想证明在测试期间,程序没有分配任何大内存区域(比如16M或更大),而是有效地重新使用在初始化时分配的内存。归根结底,如果调用VirtualAlloc来获取某个大区域(比如16M),测试应该会失败。是否有一种优雅的方法来计算对WindowsVirtualAlloc调用的统计信息?这将成为永久自动回归测试套件的一部分,因此使用外部工具或修改下游代码是不可行的。检查提交的总内存不太适合,因为我想断言例程不再搅动(释放和重新分配缓冲区。) 最佳答案
我大约24小时前运行了gitsvnclone,它仍在运行,看不到尽头。当我ls目标目录时,那里除了一个.git文件夹什么都没有。有没有办法证明这个命令确实在进步,而不是陷入死循环?我正在使用cygwin在Windows7上运行此命令。最让我担心的是我一遍又一遍地看到这样的消息:W:Refspecglobconflict(ref:refs/remotes/trunk@8286):expectedpath:branches/trunk@8286realpath:OLD/branches/APPContinuingaheadwithOLD/branches/APPW:Refspecglobc
在我上次c#面试中,我被要求证明C#字符串的不可变性,我知道c#字符串的不可变性是什么意思,但是是否可以通过代码证明c#字符串的不可变性?请给我一个示例代码片段。提前致谢 最佳答案 我可以证明string是不是不可变的。我需要做的就是显示一些改变string的代码,如下所示:usingSystem;usingSystem.Runtime.InteropServices;namespaceDemo{classProgram{staticvoidMain(string[]args){conststringtest="ABCDEF";//
阅读thisquestion,我想测试我是否可以在无法保证此类操作的原子性的类型上证明读取和写入的非原子性。privatestaticdouble_d;[STAThread]staticvoidMain(){newThread(KeepMutating).Start();KeepReading();}privatestaticvoidKeepReading(){while(true){doubledCopy=_d;//Inrelease:if(...)throw...Debug.Assert(dCopy==0D||dCopy==double.MaxValue);//Neverfails
最近我看到一些C#项目在Dictionary上使用双重检查锁定模式。像这样:privatestaticreadonlyobject_lock=newobject();privatestaticvolatileIDictionary_cache=newDictionary();publicstaticobjectCreate(stringkey){objectval;if(!_cache.TryGetValue(key,outval)){lock(_lock){if(!_cache.TryGetValue(key,outval)){val=newobject();//factorycon