Solidity中new关键字适用场景及合约地址转换调用方法疑问
问题解答
1. ERC20Token(address(token))的作用和参数来源
这行是Solidity里的合约地址类型转换语法,作用是把存储了已部署合约地址的address类型变量,转换成对应合约类型的实例,后续就可以通过这个实例直接调用目标合约的公开方法。
参数来源清晰明确:
MyContract部署时,构造函数要求传入_token参数,这个参数就是你提前在链上部署好的ERC20Token合约的实际链上地址,部署完成后会存在MyContract的公开状态变量token中- 调用
buyToken方法时,直接取出状态变量里存储的已部署合约地址做类型转换,就能拿到可直接调用的合约实例
2. 为什么不能用new ERC20Token()替代
new关键字的核心作用是在链上全新部署一份独立的合约实例,每次执行new操作都会生成一个全新的合约地址,分配独立的存储空间。
如果在buyToken里用new写法,会导致每次用户调用买币方法,都会新部署一个完全独立的ERC20Token合约,本次mint的代币只会存在这个新生成的、没有其他用户使用的合约里,和项目对外公开、所有用户共同使用的那个ERC20Token合约没有任何关联,完全不符合业务逻辑。
3. Solidity中new关键字的适用场景
需要使用new的场景
你需要在当前合约的逻辑里动态生成、部署全新的独立合约实例时用new,比如:
- 工厂类合约:比如NFT集合工厂,用户每次发起创建集合的请求,就
new一个新的ERC721合约分配给用户 - 没有现成实例、需要当前合约主动部署新合约的业务场景
不需要使用new的场景
你要交互的目标合约已经在链上部署完成,只需要基于已知地址调用其方法时,直接用合约类型(地址)做类型转换即可,不要用new,比如:
- 调用官方部署的USDT、USDC等公开代币合约的转账、授权方法
- 调用你自己提前部署好的项目核心合约的相关方法
内容的提问来源于stack exchange,提问作者Jorre
相关产品推荐
相关产品推荐

