通过Truffle上传Solidity代码到EVM是否附带OpenZeppelin合约及Library文件?
解答
OpenZeppelin 依赖是否会同步上传
分两种场景判断:
- 如果你是通过
import后继承OpenZeppelin的普通合约(比如ERC20、Ownable等非library类型的实现),Truffle/Hardhat这类工具在编译时会直接把所有继承的父合约逻辑和你自己的合约代码整合为最终字节码,部署时会把整份合并后的字节码一次性上传到EVM,你用到的OpenZeppelin逻辑会直接内嵌到你的合约中,不需要单独上传对应的OpenZeppelin合约。 - 如果你引用的是OpenZeppelin中标记了
library关键字的库(比如早期版本的SafeMath、通用工具库Address等),如果库内的方法都是internal修饰的,编译时也会直接把方法逻辑内嵌到调用方合约中,不需要单独部署;如果库包含public/external方法,工具默认不会自动帮你部署这个库,你需要手动完成库的部署后,将链上地址传入编译参数完成关联,才能正常部署你的业务合约。
为什么需要单独上传Library类型文件
你对Library的特性理解是对的:符合标准的Library确实仅需要部署一次,所有用户都可以通过链上地址直接调用。单独部署Library主要有两个核心价值:
- 节省部署成本:如果多个合约都需要用到同一个Library的逻辑,单独部署Library后,所有调用它的合约只需要存储Library的调用指针,不需要重复把相同的逻辑内嵌到自身字节码中,批量部署相似合约时可以省下非常多Gas。
- 提升全局复用效率:通用逻辑的Library部署上链后,所有开发者都可以直接调用已公开的链上Library地址,不需要重复部署相同的代码,也能避免重复开发、重复审计的成本。
常见疑问补充
如果你的业务只有单个合约用到某个Library的逻辑,不需要对外共享复用,也可以选择配置编译器直接把Library逻辑内嵌到你的合约中,不需要单独走Library的部署流程,两种方式的最终运行效果完全一致,区别仅在于部署成本和后续复用性。
内容的提问来源于stack exchange,提问作者Steve Gates
相关产品推荐
相关产品推荐

