<p>“编译时出错”的可能性很小。如果您的契约进行了编译,但是它与源代码不匹配,那么您在编译器中发现了一个非常严重的codegen错误,您应该<a href="https://github.com/ethereum/solidity/issues/new?assignees=&labels=&template=bug_report.md" rel="nofollow noreferrer">report it</a>,以便能够快速修复它。根据我的经验,你的合同很可能有漏洞</p>
<p>至于验证过程中的错误,问题是要正确编译多文件项目,必须提供所有源文件并将它们放在正确的目录中。这也适用于库代码,因此如果您的合同导入了<code>ISwapRouter.sol</code>,您还需要提交该文件以及它依次导入的所有文件</p>
<p>下一个障碍是,据我所知,Etherscan的多文件验证选项只允许您从单个目录提交文件,因此它只获取文件名,而不获取整个路径(不确定通过API是否不同)。您需要以太扫描将文件视为<code>@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol</code>,但它只会看到<code>ISwapRouter.sol</code>,编译器不会将它们视为相同的(两者可能都存在)</p>
<p>正确的解决方案是使用标准的JSON验证选项——通过这种方式,您可以提交框架传递给编译器的整个JSON输入,其中包括项目中的所有文件(包括库)和相关的编译器选项。问题是布朗尼没有直接给你这个输入。您可能可以从存储在磁盘上的JSON(标准JSON输入格式在<a href="https://docs.soliditylang.org/en/latest/using-the-compiler.html#compiler-input-and-output-json-description" rel="nofollow noreferrer">Compiler Input and Output JSON Description</a>中有文档记录)重新创建它,但这需要一些手工工作。不幸的是,Brownie没有提供任何方法在命令行上请求此操作。据我所知,获得它的唯一其他方法是使用Brownie的API并调用<a href="https://eth-brownie.readthedocs.io/en/latest/api-project.html#compiler.generate_input_json" rel="nofollow noreferrer">^{<cd4>}</a></p>
<p>由于这是一个只有一个合同的简单项目,并且没有很深的依赖关系,因此您可能更容易遵循@Jacopo Mosconi的答案,通过将所有导入内容替换为直接粘贴到主合同中的源来“展平”合同。您还可以尝试将文件复制到项目目录并更改导入,使其仅包含文件名,而不包含任何路径组件-这可能会通过多文件验证。扁平化最终是布朗尼和许多其他框架目前进行验证的方式,Etherscan的检查非常宽松,允许以这种方式修改源代码-它只检查字节码,因此即使完全更改导入结构、名称、注释,甚至优化器删除的任何代码,您仍然可以进行验证</p>