Solidity——Create2

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

Solidity——Create2

介绍

君士坦丁堡硬升级中引入了一个新操作码 CREATE2 ,它使用新的方式来计算常见的合约地址,让生成的合约地址更具有可控性。

具体内容

在 CREATE2 以前,CREATE指令创建的合约地址是通通过交易发起者(sender)的地址以及交易序号(nonce)来计算确定的。sender 和 nonce 进行 RLP 编码,然后用 Keccak-256 进行 hash 计算(伪码):

keccak256(rlp([sender, nonce]))

而 CREATE2 指令则主要是根据创建合约的初始化代码(init_code)及盐(slat) 生成(伪码):

一般而言init_code==bytecode,就是编译生成的字节码,借此让地址变成了对合约代码的验证

keccak256(0xff + sender + salt + keccak256(init_code))

使用

  • create2部署
pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}());
  • 依据bytecode计算合约地址:
    function computeAddress(address factory, PoolKey memory key) internal pure returns (address pool) {
        require(key.token0 < key.token1);
        pool = address(
            uint256(
                keccak256(
                    abi.encodePacked(
                        hex'ff',
                        factory,
                        keccak256(abi.encode(key.token0, key.token1, key.fee)),
                        POOL_INIT_CODE_HASH
                    )
                )
            )
        );

优点

  • 可以在链下计算出已经创建的交易池的地址

  • 其他合约不必通过 UniswapV3Factory 中的接口来查询交易池的地址,可以节省 gas

  • 合约地址不会因为reorg (区块重组、分叉) 而改变

  • 如果一个合约自毁了,那么新合约未来可以再次部署到这个地址上

  • 在未部署前可以提前获取合约地址文章来源地址https://www.toymoban.com/news/detail-792914.html

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

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

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

相关文章

  • 【区块链 | Solidity】跟我学 Solidity(7):事件

    如何使用事件记录数据 原文: https://medium.com/better-programming/learn-solidity-events-2801d6a99a92 作者: wissal haji 欢迎订阅《Solidity智能合约零基础开发教程专栏》系列文章。 在今天的文章中,我们将看到如何使用web3.js从区块链中读取事件。 Solidity中的事件就像你习惯于使用其他语

    2024年01月25日
    浏览(52)
  • 【Solidity】Solidity Keccak256 与 SHA3-256

    Solidity Keccak256 与 SHA3-256 区块链的造富神话大家一定都有所耳闻,今天我们讨论以太坊中一项基础技术,主打一个一学就会。 看过以太坊源码或者对区块链有了解的的同学,一定都见过一个哈希算法 Keccak256 。 Keccak256 可以称它是以太坊中第一函数。 那 Keccak256 和 SHA3-256 有什

    2024年02月07日
    浏览(69)
  • solidity函数签名的实现-solidity实现智能合约教程(8)

    猛戳订阅学习专栏🍁🍁 👉 solidity系列合约源码+解析 👈 🍁🍁 函数选择器: solidity调用函数时,calldata的前4个字节为指定要调用的函数,这4个字节称为函数选择器。 以下面的代码为例。它通过地址addr的调用合约的transfer方法。 abi.encodeWithSignature(…)返回的前4个字节是函数

    2024年02月16日
    浏览(50)
  • 【区块链 | Solidity】Solidity开发教程:用Web3.js构建第一个Dapp

    Web3.js 使用的实用介绍 原文 作者:wissal haji 欢迎订阅《Solidity智能合约零基础开发教程专栏》系列文章。 如果你一直在跟着这个系列学习,那么你已经掌握了编写自己的智能合约。 因此,今天给大家介绍一下构建去中心化应用的全貌,并向大家介绍一下web3.js,这是构建da

    2024年01月24日
    浏览(50)
  • 【solidity三】Solidity中继承、创建合约和外部调用、合约事件event、solidity中元祖的使用、new、delete关键字的使用、solisity创建合约和外部调用

    - 最重要的两个全局变量 msg.sender 每一次和以太坊交互时都会产生一笔交易,这笔交易的执行人就是msg.sender。简而言之:谁调用的,msg.sender就是谁,每笔交易的msg.sender都可以不同。举例: 部署合约的时候,msg.sender就是部署的账户。 调用setMessage时,msg.sender就是调用账户。

    2024年02月03日
    浏览(43)
  • Solidity 代码执行漏洞原理

    目录 1. 三种 call 方式 2. 两种 call 参数类型 3. 漏洞场景 3.1 delegatecall 3.2 call Solidity 中一个合约调用其他合约的函数有三种方式: 1)call() call 是最常用的调用方式,call 的外部调用上下文是 被调用者合约 ,也就是指执行环境为被调用者的运行环境,调用后内置变量 msg 的值会

    2024年02月03日
    浏览(37)
  • Solidity – 数组

    数组是存储相同数据类型元素的固定集合的数据结构,其中每个元素都有一个称为索引的特定位置。我们不需要创建大量相同类型的单独变量,而是声明一个所需大小的数组并将元素存储在数组中,并且可以使用索引进行访问。在 Solidity 中,数组可以是固定大小或动态大小。

    2023年04月25日
    浏览(8)
  • solidity函数重载以及调用

    call调用重载方法查数据 send调用重载方法写数据 这款是自主研发的支持高并发multicall库 查数据 写数据 一个合约可以有多个同名但参数类型不同的函数。这个过程称为“重载”,也适用于继承的函数。下面的例子展示 f 了合约范围内函数的重载 A 。 外部接口中也存在重载函

    2024年02月09日
    浏览(39)
  • Solidity 智能合约入门

    将一个数据放置在链上 我们对代码进行逐行分析,首先第一行 第一行表明此段代码是被GPL-3.0所授权。默认情况下,在发布源代码时加入机器可读许可证说明是很重要的。 GPL(GNU General Public License Versions) GPL协议一般还可以分为GPL2.0和GPL3.0两种,而GPL3.0是更新一代的开源标准

    2024年02月02日
    浏览(45)
  • solidity(3)

    上面的代码展示了 Solidity 中地址类型的基本用法。地址类型存储一个 20 字节的值,即以太坊地址的大小。地址类型有两种:普通地址和可以转账 ETH 的地址(payable)。payable 修饰的地址可以执行转账操作,并具有两个额外的成员函数:`transfer` 和 `send`。在 payable 修饰的地址中

    2024年04月25日
    浏览(14)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包