Alert Source Discuss
🚧 Stagnant Standards Track: ERC

ERC-5850: 存储在 `bytes32` 类型中的复数

将复数的实部和虚部分别存储在 `bytes32` 类型的最低有效和最高有效 16 字节中。

Authors Paul Edge (@genkifs)
Created 2022-10-29
Discussion Link https://ethereum-magicians.org/t/eip-5850-store-real-and-imaginary-parts-of-complex-numbers-in-the-least-significant-and-most-significant-16-bytes-respectively-of-a-bytes32-type/11532

摘要

此 EIP 提出了一种将复数存储到 bytes32 数据类型和从中检索的自然方法。它将存储空间完全平分,最重要的是,将实数部分分配给最低有效 16 个字节,将虚数部分分配给最高有效 16 个字节。

动机

复数是许多数学和科学计算的重要工具。例如,傅里叶变换、特征函数、交流电路和纳维-斯托克斯方程都需要这个概念。

复数可以用许多不同的形式表示(多项式、笛卡尔、极坐标、指数)。该 EIP 创建了一个标准,可以适应笛卡尔、极坐标和指数格式,并为笛卡尔表示提供示例代码,其中复数只是实数对,它给出复数的实部和虚部坐标。相等的存储容量被分配给两个分量,并且它们出现的顺序被明确定义。

将复数打包到单个 bytes32 数据对象中可以节省一半的存储成本,并创建一个更自然的代码对象,可以在 Solidity 生态系统中传递。现有代码可能不需要为复数重写。例如,按 bytes32 进行映射很常见,并且在 2D 复平面中进行索引可以提高代码的可读性。

Solidity 尚未完全支持十进制数(定点或浮点),因此对复数版本强制执行类似的标准还为时过早。可以建议将诸如 prb-math 之类的定点方法与 18 个小数位一起使用,或者使用诸如 abdk 之类的浮点方法。但是,应该注意的是,只要此 EIP 适合 16 字节的空间,它就支持任何十进制数表示形式。

规范

复数将被定义为 bytes32,笛卡尔表示将使用 cnNew 函数初始化,并使用 RealIm 转换回来,两者都在下面给出。

要创建复数,可以使用

function cnNew(int128 _Real, int128 _Imag) public pure returns (bytes32){
    bytes32 Imag32 = bytes16(uint128(_Imag));
    bytes32 Real32 = bytes16(uint128(_Real));
    return (Real32>> 128) | Imag32;
}

并转换回来

function RealIm(bytes32 _cn)  public pure returns (int128 Real, int128 Imag){
    bytes16[2] memory tmp = [bytes16(0), 0];
    assembly {
        mstore(tmp, _cn)
        mstore(add(tmp, 16), _cn)
    }
    Imag=int128(uint128(tmp[0]));
    Real=int128(uint128(tmp[1]));
}

基本原理

由于此提案定义了供多个应用程序使用的复数存储/类型标准,因此需要 EIP。

此 EIP 建议将实部和虚部都打包在一个现有数据类型 bytes32 中。这样可以实现紧凑的存储,而无需结构,并有助于轻松实现库。bytes32 仍可用于现有的非复数用途。 此 EIP 仅定义实部和虚部的拆分和位置。复数的运算(加法、乘法等)、小数位数和其他此类主题留给其他 EIP 讨论。这使此 EIP 更加集中,因此更有可能成功。

在 16 个最低有效字节中定义实数允许从 uint128 直接转换为 bytes32,以表示小于 2**127 的正整数。 不建议从 bytes32 -> uint -> int 直接转换回来,因为复数可能包含虚部,或者实部可能为负数。最好始终使用 RealIm 来分离复杂部分。

可以使用 Using Complex for bytes32 语法实现用于复数运算的库,其中 Complex 将是库的名称。

向后兼容性

bytes32 数据类型的其他用途没有影响。

安全考虑

如果在 bytes32 形式中操作复数,则必须在操作期间手动执行溢出检查。

版权

CC0 下放弃版权和相关权利。

Citation

Please cite this document as:

Paul Edge (@genkifs), "ERC-5850: 存储在 `bytes32` 类型中的复数 [DRAFT]," Ethereum Improvement Proposals, no. 5850, October 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-5850.