欢迎阅读Sourcify的首个简短FAQ!如果您在阅读本文后,关于源代码验证的问题仍未得到解答,请随时访问Sourcify Gitter频道 并向我们提出任何问题。同时,请继续关注更多教程和开发者导向的内容,这些内容将在此处以及Remix博客上发布!
源代码验证
什么是源代码验证?
Solidity合约源代码可以通过检查链上部署的代码是否与已发布的源代码文件匹配来进行验证。为了允许源代码验证,需要发布源代码和元数据文件,从而使开发人员能够验证部署的字节码是否与已发布的文件完全匹配。通过这样做,可以验证合约代码与在区块链上部署时的代码完全相同,并且在部署之前没有被调整或篡改。
为什么源代码验证很重要?
如果没有开源合约,很难知道您正在使用的应用程序实际上会做什么。去中心化网络最大的愿望之一是构建一个无需信任的基础设施,旨在减少对第三方和服务提供商的信任需求,并减少审查机会。从设计上讲,不应需要“盲目”信任dapp开发者或Web3项目。您应该始终能够自行验证,或者如果您不具备足够的技术能力,可以利用其他开发人员群体的力量,他们可以在代码开源后查看并指出恶意代码。
为什么我应该发布我的源代码/开源它?
封闭源代码的合约代码不容易验证,因为如果您必须依赖第三方来为您验证代码,则无法维持无需信任的设置。在这种情况下,验证服务提供商可能是攻击媒介,需要对其进行信任。
元数据
什么是字节码元数据?
元数据是描述和提供其他数据信息的数据。Solidity中的字节码(合约)元数据从0.4.7版本开始支持,并由Solidity编译器以JSON文件的形式自动生成。元数据文件包含有关已编译合约的信息,例如使用的编译器版本、使用的源代码、ABI和NatSpec文档。元数据文件还包含源代码的IPFS和SWARM哈希值,如果这些哈希值可用,则可以使用它们来检索源代码。
元数据文件还可以包含文字源代码,这意味着合约的实际代码存在于元数据文件的源代码部分。文字源代码也将由Sourcify验证在未来涵盖。
什么是NatSpec?
NatSpec是Ethereum Natural Language Specification Format的缩写。Solidity合约可以使用NatSpec注释为函数、返回值等提供丰富的文档。这些注释被分为面向开发人员和面向最终用户的消息。面向最终用户的消息对于用户来说至关重要,因为它们用通俗易懂的语言描述了合约交互将执行的操作。强烈建议使用NatSpec为所有公共接口完全注释Solidity合约。
NatSpec注释可以在交互时显示给用户,例如在签署交易之前在钱包界面中提示,或者稍后作为注释显示,例如在过去的交易列表中。
Sourcify
什么是Sourcify?
Sourcify是一项旨在使用户与区块链上的智能合约交互更加安全和透明的计划。
为了实现这一目标,Sourcify支持多项努力,以促进开源源代码验证、元数据文件和NatSpec注释的采用。
Sourcify的核心目前维护着
Sourcify基本上提供了基础层,允许在其之上构建其他工具。其主要目的是通过IPFS和Swarm保持元数据和源代码文件的可用性(防止字节码中的链接变成失效链接)。
除了技术基础设施外,Sourcify还是一个旨在为该领域带来透明度和意识的集体运动。我们试图教育并架起开发工具、钱包、界面和其他组件之间的桥梁,所有这些组件都在帮助消除最终用户对智能合约交互的神秘感,从而使区块链交互更加安全。
Sourcify监控和验证服务如何工作?
监控和验证组件...
- 侦听区块链上的新区块并从中获取交易。
- 检查其元数据和源代码是否已发布到IPFS或Swarm上。
- 重新编译代码。
- 检查它是否与已部署的代码相同。
- 将源代码、ABI和其他元数据永久存储在IPFS上。
Sourcify验证器与在Etherscan上验证我的合约有什么不同?
在我们深入了解差异之前:Etherscan通过其合约验证服务为生态系统做出了宝贵的贡献,对此我们表示衷心的感谢!
但是,Etherscan验证的当前设置存在一些小问题:Etherscan通常会“扁平化”代码,这使得无法验证元数据。在这一点上,即使是Etherscan也无法将代码重新编译到最后一个字节。您必须信任上传源代码的人,认为这是具有正确NatSpec注释和变量名的原始源代码。
Sourcify增加了使任何合约都可独立验证的选项。它还涵盖了另一个重要方面:代码的可用性。如果Etherscan出现故障,将无法再访问其已验证的合约。Sourcify试图通过使源代码文件存储和验证过程更加去中心化、独立和更具弹性来解决此问题。
源代码验证和使用NatSpec注释代码是如何关联的,以及如果您同时执行这两项操作,为什么它会更强大?
如果您验证了您部署的代码与您开源的代码完全匹配,那太好了!开发人员现在可以自行验证您的dapp是否真正实现了其承诺的功能。
但是,对于最终用户来说,在与您的代码交互时仍然很难理解他们在做什么。只有将合约交互的含义翻译成NatSpec,才能帮助他们理解幕后发生了什么。为了确保您不会使用不充分的注释来误导用户,所有注释和元数据也会被发布和验证。恶意行为者当然仍然可以使用“错误”的NatSpec注释,但是Sourcify会保证这些注释与编译时使用的注释相匹配。其他开发人员现在可以在开源代码中检查NatSpec注释并验证其准确性。
源代码验证和NatSpec携手并进,为合约交互带来更大的透明度!
很简单
- 仅验证源代码:📝🔍 + 🤔❓= ❌(代码是透明的,但最终用户不理解=不好)
- 仅使用NatSpec:🤓💡 + 📝🙈 = ❌(最终用户理解,但NatSpec可能是假的,因为代码未经验证=不好)
- 使用源代码验证和NatSpec:📝🔍 + 🤓💡 = ✅(代码是透明的,最终用户可以理解=很棒!)
Sourcify去中心化程度如何?
- 合约存储库:Sourcify合约存储库通过HTTPS和IPFS发布。
- 界面:如果您使用Sourcify UI,则通过我们的验证服务后端进行验证。但是,您也可以自己运行此服务。所有代码都可以在EF Sourcify存储库和Sourcify GitHub组织中找到。此外,Sourcify CLI将很快发布。
用户端:使用Sourcify改进Dapp UX?
签署交易时当前的UX有什么问题?
您可能已经遇到过在描述中包含随机十六进制字符串的交易。如果您继续签署此交易,则您盲目地信任dapp的开发者会履行其承诺。
是否可以拥有一个选项来验证正在发生的事情并做出明智的决定呢?
Sourcify旨在通过显示源代码是否已验证以及合约交互在非专业术语中的实际含义,为签署决策添加必要的上下文。
我们如何使用Sourcify改进UX?
开发人员可以通过使用NatSpec注释代码来帮助用户做出明智的决定。为了验证其NatSpec注释的准确性,他们应该将源代码文件发布到一个开放的目录中。
钱包等界面工具显示NatSpec注释以使其在合约交互之前对用户可见非常重要。
如何检查合约是否已验证?
目前,通过Sourcify验证的合约尚未在钱包或界面(如区块浏览器)上获得特殊的标签或标记。不过,未来实现这一点将非常棒!
目前,您可以使用Sourcify合约存储库。可以通过HTTPS或IPFS访问它。
使用合约地址并在存储库中搜索它。如果找到匹配项,则表示已验证。🎉
什么是完全匹配?
完全匹配表示已部署的字节码和已发布的文件之间,源文件以及元数据文件完全一致。
什么是部分匹配?
当元数据哈希不匹配时,就会发生部分匹配。这意味着源代码编译为相同的字节码,因此合约的行为方式相同,但源代码可能有所不同:变量可能具有误导性的名称,注释可能不同,尤其是 NatSpec 注释可能已被修改。
工具方面
需要哪些工具才能使源代码验证更加便捷?
现有和新工具的正确支持可以帮助开发人员更轻松、更便捷地进行源代码验证。
工具方面的快速改进包括
- 鼓励通过部署工具自动发布源文件,并在许可证指定为开源时将发布作为默认选项(从Solidity v0.6.8开始支持许可证标识符)。
- 创建(不同语言的)库,钱包可以使用这些库轻松地重新编译字节码。
钱包/UI 方面需要做些什么才能让用户了解已验证的合约?
钱包和用户界面是提高源代码验证和 NatSpec 注释的意识并扩大其采用的关键环节。为了让用户了解已验证的合约,钱包和其他用户界面可以
- 在合约交互过程中显示哪些合约已验证,哪些未验证。
- 如果合约未经验证,则警告用户。
- 始终显示 NatSpec 注释(如果可用)。
- 如果 NatSpec 注释未经验证,则警告用户并说明这些解释可能存在错误。
- 教育用户,如果他们不知道自己在做什么,则只能签署未添加 NatSpec 注释的交互。