木星链 木星链
Ctrl+D收藏木星链
首页 > BNB价格 > 正文

UST:Rust 智能合约养成日记(7)

作者:

时间:1900/1/1 0:00:00

智能合约编程语言Solidity,Rust语言原生支持浮点数运算。然而,浮点数运算存在着无法避免的计算精度问题。因此,我们在编写智能合约时,并不推荐使用浮点数运算(尤其是在处理涉及到重要经济/金融决策的比率或利率时)。

目前主流计算机语言表示浮点数大多遵循了IEEE754标准,Rust语言也不例外。如下是Rust语言中有关双精度浮点类型f64的说明与计算机内部二进制数据保存形式:

浮点数采用了底数为2的科学计数法来表达。例如可以用有限位数的二进制数0.1101来表示小数0.8125,具体的转化方式如下:

然而对于另一个小数?0.7来说,其实际转化为浮点数的过程中将存在如下问题:

即小数0.7将表示为0.101100110011001100.....(无限循环),无法用有限位长的浮点数来准确表示,并存在“舍入(Rounding)”现象。

Trust Wallet与Web3Auth合作部署MPC解决方案:4月26日消息,Trust Wallet 宣布与 Web3Auth 达成合作,拟部署由其支持的 MPC(多方计算)解决方案,以消除当前对助记词的要求,保护用户免受人为错误和单点故障的影响,从而加强账户安全。用户将能够使用他们现有的 Google、Apple、Telegram 和 Discord 帐户直接访问 Trust Wallet 服务。目前 Trust Wallet 的 MPC 功能尚处于 Beta 阶段,预计不久将向所有用户开放。[2023/4/26 14:28:42]

假设在NEAR公链上,需要分发0.7个NEAR代币给十位用户,具体每位用户分得的NEAR代币数量将计算保存于result_0变量中。

执行该测试用例的输出结果如下:

现场 | 英国伦敦金融城市长William Russell:我们与FCA合作创建应对新冠肺炎问题的数字沙箱 ?:金色财经现场报道,9月24日上午,由上海市政府指导、支付宝和蚂蚁集团主办的全球高级别金融科技大会“外滩大会”在上海开幕。英国伦敦金融城第692任市长 William Russell 在现场表示,在新冠疫情期间,我们比以往过去更多时候都更依赖于技术,在这期间,金融科技发挥着稳定的作用。英国通过了投资者资助,英国各地的服务正在快速的实现数字化,一些初创企业正在抓住有利时机,推出包括人工智能、自动化和数字ID服务在内的新产品。此外,William 指出,英国伦敦金融城正在与英国财政部和创新金融局合作,对英国金融科技进行独立评估,评估结果将有利于金融界、政策制定者和监管机构,确定优先领域。

另外,英国伦敦金融城还与金融行为监管局(FCA)合作,创建应对新冠肺炎问题的数字沙箱,使初创企业和大型金融机构能够访问特定的数据。数字沙箱的举措有助于企业引入并测试新的金融项目和分销方式。[2020/9/24]

可见在上述浮点运算中,amount的值并非准确地表示了0.7,而是一个极为近似的值0.69999999999999995559。进一步的,对于诸如amount/divisor的单一除法运算,其运算结果也将变为不精确的0.06999999999999999,并非预期的0.07。由此可见浮点数运算的不确定性。

密钥管理系统Torus宣布与Solana达成合作:金色财经报道,密钥管理系统Torus官方博客近日宣布已与Solana达成合作,双方将共同构建可扩展性的主流去中心化应用程序。[2020/4/24]

对此,我们不得不考虑在智能合约中使用其它类型的数值表示方法,如定点数。

根据定点数小数点固定的位置不同,定点数有定点整数和定点小数两种。

小数点固定在数的最低位之后,则称其为定点整数

在实际的智能合约编写中,通常会使用一个具有固定分母的分数来表示某一数值,例如分数'x/N',其中'N'是常数,'x'可以变化。

若“N”取值为“1,000,000,000,000,000,000”,也就是:'10^18',此时小数可被表示为整数,像这样:

动态 | Dan Burstein出任Paxos Trust首席法律顾问兼首席合规官:据官方消息,前纽约州金融服务局(NYDFS)首席顾问Dan Burstein于6月5日就任Paxos Trust的首席法律顾问兼首席合规官。Dan Burstei拥有丰富的公司法经验,在担任纽约州金融服务局(NYDFS)首席顾问期间,专门处理金融科技、银行及其他金融机构的调查与合规等事项。

Dan Burstei就任后将负责Paxos Trust的法律与合规性事务。据悉,Dan Burstei在临时担任首席合规官期间曾完成与NYDFS的商谈,使合规稳定币PAX成为首个获得金融监管机构批准的数字资产。[2019/6/11]

在NEARProtocol中,该N常见的取值为'10^24',即10^24个yoctoNEAR等价于1个NEAR代币。

动态 | 币安Trust Wallet支持信用卡购买加密货币:据coindesk报道,币安的官方钱包Trust Wallet现已允许用户使用信用卡购买加密货币。新的支付选项是与以色列支付处理器Simplex合作提供。同时,Trust Wallet也增加了对XRP的支持。根据今日发布的公告,用户现可使用主流信用卡和借记卡购买XRP、BTC、BCH、LTC和ETH。该公告未具体指明支持哪些种类的卡或其他详细信息,如费用。[2019/3/13]

基于此,我们可以将本小节的单元测试修改为如下方式进行计算:

