Solidity——在合约中创建合约

这篇具有很好参考价值的文章主要介绍了Solidity——在合约中创建合约。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在以太坊链上,除了用户可以创建智能合约,智能合约同样也可以创建新的智能合约。两种常见的创建合约的方式:

一、create

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol";


contract MyToken {
    address public factory;//工厂合约地址
    address public token1;//代币合约地址1
    address public token2;//代币合约地址2

    constructor() payable{
        factory = msg.sender;
    }

    function initialize(address _token0, address _token1) external{
        require(msg.sender == factory, 'FORBIDDEN'); 
        token1 = _token0;
        token2 = _token1;
    }
}
// 工厂合约示例
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "./MyToken.sol";
contract TokenFactory {

    mapping(address => mapping(address => address)) public getPair; // 通过两个代币地址查Pair地址
    address[] public allPairs; // 保存所有Pair地址

    function create(address token1,address token2) external returns(address pairAddr){
        // 创建新合约
        MyToken token = new MyToken();
        // 调用新合约的initialize方法
        token.initialize(token1,token2);
        // 更新地址map
        pairAddr = address(token);
        allPairs.push(pairAddr);
        getPair[token1][token2] = pairAddr;
        getPair[token2][token1] = pairAddr;

    }

    function getToken(address token1,address token2) external view returns(address) {
        return getPair[token1][token2];
    }

    function getFactory (address token) external view returns(address) {
        return MyToken(token).factory();
    }

}

二、create2

计算合约地址的预测值:

使用 keccak256 哈希函数计算合约的初始化代码(包括合约的字节码和构造函数的参数)的哈希值。

从创建者地址(通常是工厂合约的地址)和一个称为 salt 的值中构造创建合约时的合约地址。

使用 CREATE2 指令创建合约:

使用 CREATE2 指令,通过调用一个现有合约的方法(通常是一个工厂合约)来创建新合约。

// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma solidity ^0.8.20;

contract Token1{
    uint256 public value;

    constructor(uint256 _value) {
        value = _value;
    }
}
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma solidity ^0.8.20;

import "./Token1.sol";

contract TokenFactory1 {

    event ContractCreated(address indexed newContract);

    /// 使用 create2 创建合约
    function createContract(bytes32 _salt,uint _x) external{
        Token1 _contract = new Token1{salt: _salt}(_x);
        emit ContractCreated(address(_contract));
    }

    ///计算被部署合约地址
    function getContractAddr(bytes32 salt, bytes memory bytecode) external view returns(address){
        address newContract = address(
            uint160(
                uint256(
                    keccak256(
                        abi.encodePacked(
                            bytes1(0xff),// 固定字符串
                            address(this),// 当前工厂合约地址
                            salt,// salt值
                            keccak256(bytecode)// 被部署合约机器码的hash
                        )
                    )
                )
            )
        );
        
        return newContract;
    }

    // 获取被部署合约bytecode,参数_x为被部署合约构造函数的参数
    function getBytecode(uint _x) external pure returns(bytes memory) {
        bytes memory bytecode = type(Token1).creationCode;
        return abi.encodePacked(bytecode, abi.encode(_x));
    }

}

三、区别

在以太坊中,create 和 create2 都是用于创建新合约实例的指令,但它们有一些关键的区别:

地址生成方式:

  • create: 创建的合约地址是基于创建者地址和创建者账户中的 nonce。创建者地址和 nonce 的组合决定了新合约的地址。
  • create2: 创建的合约地址是基于三个输入参数:创建者地址、salt 值和初始化代码的 keccak256 哈希。这样,您可以通过选择不同的 salt 值来创建不同的地址。

合约地址可预测性:

  • create: 合约地址是可预测的,但需要等待上一个创建者账户中的 nonce 增加。
  • create2: 合约地址是在创建时就能够预测的,不受 nonce 的影响。

用途:

  • create: 适用于在合约之间直接通信,无需事先知道合约地址。
  • create2: 适用于在创建合约时预测合约地址,并通过地址存储信息,以便其他合约能够可靠地找到它。

重复部署:

  • create: 如果两个不同的创建者同时尝试使用相同的 nonce 创建合约,它们可能会发生 nonce 竞争,导致一个创建失败。
  • create2: 使用不同的 salt,两个创建者可以同时创建具有相同初始化代码的合约,而不会发生地址冲突。

