uniswap 程序集 create2 功能如何工作?

2023-11-27

我正在查看 uniswap 代码,试图理解代码,其中大部分内容都非常清楚,但我确实有一些问题。

在这个函数中:

function createPair(address tokenA, address tokenB) external returns (address pair) {
    require(tokenA != tokenB, 'UniswapV2: IDENTICAL_ADDRESSES');
    (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
    require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS');
    require(getPair[token0][token1] == address(0), 'UniswapV2: PAIR_EXISTS'); // single check is sufficient
    bytes memory bytecode = type(UniswapV2Pair).creationCode;
    bytes32 salt = keccak256(abi.encodePacked(token0, token1));
    assembly {
        pair := create2(0, add(bytecode, 32), mload(bytecode), salt)
    }
    IUniswapV2Pair(pair).initialize(token0, token1);
    getPair[token0][token1] = pair;
    getPair[token1][token0] = pair; // populate mapping in the reverse direction
    allPairs.push(pair);
    emit PairCreated(token0, token1, pair, allPairs.length);

有装配线。根据 Solidity 文档,这部署了一个新合约,但我不明白它是如何工作的,它从哪里获取代码等等。

那么是否有可能以某种方式将其“转化”为实体呢?多谢!


它利用create2操作码允许您将合约部署到可由其字节码和盐确定的地址。

Uniswap V2 是用 Solidity 0.5 编写的,没有办法生成create2直接来自语言的操作码。因此,您必须使用低级程序集才能实际使用此操作码。

当前版本 0.8 允许通过salt参数产生create2(而不是常规的create) 操作码。

pragma solidity ^0.8;

contract UniswapV2Pair {
}

contract MyContract {
    function createPair() external {
        bytes32 salt = 0x1234567890123456789012345678901234567890123456789012345678901234;
        address pair = address(
            new UniswapV2Pair{salt: salt}()
        );
    }
}

Uniswap 使用一对代币地址的组合作为盐,并且字节码始终相同。这实际上允许为每个独特的货币对组合部署一个合约。

Example:

  • Tokens 0x123 and 0x456总会导致UniswapV2Pair合约地址0xabc.
  • 但是一旦你改变了盐,它就会改变部署的合约地址。所以代币0x123 and 0x789总会导致UniswapV2Pair合约地址0xdef.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uniswap 程序集 create2 功能如何工作? 的相关文章

  • 区块链开发之Solidity编程基础(一)

    Solidy是当前编写智能合约的主流语言 概要 sol文件结构 编译开发 引入其他文件 注释 代码注释 文档注释 合约 状态变量 类型 值类型 1 布尔类型 2 整型 3 地址 4 定长字节数组 5 有理数和整型字面量 6 枚举类型 7 函
  • 深入理解Solidity——作用域和声明

    作用域和声明 Scoping and Declarations 已声明的变量将具有其字节表示为全0的初始值 变量的初始值是任何类型的典型 零状态 zero state 例如 bool的初始值为false uint或int类型的默认值为0 对
  • Solidity:如何将 bytes32 表示为字符串

    这在其他语言中可能很简单 但我不知道如何在 Solidity 中做到这一点 我有一个bytes32像这样0x05416460deb76d57af601be17e777b93592d8d4d4a4096c57876a91c84f4a712 I
  • 如何使用 solana rust 合约发送 SOL

    我是一名 Rust Solana 开发新手 感觉我遇到的问题对大多数其他新手都有帮助 我想知道如何在指令期间将 SOL 从帐户转移到程序 然后能够将 SOL 发送回调用该指令的帐户 我读了https docs solana com 但我找不
  • 如何将 uint256 变量转换为 int256 变量?

    我试图打印uint timeStamp通过输入return timeStamp 就在下面return price 从这段代码 pragma solidity 0 6 7 import chainlink contracts src v0 6
  • 如何使用 chainlink oracle 读取 JSON 文件

    我改变了链环API消费者示例 https docs chain link docs make a http get request 读取一个 JSON 文件 其中包含我希望带入并存储在智能合约中的数据 pragma solidity 0 6
  • web3 websocket连接阻止节点进程退出

    我有一个创建 web3 websocket 连接的 Node js 进程 如下所示 web3 new Web3 ws localhost 7545 当进程完成时 我向它发送一个 SIGTERM 它不会退出 而是永远挂起 没有控制台输出 我在
  • BigQuery/以太坊数据集 - 如何编写代码

    对于以太坊数据集 如果我知道特定合约的上个月交易 任何人都可以告诉我应该如何在 BigQuery 中编写 例如 如果我想知道合约地址 0x41dbecc1cdc5517c6f76f6a6e836adbee2754de3 上个月进行了多少笔交
  • Remix 上没有自动完成/代码完成功能?

    我在 Youtube 上观看 Remix 上的教程 他在输入代码时具有自动完成功能 但我没有 有谁知道如何启用它 这将帮助我更轻松地编写代码 但我在任何地方都找不到解决方案 对我来说 只需点击左下角的 设置 按钮并启用 在编辑器中启用代码完
  • Hedera 上几乎相同的交易中“gasUsed”值存在巨大差异 - 为什么?

    我注意到所使用的气体量之间存在差异 通过交易几乎是相同的 我正在调用智能合约 连续两次使用相同的参数 两者之间的唯一区别 是我正在设置gasLimit到精确值 由返回eth estimateGas在第一个中 我正在设置gasLimit to
  • Solidity - 输入 JSON 描述的 Solidity 代码

    我想编译我的以太坊 HelloWorld sol 智能合约 在所有教程中 您都是这样做的 var solc require solc var compiledContract solc compile fs readFileSync Hel
  • 是否可以在 Solidity 智能合约创建上预留一个地址用于收税?

    我正在使用 Solidity 编程语言 并尝试实现一个合约 即每笔交易都会扣除税费 并且该税费应该转移到正在创建的合约的某个特定地址 那可能吗 是的 这是可能的 所有以太坊代币标准 ERC 20 ERC 721 仅定义一个接口和很少的其他点
  • 错误:数字最多只能安全存储 53 位

    我正在尝试在 quorum 中执行原始事务 但收到错误 错误 数字最多只能安全存储 53 位 代码是 web3 eth sendSignedTransaction rawTx then function transactionReciept
  • ERC721:转账调用者不是所有者也不是批准的

    我有一个 nftToken 合约 可以将代币铸造到 msg sender 然后我在市场合约中有一个函数 可以将 nft 从所有者转移到市场合约 但是 我收到一条错误消息 ERC721 转账调用者不是所有者也不是批准的 这是我的 nftCon
  • 通过python3计算uniswap 3.0池(对)地址

    我遇到了一个关于如何计算的问题 新的 uniswap 版本 3 池 早期版本称为pair 地址基于1 https github com Uniswap v3 sdk blob aeb1b09 src utils computePoolAdd
  • ERC20:津贴不足

    我创建了两个代币 YAY e sYAY 和一个 StakeRewards 智能合约 代码如下 SPDX License Identifier MIT pragma solidity 0 8 0 import openzeppelin con
  • Solidity 中的地址(0)是什么

    谁能向我解释一下什么address 0 是在 Solidity 中吗 我在文档中找到了以下内容 但对我来说并没有真正意义 如果目标账户是零账户 地址为0的账户 则交易创建一个新合约 如前所述 该合约的地址不是零地址 而是从发送方及其发送的交
  • NPM 无法在 Windows 上安装“truffle”

    我正在尝试使用 npm 安装 truffle 但我不熟悉 NodeJS 并且不明白为什么 npm 不会安装它 我尝试npm install g truffle在具有管理员权限的 Powershell 中 经过几行输出后 我收到以下错误消息块
  • 如何导入 AggregatorV3Interface

    我正在尝试导入 AggregatorV3 但找不到该文件 这是我的代码 提前抱歉 我仍然是一名初学者程序员 SPDX License Identifier MIT pragma solidity 0 8 9 import chainlink
  • 更新实时智能合约

    如果我有一个智能合约 其中硬编码了一些其他智能合约的地址 例如 也许我的合约有一些外部流动性挖矿金库的地址 它会定期存入一些余额 现在假设我想更新该地址列表并迁移它而不扰乱当前合约的操作 最好的方法是什么 以太坊字节码是不可变的 所以简单的

随机推荐

  • python从url保存图像

    当我使用 python 通过 urllib2 请求或 urllib urlretrieve 从 url 保存图像时遇到问题 也就是说该图片的 url 是有效的 我可以使用资源管理器手动下载它 但是 当我使用python下载图像时 该文件无法
  • pandas df 的流数据

    我正在尝试模拟使用 pandas 来访问不断变化的文件 我有一个文件读取 csv 文件 向其中添加一行 然后随机休眠一段时间以模拟批量输入 import pandas as pd from time import sleep import
  • BigQuery:如何将其中一列的类型从 INTEGER 更改为 STRING?

    在 BigQuery 中 假设我有一个包含 X 个字段的现有表 字段 1 当前是整数 但我想将其更改为字符串 我需要保留当前位于字段 1 中的数据 同时能够将字符串数据插入该字段 我认为目前在 Google BigQuery 中不可能修改列
  • Google Drive API 按名称查询返回无效

    根据 Google Drive 文档 要按名称查询文件 您可以使用 q name file name https developers google com drive v3 web search parameters 当我尝试在这里按名称
  • 图表js工具提示如何控制显示的数据

    我正在使用 Chart js 插件并使用按条形视图分组图表 当我将鼠标悬停在一组条形图上时 我可以看到一个工具提示 其中显示了这些条形图的数据 但当我将鼠标悬停在条形数据上时 我如何更改工具提示以显示我唯一的单个数据 我如何显示不同的数据信
  • ASP.NET MVC 3结构-去另一个项目中查看

    我有以下项目设置 项目A 主要 商业 Data 查看 asp net mvc 3 项目 N项目 商业 Data 查看 asp net mvc 3 项目 我如何从项目 A 调用项目 N 中的视图 并从 N 调用回 A 本质上 我想要做的是将每
  • 添加一个钩子来全局记录node.js/express中的所有节点HTTP响应

    我使用 Node js 和 Express 来处理 HTTP 请求和响应 通过使用http ServerRequest事件 我可以添加一个挂钩并记录 HTTP 请求 好像没有类似的活动http ServerResponse我想知道如何使用我
  • C++ 获取处理器 ID

    这个线程没问题 如何获取处理器和主板 ID 我想使用 C 代码而不是使用 WMI 或任何第三方库来获取处理器 ID 或者计算机上任何被证明是唯一的东西 一件事是以太网 ID 但在某些机器上它又是可移除的 我想主要将其用于许可目的 处理器 I
  • iOS7发布后是否还可以向App Store提交针对iOS5或iOS6的应用程序

    就像问题所说的 鉴于 iOS7 现已推出 我是否能够向 App Store 提交 iOS5 iOS6 应用程序 或者我的构建必须以 iOS7 为目标吗 我知道涉及大量的 UI 更改 新功能 看起来不太好等 但我只是想知道是否仍然可以提交旧目
  • 方形图像视图

    我想展示一个ImageView它在对话框内始终是方形的 尺寸可能会根据显示器的分辨率而变化 准确地说是纵向宽度 但 ImageView 需要形成尽可能大的正方形 以在其中容纳正方形图像 这是我的 XML 代码
  • Mule 3:控制是否允许执行流

    我目前的情况 我目前有一个 Mule ESB 应用程序 其中包含三个流 这些流处理来自两个不同源的消息 这三个流使用 VM 队列绑定在一起 Flow 1 入站 端点 1 gt 执行消息处理和转换 gt 出站 端点 3 Flow 2 入站 端
  • 类型错误:“tuple”和“str”实例之间不支持“<”

    我有一个构建哈夫曼树的方法 如下所示 def buildTree tuples while len tuples gt 1 leastTwo tuple tuples 0 2 get the 2 to combine theRest tup
  • Google 地图 API v3 标记重叠

    我正在使用谷歌地图制作一个应用程序 当标记重叠时 即使图标不同 也仅显示最后一个 我不希望它在这种情况下聚集 而是应该通过更改坐标来显示两者 但是 有什么解决办法吗 我认为这是一个非常优雅的解决方案 称为 蜘蛛化标记 https githu
  • 从 Active Directory PrimaryContext 获取所有用户

    我使用以下代码来访问 AD 中的用户列表 但是在将用户添加到组合框的行上 出现空引用异常 PrincipalContext AD new PrincipalContext ContextType Domain mydomainip User
  • 将 24 小时制时间转换为 Joda-Time 中的 am/pm

    我刚刚开始工作乔达时间 并让它正确显示我的日期24小时制 军事时间 但我宁愿是上午 下午 查了一下 里面提到了一天中的某个时刻我认为这是 HH 值 所以我尝试编写一个循环将其分解为 AM Pm 但它从未成功 DateTime dtf new
  • 如何在 Cython 中将 C 指针和长度包装在新型缓冲区对象中?

    我正在 Cython 中编写 Python 2 7 扩展模块 如何创建一个实现新型缓冲区接口的 Python 对象 该对象包装由 C 库提供给我的一块内存 内存块只是一串字节 而不是结构或多维数组 我得到了一个const void 指针和长
  • 我可以使用 bootstrap 来设计 HTML 电子邮件模板吗

    我需要设计一个HTML 电子邮件模板通过电子邮件发送给我的客户 我知道对于设计一个 html 电子邮件模板 不应有 css 文件linked 所有样式都应该内联到 html 中 所有图像应该是引用的通过在线服务器 url 不应存储在本地 我
  • 如何按空格分割字符串但在引号内转义空格(在java中)? [复制]

    这个问题在这里已经有答案了 我有一个像这样的字符串 Video or movie parent Media or entertainment 1 1 1 0 0 我想用空格分割它 但引号内的空格应该被忽略 所以分割后的字符串应该是 Vide
  • 使用 CLLocation 计算两个坐标之间的距离

    我在用着CLLocationDistance获取两点之间的距离 但在传递当前位置时出现错误 CLLocation current CLLocation alloc initWithLatitude startLocation coordin
  • uniswap 程序集 create2 功能如何工作?

    我正在查看 uniswap 代码 试图理解代码 其中大部分内容都非常清楚 但我确实有一些问题 在这个函数中 function createPair address tokenA address tokenB external returns