1.浮点数运算的精度问题
不同于常见的智能合约编程语言Solidity,Rust语言原生支持浮点数运算。然而,浮点数运算存在着无法避免的计算精度问题。因此,我们在编写智能合约时,并不推荐使用浮点数运算(尤其是在处理涉及到重要经济/金融决策的比率或利率时)。
目前主流计算机语言表示浮点数大多遵循了IEEE754标准,Rust语言也不例外。如下是Rust语言中有关双精度浮点类型f64的说明与计算机内部二进制数据保存形式:
浮点数采用了底数为2的科学计数法来表达。例如可以用有限位数的二进制数0.1101来表示小数0.8125,具体的转化方式如下:
然而对于另一个小数0.7来说,其实际转化为浮点数的过程中将存在如下问题:
Lazarus Group通过社会工程学攻击窃取CoinsPaid 3700万美元:8月8日消息,黑客组织 Lazarus Group 通过 6 个月的社会工程学攻击窃取总部位于爱沙尼亚的加密支付提供商 CoinsPaid 3700 万美元。
CoinsPaid 表示,今年 3 月份,CoinsPaid 的工程师收到一份关于技术基础设施的问题清单,这些问题来自一家所谓的乌克兰加密处理初创公司。6 月和 7 月间,工程师们收到了虚假的工作邀约。
CoinsPaid 在报告中表示,7 月 22 日,一名员工以为正在面试一份收入丰厚的工作,于是下载了恶意软件,作为所谓技术测试的一部分。黑客组织已经花费 6 个月时间了解 CoinsPaid,包括团队成员、公司的结构等所有可能的细节。当该员工下载恶意代码时,黑客就可以访问 CoinsPaid 的系统,然后利用软件漏洞成功伪造授权请求,从 CoinsPaid 热钱包中提取资金。[2023/8/8 21:31:14]
即小数0.7将表示为0.101100110011001100.....(无限循环),无法用有限位长的浮点数来准确表示,并存在“舍入(Rounding)”现象。
Parallel Crowdloan将支持Aventus和Crust竞拍波卡插槽Auction 26:8月23日消息,Parallel将在即将开始的波卡插槽Auction 26中为Aventus Network和Crust Network提供Liquid Crowdloan服务。用户可通过Parallel贡献自己的DOT支持这两个项目方竞拍插槽。
从8月29日开始,用户将能够在Parallel Liquid Crowdloan页面为Aventus和Crust众筹做出贡献,并在各自项目提供的众筹奖励上获得额外1 DOT=4 PARA奖励。
据悉,Parallel Liquid Crowdloan允许贡献者通过贡献DOT获得cDOT(贡献的DOT的1:1衍生代币)来释放Crowdloan中锁定DOT的流动性。cDOT可以在Parallel AMM上Swap DOT(需做好资产规划,确保插槽解锁时有足量cDOT可用于1:1赎回)或用作Parallel Money Market的抵押品免清算的借用DOT,cDOT在Money Market中具有免清算Loan功能。[2022/8/23 12:43:26]
假设在NEAR公链上,需要分发0.7个NEAR代币给十位用户,具体每位用户分得的NEAR代币数量将计算保存于result_0变量中。
Kyber Network加入Avalanche Rush挖矿奖励计划:金色财经报道,据官方消息,Avalanche基金会宣布DeFi流动性中心Kyber Network将加入最近推出的Avalanche Rush挖矿奖励计划。Kyber DMM(动态做市商)是在Avalanche上推出的首个DMM协议。Avalanche基金会和Kyber将在为期两个月的时间里提供相当于500万美元的流动性挖矿奖励,分布在7个流动性池中,具体包括300万美元的AVAX代币和200万美元的KNC代币。奖励措施分两阶段推出,具体日期将很快公布。[2021/9/18 23:33:44]
执行该测试用例的输出结果如下:
可见在上述浮点运算中,amount的值并非准确地表示了0.7,而是一个极为近似的值0.69999999999999995559。进一步的,对于诸如amount/divisor的单一除法运算,其运算结果也将变为不精确的0.06999999999999999,并非预期的0.07。由此可见浮点数运算的不确定性。
Crust发布Kusama平行链插槽竞拍计划:4月21日消息,波卡生态去中心化存储项目Crust发布Kusama平行链插槽竞拍计划,Crust平行网取名“Shadow”,Crust Shadow将参与Kusama平行链插槽竞拍,Crust Shadow作为使用Kusama平行链资源的桥接,功能是负责承接Kusama平行链和Crust network(主网)之间的信息交换。Crust network未来会参与波卡平行链插槽竞拍,力求接入平行链,通过平行网Crust Shadow来桥接Kusama和波卡之间的信息交换。[2021/4/21 20:43:33]
对此,我们不得不考虑在智能合约中使用其它类型的数值表示方法,如定点数。
根据定点数小数点固定的位置不同,定点数有定点整数和定点小数两种。
小数点固定在数的最低位之后,则称其为定点整数
在实际的智能合约编写中,通常会使用一个具有固定分母的分数来表示某一数值,例如分数'x/N',其中'N'是常数,'x'可以变化。
若“N”取值为“1,000,000,000,000,000,000”,也就是:'10^18',此时小数可被表示为整数,像这样:
动态 | 加密货币局OneCoin在TrustPilot上使用虚假评论吸引投资者:1月29日消息,大西洋理事会智囊团的数字取证研究实验室(DFRLab)进行的研究表明,加密货币庞氏局OneCoin在TrustPilot和Quora上使用了虚假评论,以吸引投资者。DFRLab指出,在媒体于2019年10月开始报道OneCoin的负面消息后,OneCoin在TrustPilot上出现了异常数量的五星级评论。根据该报告,在对OneCoin的579个TrustPilot评论中,有90%是正面的,且在一个月内发布了约400个五星级评论。尽管OneCoin也获得了一些一星级评价,但到目前为止,积极的评价远远超过了该评级。(cointelegraph )[2020/1/29]
在NEARProtocol中,该N常见的取值为'10^24',即10^24个yoctoNEAR等价于1个NEAR代币。
基于此,我们可以将本小节的单元测试修改为如下方式进行计算:
以此可获得数值精算的运算结果: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考虑舍入机制
在设计智能合约时,在舍入问题上,往往都采用“我要占便宜,他人不得薅我羊毛”的原则。根据这个原则,如果向下取整对我有利,则向下;如果向上取整对我有利,则向上;四舍五入不能确定是对谁有利,因此极少被采用。
标签:USTCOICOINOINThe Swedish TrustioeX coinchaincoinclowncoin
据最新消息,TRC20-USDT持有账户数达到12,105,579,突破1200万。此外,TRC20-USDT流通量也已突破417亿枚.
1900/1/1 0:00:001、什么时间开始Mint?2022年5月20日北京时间21:002、在哪里进行Mint?在官网tigervcdao.com进行Mint手机端:使用TP钱包或者Metamask钱包.
1900/1/1 0:00:00电信运营商为坦桑尼亚提供2.5亿美元的计划总部位于伦敦的公司已开始在肯尼亚安装空中节点 谷歌Loon项目气球摄影师:MartyMelville/AFP/GettyImagesWorldMobil.
1900/1/1 0:00:00Web3目的是实现价值交换,DEX处于提供这种效用和捕获价值的最佳位置,它们是如何捕获和分配价值,本文为你解答。交易费用是为DeFi协议产生现金流的最直接方法之一.
1900/1/1 0:00:00投资者一周撤资70亿美元全球最大稳定币还能稳得住么?此前,Tether声称其发行流通的USDT都与1美元挂钩.
1900/1/1 0:00:00章鱼网络创始人Louis,分享了他对链游经济系统的思考:重点1:链游的游戏经济范式发生了转变,从封闭的专卖式的经济变成真正的开放市场.
1900/1/1 0:00:00