【问题标题】:Math in Uniswap UQ112xUQ112 contractUniswap UQ112xUQ112 合约中的数学
【发布时间】:2022-12-23 03:28:00
【问题描述】:

谁能解释一下这份合同中的数学是如何运作的?

    pragma solidity =0.5.16;

// a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))

// range: [0, 2**112 - 1]
// resolution: 1 / 2**112

library UQ112x112 {
    uint224 constant Q112 = 2**112;

    // encode a uint112 as a UQ112x112
    function encode(uint112 y) internal pure returns (uint224 z) {
        z = uint224(y) * Q112; //never overflows 
    }

    // divide a UQ112x112 by a uint112, returning a UQ112x112
    function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {
        z = x / uint224(y);
    }
}

我无法理解这两个函数如何帮助分数。

谢谢你。

【问题讨论】:

  • 有趣的问题,我深入挖掘并发现 this answer 对理解这个库非常有用。

标签: math solidity uniswap


【解决方案1】:

我将库转换为合同并将函数公开以便能够在 Remix 中进行交互

contract UQ112x112 {
    uint224 constant Q112 = 2**112;

    function encode(uint112 y) public pure returns (uint224 z) {
        z = uint224(y) * Q112; //never overflows 
    }
    function uqdiv(uint224 x, uint112 y) public pure returns (uint224 z) {
        z = x / uint224(y);
    }
}
  • encode函数

    function encode(uint112 y) internal pure returns (uint224 z) {
          z = uint224(y) * Q112; //never overflows 
      }
    

这会将输入值 y 向左移动 112 位,有效地将其编码为 uint224 值。 1 位移位等于数字乘以 2。如果我调用encode(1)

如果将返回的 int 值转换为二进制 here,你会得到这个

10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

我们将输入存储在 uint224 中而不丢失精度。在 uniswap 中,价格存储在 uint224 中,因此我们将价格输入转换为 uin224

  • uqdiv函数只是简单的除法运算

    function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {
       z = x / uint224(y);
    } 
    

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 2020-10-04
    • 1970-01-01
    • 2021-09-07
    • 2021-05-15
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多