Solidity0.8.0-部署合约

// SPDX-License-Identifier: GPL-3.0
//通过合约部署合约,通过代理合约去部署,
pragma solidity ^0.8.3; contract TestContract1 { address public owner = msg.sender; function setOwner(address _owner) public {//外部可见方法 require(msg.sender == owner, "not owner"); owner = _owner; } } contract TestContract2 {//合约2包含构造函数 address public owner = msg.sender; uint public value = msg.value; uint public x; uint public y; constructor(uint _x, uint _y) payable { x = _x; y = _y; } } contract Proxy { event Deploy(address);//声明一个事件,通过事件向链外汇报新部署合约地址 function deploy(bytes memory _code) external payable returns (address addr) {//使用部署方法,参数中传入部署合约的机器码,同时可以发送主币的方法和返回新部署合约的新地址
    //合约部署的方法,希望部署其他合约时不用重新部署整个合约,现在功能可以把合约的源码机器码输入进来之后就可以部署合约 assembly {//内联汇编
// create(v,p,n)   // v = amount of ETH to send  //v代表以太坊中发送主币的数量 // p = pointer in memory to start of code //p代表内存中机器码开始的位置 //n = size of code //n 内存中机器码的大小
addr := create(callvalue(), add(_code, 0x20), mload(_code))//0x20 代表跳过这个位置,callvalue()方法代表这次发送的主币,mload()获取大小,addr去获取返回的地址 }
//      returns 写了addr的名字就可以使用隐式返回 require(add
! = address(0), "deploy failed";//确认返回地址部署不是0地址,0地址是部署失败 emit Deploy(addr);//触发事件,加上函数事件名和参数就可以触发 new TestContract1();
   } }

 

posted @ 2022-07-29 18:39  ZaleSwfit  阅读(146)  评论(0编辑  收藏  举报