solidity进阶第五课——Create2

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

Create2操作码使我们在智能合约部署在以太坊网络之前就能预测合约的地址。Uniswap创建Pair合约用的就是Create2而不是Create。

Create是如何计算地址

智能合约可以由其他合约和普通账户利用Create操作码创建。 在这两种情况下,新合约的地址都以相同的方式计算:创建者的地址(通常为部署的钱包地址或者合约地址)和nonce(该地址发送交易的总数,对于合约账户是创建的合约总数,每创建一个合约nonce+1))的哈希。

新地址 = hash(创建者地址, nonce)

创建者地址不会变,但nonce可能会随时间而改变,因此用Create创建的合约地址不好预测。

Create2是如何计算地址

Create2的目的是为了让合约地址独立于未来的事件。不管未来区块链上发生了什么,你都可以把合约部署在事先计算好的地址上。用Create2创建的合约地址由4个部分决定:

0xFF:一个常数,避免和Create冲突

创建者地址

salt:一个创建者给定的数值

待部署合约的字节吗(bytecode)

新地址 = hash("0xFF",创建者地址, salt, bytecode)

Create2确保,如果创建者使用 Create2和提供的 salt 部署给定的合约bytecode,它将存储在新地址中。

Pair

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

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

    // called once by the factory at time of deployment
    function initialize(address _token0, address _token1) external {
        require(msg.sender == factory, 'UniswapV2: FORBIDDEN'); // sufficient check
        token0 = _token0;
        token1 = _token1;
    }
}

Pair合约很简单,包含三个状态变量:factory,token()和token1。

构造函数constructor在部署时将factory赋值为工厂合约地址。initialize函数会在Pair合约创建的时候被工厂合约调用一次,将token()和token1更新为币对中两种代币的地址。

PairFactory2

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

        function createPair2(address tokenA, address tokenB) external returns (address pairAddr) {
            require(tokenA != tokenB, 'IDENTICAL_ADDRESSES'); //避免tokenA和tokenB相同产生的冲突
            // 计算用tokenA和tokenB地址计算salt
            (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); //将tokenA和tokenB按大小排序
            bytes32 salt = keccak256(abi.encodePacked(token0, token1));
            // 用create2部署新合约
            Pair pair = new Pair{salt: salt}(); 
            // 调用新合约的initialize方法
            pair.initialize(tokenA, tokenB);
            // 更新地址map
            pairAddr = address(pair);
            allPairs.push(pairAddr);
            getPair[tokenA][tokenB] = pairAddr;
            getPair[tokenB][tokenA] = pairAddr;
        }

工厂合约(PairFactory2)有两个状态变量getPair是两个代币地址到币对地址的map,方便根据代币找到币对地址;allPairs是币对地址的数组,存储了所有币对地址。

PairFactory2合约只有一个createPair2函数,使用Create2根据输入的两个代币地址tokenAtokenB来创建新的Pair合约。其中

    Pair pair = new Pair{salt: salt}(); 

就是利用Create2创建合约的代码,非常简单,而salttoken1token2hash

    bytes32 salt = keccak256(abi.encodePacked(token0, token1));

事先先计算Pair的地址

        // 提前计算pair合约地址
        function calculateAddr(address tokenA, address tokenB) public view returns(address predictedAddress){
            require(tokenA != tokenB, 'IDENTICAL_ADDRESSES'); //避免tokenA和tokenB相同产生的冲突
            // 计算用tokenA和tokenB地址计算salt
            (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); //将tokenA和tokenB按大小排序
            bytes32 salt = keccak256(abi.encodePacked(token0, token1));
            // 计算合约地址方法 hash()
            predictedAddress = address(uint160(uint(keccak256(abi.encodePacked(
                bytes1(0xff),
                address(this),
                salt,
                keccak256(type(Pair).creationCode)
            )))));
        }

我们写了一个calculateAddr函数来事先计算tokenAtokenB将会生成的Pair地址。通过它,我们可以验证我们事先计算的地址和实际地址是否相同。

大家可以部署好PairFactory2合约,然后用下面两个地址作为参数调用createPair2,看看创建的币对地址是什么,是否与事先计算的地址一样:文章来源地址https://www.toymoban.com/news/detail-400238.html

WBNB地址: 0x2c44b726ADF1963cA47Af88B284C06f30380fC78
地址:0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c

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

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

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

