部署智能合约是开发中必不可少的一个环节,常规的方式是借助像Hardhat这样的工具,通过编写ts部署脚本来实现。但在实际业务中,经常会遇到通过在合约中部署子合约的情况。比如添加Token流动池。这类需求在设计在上需要通过工厂合约来创建部署子合约来实现,它看起来就像是从一个模具厂生产的模具一样,只是每个模具的编号(子合约地址)不同。子合约的业务逻辑不是本次介绍的重点,我们主要关注在合约中部署合约的两种方式:
一、create部署
先确认子合约的内容,一个构造函数和简单的函数:
contract Son {
address token1;
address token2;
constructor(address _token1,address _token2) {
token1 = _token1;
token2 = _token2;
}
function addLiquidity() external pure returns(uint256){
return 1;
}
}
create的部署方式是通过new关键字来实现,所部署合约的地址是通过哈希计算得来:
- 部署地址 —msg.sender
- 之前在该地址部署的交易数 —
nonce
keccak256(rlp.encode(deployingAddress, nonce))
nonce每次获取的不一样,因此每次部署的合约地址不同。在solidity最新的版本中,只需通过内置的关键字new即可: