
int256定点数运算揭秘EtherEx如何优雅处理链上价格与金额精度【免费下载链接】etherexEtherEx is an open source, fully transparent, next generation decentralized exchange built on Ethereum.项目地址: https://gitcode.com/gh_mirrors/et/etherexEtherEx 是一款构建在以太坊上的开源、全透明去中心化交易所。由于区块链智能合约里没有浮点数EtherEx 用int256 大整数定点数统一表示链上价格与金额精度一套纯整数运算就完成了下单、成交、退款的全流程。本文将带你快速看懂这套定点数方案的运作原理与关键源码位置。一、为什么链上交易不能用小数 以太坊早期合约环境不支持浮点运算直接用0.0001这样的小数会引入四舍五入误差——在真金白银的交易场景中误差就是风险。EtherEx 的解法非常经典一切皆整数。价格不存0.05 ETH而是存500配合精度参数数量不存1.5 币而是存150000按代币最小单位金额不存7.5 ETH而是存 wei1 ETH 10^18 wei所有运算只用整数乘法、整数除法和移位完成结果可精确复算、可逐笔审计。二、三个关键参数定点数的坐标系在contracts/etherex.se中每个市场注册时都会写入三个精度参数参数含义示例decimals代币的小数位数数量以10^decimals放大后存储5 → 1 枚代币 100000 最小单位precision价格精度分母价格乘以它后取整存储10000 → 精度 0.0001minimum最小成交总额wei防止粉尘订单推荐 10 ETHprecision的直观理解它不是小数位而是价格的分母。precision 10000时链上价格5000表示 5000/10000 0.5 ETH。市场注册入口在add_market()方法中位于contracts/etherex.se第 398 行附近并对decimals、precision做了非负校验错误码MARKET_PRECISION_INVALID。 提示代币合约自身也用同样的思路。示例代币 ETX 在contracts/etx.se的init()中直接发放1000000 * 10^5即整数最小单位的 100 万枚代币。三、下单转换前端如何把小数变整数你在界面上输入1.5 枚 0.05 ETH前端并不会把这个小数发给链上。核心逻辑在frontend/app/clients/EthereumClient.js的getAmounts()方法中数量放大amount × 10^decimals向下取整价格放大price × precision向下取整总额换算amount × price × 10^18直接得到 wei三个整数数量、价格、总额随交易一起提交给buy()/sell()方法。买入时用户还需随交易附带等额的 ETH合约会比对msg.value与计算值不足则退回并报TRADE_AMOUNT_MISMATCH多余部分自动原路退还。四、成交结算一行整数公式完成交割撮合发生在trade()方法中contracts/etherex.se第 211 行起。当买方调用trade(max_amount, trade_ids)逐笔吃单时合约用一行公式算出应付 ETHvalue (fill × price) × 10^18 / (precision × 10^decimals)分子成交数量 × 链上整数价格再放大到 wei分母把价格精度与代币小数位一起缩小回去随后合约更新双方可用/冻结余额balances[available, trading]、划转 ETH、并写入log_fill_tx事件。若只成交一部分fill amount挂单剩余数量自动扣减全部成交则从链上彻底移除该挂单。反向的ETH 换数量同样只用整数乘法与除法例如部分成交时的数量回填公式保证买卖双方账本永远对得上。五、前端还原从整数读回人类价格 链上存的是整数界面显示的是小数中间靠big-rational大数库完成无损换算读取行情price ÷ precision还原为 0.5 ETHEthereumClient.js中多处bigRat(price).divide(precision)显示精度用String(precision).length - 1自动推算价格小数位见frontend/app/stores/TradeStore.js与frontend/app/components/LastPrice.jsx下单校验frontend/app/components/TradeFormInstance.jsx用大数库比对余额与总额避免 JS 浮点误差导致误判注册新市场时frontend/app/components/SubRegister.jsx还会把用户输入的小数精度如 0.0001反向换算成precision 10000这样的整数提交上链。六、新手上手路线图 ️想深入这套 int256 定点数方案建议按以下顺序阅读源码合约数据模型contracts/etherex.se—— 第 12 行的markets表定义是所有精度参数的源头核心交易逻辑同文件的buy()/sell()/trade()方法观察三处×10^18、÷(precision×10^decimals)公式的对称使用前端换算层frontend/app/clients/EthereumClient.js的getAmounts()与loadMarket()测试用例tests/test_etherex.py其中包含test_market_precision_invalid等参数校验测试API 文档项目根目录README.md的Price denominator章节有一句话讲透 precision 的含义结语EtherEx 用最朴素的思路解决了链上精度难题用 int256 定点数把小数运算降维成整数运算。价格精度交给市场的precision数量精度交给代币的decimals金额精度交给 18 位 wei——三者相乘相除任何一笔成交都能被任何人精确复算。这正是全透明去中心化交易所在工程层面的底气所在。【免费下载链接】etherexEtherEx is an open source, fully transparent, next generation decentralized exchange built on Ethereum.项目地址: https://gitcode.com/gh_mirrors/et/etherex创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考