总体而言,create2 提供了更多的地址生成灵活性和可预测性,特别是对于一些需要在合约中存储地址信息的应用场景。在某些情况下,选择使用 createcreate2 取决于您的具体需求和设计。文章来源地址https://www.toymoban.com/news/detail-774777.html

到了这里,关于Solidity——在合约中创建合约的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【区块链-智能合约工程师】第二篇:Solidity入门

    参考文章:一文速览2022十大智能合约开发工具 资料地址:WTF学院 HelloWorld remix:在线智能合约开发IDE(Integrated Development Environment,集成开发环境),可以在浏览器中快速部署测试智能合约。 合约HelloWorld: 事项 说明 代码所用的软件许可(license) 不写许可的话编译时会警告

    2024年02月09日
    浏览(55)
  • 区块链智能合约solidity的中的一些关键字

    目  录 pragma mapping msg对象 block对象 contract constructor struct 数据地址 地址类型 address payable revert 以下场景使用 revert() : require 以下场景使用 require() : assert 以下场景使用 assert(): 访问权限 internal public private external function returns return view pure constant event emit modifier pragma   

    2024年01月16日
    浏览(77)
  • 【区块链-智能合约工程师】第三篇:Solidity进阶(一)

    学习资料地址:WTF学院 库合约一般都是一些好用的函数合集(库函数),为了提升solidity代码的复用性和减少gas而存在。他和普通合约主要有以下几点不同: 不能存在状态变量 不能够继承或被继承 不能接收以太币 不可以被销毁 String库 String库合约是将uint256(大正整数)类型

    2024年02月06日
    浏览(54)
  • 区块链web3智能合约Solidity学习资源整理

    Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。这门语言受到了 C++,Python 和 Javascript 语言的影响,设计的目的是能在以太坊虚拟机(EVM)上运行。 Solidity中文官方文档: https://solidity-cn.readthedocs.io/zh/develop/ https://learnblockchain.cn/docs/solidity/index.html 在线rem

    2024年03月19日
    浏览(73)
  • 【区块链】以太坊Solidity编写一个简单的Hello World合约

    熟悉一门语言得从Hello World! 开始,因为这是最简单的一个输出形式。 我们先在contracts目录下建立一个helloworld.sol文件 进入编辑 保存退出 在migrations下新建一个部署合约的js文件:3_initial_migration.js 名字可以变动 接下来在test中使用js调用智能合约 在另一个窗口打开ganache 运行智

    2024年02月15日
    浏览(74)
  • 《NFT区块链进阶指南二》Etherscan验证Solidity智能合约(Remix插件验证)

    前置参考文档:https://blog.csdn.net/sinat_34104446/article/details/130557703 合约验证是上传合约源代码到etherscan过程,在智能合约项目中,通常都是提供源码验证,增加项目信任度 验证合约后可以直接在etherscan上执行获取和设置方法,方便日常的管理员维护 以下使用remix进行验证并使用

    2024年02月05日
    浏览(76)
  • solidity(智能合约)零基础教学(3)

    前言:前面我们将了solidity的一些常用方法,接下来我们来讲一下,我们编写合约经常要用的一些功能; 一,modifier修饰符 在Solidity合约中,修饰符(modifier)是一种用于修改函数行为的特殊函数。通过使用修饰符,我们可以在执行函数之前、之后或中途对函数进行某些操作或

    2024年03月27日
    浏览(54)
  • 【区块链技术开发】 Solidity使用Truffle Box工具实现预构建模板、自动化部署、创建智能合约示例代码

    专栏:区块链技术开发 Truffle Box是一个开发工具,为Truffle生态系统中的开发人员提供了预构建

    2023年04月16日
    浏览(70)
  • 基于以太坊的智能合约开发Solidity(基础篇)

    参考教程:基于以太坊的智能合约开发教程【Solidity】_哔哩哔哩_bilibili (1)程序编译完成后,需要在虚拟机上运行,将合约部署好后便可执行刚刚编写的函数。(注意, 合约一旦部署,就会永久存在于区块链上,且不可篡改 ,不过可以销毁) (2)执行完成后,可以得到以

    2024年02月04日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包