以此可获得数值精算的运算结果:0.7NEAR/10=0.07NEAR

2.Rust整数计算精度的问题

从上文第1小节的描述中可以发现,使用整数运算可解决某些运算场景中浮点数运算精度丢失问题。

但这并非意味着使用整数计算的结果完全是准确可靠的。本小节将介绍影响整数计算精度的部分原因。

2.1运算顺序

同一算数优先级的乘法与除法,其前后顺序的变化可能直接影响到计算结果,导致整数计算精度的问题。

例如存在如下运算:

执行单元测试的结果如下:

我们可以发现result_0=a*c/b?及?result_1=*c尽管它们的计算公式相同,但是运算结果却不同。

分析具体的原因为:对于整数除法而言,小于除数的精度会被舍弃。因此在计算result_1的过程中,首先计算的(a/b)会率先失去计算精度,变为0;而在计算result_0时,会首先算得a*c的结果20_0000,该结果将大于除数b,因此避免了精度丢失的问题,可得到正确的计算结果。

2.2过小的数量级

该单元测试的具体结果如下:

可见运算过程等价的result_0和result_1运算结果并不相同,且result_1=13更加地接近于实际预期的计算值:13.3333....

3.如何编写数值精算的Rust智能合约

保证正确的精度在智能合约中十分重要。尽管Rust语言中也存在整数运算结果精度丢失的问题,但我们可以采取如下一些防护手段来提高精度,达到令人满意的效果。

3.1调整运算的操作顺序

令整数乘法优先于整数的除法。

3.2增加整数的数量级

整数使用更大的数量级,创造更大的分子。

比如对于一个NEARtoken来说,如果定义其上文所描述的N=10,则意味着:若需要表示5.123的NEAR价值,则实际运算所采用的整数数值将表示为5.123*10^10=51_230_000_000。该值继续参与后续的整数运算,可提高运算精度。

3.3积累运算精度的损失

对于确实无法避免的整数计算精度问题,项目方可以考虑记录累计的运算精度的损失。

假设如下使用fndistribute(amount:u128,offset:u128)->u128为USER_NUM位用户分发代币的场景。

在该测试用例中,系统每次将给3位用户分发10个Token。但是,由于整数运算精度的问题,第一轮中计算per_user_share时,获得的整数运算结果为10/3=3?,即第一轮distribute用户将平均获得3个token,总计9个token被分发。

此时可以发现,系统中还剩下1个token未能分发给用户。为此可以考虑将该剩余的token临时保存在系统全局的变量offset中。等待下次系统再次调用distribute给用户分发token时,该值将被取出,并尝试和本轮分发的token金额一起分发给用户。

如下为模拟的代币分发过程:

可见当系统开始第3轮地分发代币时,此时系统积累的offset值已达到2,该值将再次与本轮所要分发的10个token累加在一起,发放给用户。(本次计算?per_user_share=token_to_distribute/USER_NUM=12/3=4将不存在精度损失。)

从整体上来看,在前3轮中,系统一共发放了30个Token。每个用户在每一轮中分别获得了3、3、4个token,此时用户也总计获得30个token,达到了系统足额发放奖金目的。

3.4使用RustCrate库?rust-decimal

该Rust库适用于需要有效精度计算和没有舍入误差的小数金融计算。

3.5考虑舍入机制

在设计智能合约时,在舍入问题上,往往都采用“我要占便宜,他人不得薅我羊毛”的原则。根据这个原则,如果向下取整对我有利,则向下;如果向上取整对我有利,则向上;四舍五入不能确定是对谁有利,因此极少被采用。

标签:USTTOKEKENTOKENJUSTICE币AAX TokenKENNY价格Snake Token

BNB价格热门资讯
FIL:ZBG平臺關於開放DIA/USDT交易的公告

公告编号2022033101各位關心ZBG的投資者們和項目方:ZBG將於HKT2022年4月2日上線DIA項目,並開放DIA/USDT交易對,具體時間如下,請投資人和項目方提前做好交易準備.

1900/1/1 0:00:00
AFU:惯犯欺诈高危项目SAFUU协议已被CertiK安全排行榜除名

CertiK在KYC过程中发现,SAFUU协议创始人与CleverDeFi及?TagzExchange高风险项目相关.

1900/1/1 0:00:00
DAO:DAO亦有道:「A」到什么程度才能无为而治

市场上对于DAO的讨论与研究数不胜数,但大多都是关于DAO的历史发展、定义和作用,目前还有没就DAO的自治“A”程度进行分类的相关内容.

1900/1/1 0:00:00
BDC:币生有财:顶部如期形成,行情即将进入周末,还会走低吗

前言:投资有风险,操作需谨慎。文章审核需要时间,会出现延迟发布情况,文章仅供参考,欢迎阅览!本文撰写时间:4月1日14:59行情回顾昨日如期开始回落.

1900/1/1 0:00:00
NFT:ZT創新板即將上線NFTY

親愛的ZT用戶:ZT創新板即將上線NFTY,並開啟NFTY/USDT交易對。具體上線時間如下:充值:已開啟;交易:2022年3月30日18:00;NFTY項目簡介:NFTY是一個跨鏈Web3認證.

1900/1/1 0:00:00
ATM:2022/4/5 唯客福利大放送天天红包雨名单

尊敬的唯客用户您好!唯客福利大放送活动四:天天红包雨活动方式:活动期间每天抽出10位有完成合约交易的用户随机送8、18、38、68、88USDT,周一至周五不限币种,周六指定BTC/USDT.

1900/1/1 0:00:00