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.