相关文章

  • 某60区块链安全之Create2实战一学习记录

    学会使用python3的web3模块 学会分析以太坊智能合约Create2引发的漏洞及其利用 找到合约漏洞进行分析并形成利用 Ubuntu18.04操作机 python3 君士坦丁堡硬升级中引入了一个新操作码 CREATE2 ,它使用新的方式来计算常见的合约地址,让生成的合约地址更具有可控性 在 CREATE2 以前,

    2024年02月05日
    浏览(38)
  • 某60区块链安全之Create2实战二学习记录

    学会使用python3的web3模块 学会分析以太坊智能合约中的伪随机数问题 学会利用Create2可在同一地址部署不同合约特性解决伪随机数问题 找到合约漏洞进行分析并形成利用 Ubuntu18.04操作机 python3 君士坦丁堡硬升级中引入了一个新操作码 CREATE2 ,它使用新的方式来计算常见的合约

    2024年02月03日
    浏览(40)
  • 第五课 树与图

    题目描述 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 示例 2: 示例 3: 提示: 树中节点数目在范围 [0, 100] 内 -100 = Node.val = 100 代码展示 题目描述 给定一个 N 叉树,返回其节点值的 层序遍历 。(即从左到右,逐层遍历)。 树的序列化输入是用层序遍历

    2024年02月07日
    浏览(41)
  • 网络应用基础交换机(NETBASE第五课)

    交换机的定义 交换是按照通信两端传输信息的需要,用人工或设备自动完成的方法,把要传输的信息送到符合要求的相应路由上的技术的统称。交换机根据工作位置的不同,可以分为广域网交换机和局域网交换机。广域的交换机就是一种在

    2024年02月13日
    浏览(63)
  • 无人驾驶实战-第五课(动态环境感知与3D检测算法)

    在七月算法上报了《无人驾驶实战》课程,老师讲的真好。好记性不如烂笔头,记录一下学习内容。 课程入口,感兴趣的也可以跟着学一下。 ————————————————————————————————————————— 激光雷达的分类:     机械式Lidar:

    2024年02月14日
    浏览(38)
  • 【仿真建模】第五课:AnyLogic入门基础课程 - 地铁车站仿真讲解

    学习、参考链接:Anylogic入门基础课程 新建模型,单位改为分钟 修改比例尺 新建 OutPart 智能体类型 重命名为 OutPart 修改OutPart的比例尺为50,和之前设置的统一 绘制一个如下图所示的路径作为缓冲路线,形状可以自己定义,不一定要和我一样 拖拽一个矩形区域 拖拽一个线服

    2024年02月05日
    浏览(32)
  • 【STM32】基础知识 第五课 C 语言基础知识

    stdint.h 是从 C99 中引进的一个标准 C 库的文件. 路径: “D:MDK5.34ARMARMCCinclude” 运算符 含义 运算符 含义 按位与 ~ 按位取反 | 按位或 左移 ^ 按位异或 右移 按位与: num1 运算符 num2 结果 0 0 0 1 0 0 0 1 0 1 1 1 按位或: num1 运算符 num2 结果 0 | 0 0 1 | 0 1 0 | 1 1 1 | 1 1 按位异或: num1 运算符

    2024年02月13日
    浏览(69)
  • MySQl数据库第五课 --------在SQl的简单命令--------学习学习

     欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com ———————————————————————————— 数据库的简单介绍         1 . 数据储存         2. 数据库类型                 (1).关系型数据库                  (2).非关系型数据库    

    2024年02月13日
    浏览(45)
  • STM32第五课:对射式红外线传感器计数和旋转编码器计数

    1.1 产品特性          使用ITR9606高灵敏度槽型光耦器件,它由一个红外发光二极管和一个NPN光电三极管组成,槽宽度为5mm。传感器特设M3固定安装孔,调节方向与固定方便易用,使用宽电压LM393比较器,信号干净,波形好,驱动能力强,超过15mA。广泛用于电机转速检测,

    2024年02月20日
    浏览(34)
  • 《书生·浦语大模型全链路开源开放体系》笔记第五课 LMDeploy 的量化和部署

    首先我们可以使用  vgpu-smi  查看显卡资源使用情况。 可以点击终端(TERMINAL)窗口右侧的「+」号创建新的终端窗口。大家可以新开一个窗口,执行下面的命令实时观察 GPU 资源的使用情况。 结果如下图所示,该窗口会实时检测 GPU 卡的使用情况。 接下来我们切换到刚刚的终

    2024年01月21日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包