智能合约是否可通过持有的合约编译字节码部署其他智能合约?
问题解答:持有其他合约字节码的智能合约是否可以部署该合约
可以,持有目标合约编译字节码的智能合约完全可以完成后续合约的部署操作。
部署智能合约仅需发送一笔包含智能合约编译代码的以太坊交易,且无需指定任何接收方。
普通用户通过外部账户(EOA)部署合约的逻辑是发起一笔to字段为空的交易,交易data字段携带合约字节码;智能合约部署新合约的底层逻辑一致,只是不需要主动构造无接收方交易,直接通过Solidity语法或底层操作码即可实现。
你之前找到的transfer、send、call均为合约向已存在地址发起转账/调用的方法,和合约部署逻辑不属于同一应用场景,两类操作的底层实现有明显区别。
常用合约部署实现方式
- 方式1:使用
new关键字直接部署(适用于部署逻辑固定、合约类型已知的场景)
// 待部署的目标合约 contract TargetContract { string public name; constructor(string memory _name) { name = _name; } } // 部署方合约 contract DeployContract { TargetContract public target; // 部署方法 function deployTarget(string calldata _name) external { target = new TargetContract(_name); } }
- 方式2:通过内联汇编调用
create/create2操作码部署(适用于已持有动态字节码的场景)
contract DeployWithBytecode { // 提前存储的目标合约字节码 bytes public targetBytecode; constructor(bytes memory _targetBytecode) { targetBytecode = _targetBytecode; } function deploy() external payable returns (address deployedAddr) { bytes memory bytecode = targetBytecode; assembly { // create方法参数分别为:发送的ETH数量、字节码起始位置、字节码长度 deployedAddr := create(callvalue(), add(bytecode, 0x20), mload(bytecode)) // 校验部署是否成功(判断新地址是否有代码) if iszero(extcodesize(deployedAddr)) { revert(0, 0) } } } }
内容的提问来源于stack exchange,提问作者Kevin M
相关产品推荐
相关产品推荐

