宇宙链 宇宙链
Ctrl+D收藏宇宙链
首页 > 加密货币 > 正文

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)”现象。

Coinbits披露与其受Prime Trust的影响,承诺会为用户追回资产:6月29日消息,比特币投资APP Coinbits在推特上披露了其与加密托管机构Prime Trust的关系,Coinbits表示,仍有许多未知因素,但我们打算为那些在Prime Trust锁定资金的会员而战。内华达州监管机构的请愿书似乎表明Prime Trust仍然有足够的比特币来兑现我们会员的余额。我们正在代表我们的会员追回这些资产。目前Coinbits App的大部分功能都处于离线状态,但我们正在开发新的解决方案,并打算尽快恢复我们的服务。

此前昨日消息,美国内华达州监管机构已申请接管Prime Trust。[2023/6/29 22:07:06]

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

Paradigm已在Github开源基于Rust的以太坊客户端Reth:12月8日消息,Paradigm已在Github开源基于Rust的以太坊客户端Reth,目前其代码尚未被审计,任何人都可以在Apache/MIT许可下使用,没有任何附加条件,并鼓励社区对它进行分叉,同时贡献文档、问题、请求等。

此前报道,11月Paradigm宣布正在构建基于Rust的以太坊客户端Reth,不包含任何现有客户端的代码,而是建立在包括Geth、Erigon和Akula在内的客户端的基础上,核心目标是模块化、开源友好性与性能。[2022/12/8 21:31:11]

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

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

Russell Coin(RC)将于3月29日16:00开启RC/USDT交易:据ZBG官方消息,Russell Coin(RC)将于3月29日16:00开启RC/USDT交易;另外“充值RC瓜分1万枚RC”活动已于24日启动,活动期间,用户从外部地址向平台成功充值RC的用户,将按照净充值(充值-提现)数量瓜分总计1万枚RC奖励。

罗素币(RC)于2017年11月21日创世,总量2100万个。RC科学的采用了完全去中心化的主节点奖励计划,POW挖矿纳税给主节点的激励机制,结合最新X20R算法,达到电脑挖矿能耗更低,抗双花攻击,环形加密匿名性更强。独创安卓手机钱包的X20R科学算法,实现了移动匿名区块快速转账技术。更多详情请咨询官网公告。[2021/3/25 19:17:36]

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

Crust Network 品牌负责人佑安 :Crust Network即将开启去中心化存储市场:2021年1月25日晚,由Gate.io主办的直播专访节目《酒局币赴》邀请到Crust Network 品牌负责人——佑安直播分享近期最新发展。直播期间佑安与Gate.io合伙人酒儿就 Crust Network开启去中心化存储市场进行了探讨与交流。佑安表示,Maxwell预览网——Maxwell 1.0 版本正式上线,所有用户都可以通过测试网代币在网络上进行交易、担保和存储,也可以提供存储空间成为节点进行挖矿。Crust相比Filecoin具有成本低、成熟度高、落地性高等优点,挖矿门槛更低,用户落地更高效便捷。对于无币、想参挖矿的用户,也可以通过选择可以信赖的担保人的形式参与挖矿。同时,Crust Network作为波卡生态领域唯一一个存储类项目,对于波卡卡槽拍卖非常有信心,并将积极备战波卡插槽拍卖,将拿出生态发展的约40%用于波卡插槽竞拍以及相关的支出。[2021/1/25 13:28:13]

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

公告 | OKEx将支持HORUS、CHL和IQ的发放:OKEx官方发布公告,将支持HORUS、CHL和IQ的发放。其中HORUS和CHL计划将于7月22日前发放,IQ已与项目方沟通,待其后发放。[2018/7/16]

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

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

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

在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考虑舍入机制

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

标签:USTTOKETOKTOKENcrust币挖矿教程Thrive TokenDLP Duck TokenGenshin Impact Token

加密货币热门资讯
Gate.io Startup:XY Finance (XY) Sale Result & Listing Schedule

1XYFinance(XY)TokenSaleResultTheGate.ioStartupXYFinance(XY)saleresultisasfollows:XYStartupSaleAmount:178.

1900/1/1 0:00:00
Jump Crypto:详解各类区块链扩容解决方案

原文作者:RahulMaganti,JumpCrypto合伙人原文标题:《AFrameworkforAnalyzingL1s》 原文编译:胡韬.

1900/1/1 0:00:00
Bitfinex To List Gala Games (GALA)

We'repleasedtoannouncethatBitfinexwilllistGalaGames(GALA).DepositsofGALA(ERC-20)arenowopenasof15/03/22at10:00AMUTC.

1900/1/1 0:00:00
BCHUSDT合约参数调整公告

尊敬的唯客用户您好! 因应近日市场坡动剧烈,部份用户操作BCHUSDT时,伴随着较高之风险,为保护用户的资金安全,BCHUSDT闪电交易已优化,最大可开张数调整为500张,请用户多注意交易风险.

1900/1/1 0:00:00
AVAT交易送空投 - 豪送333,333 AVAT!

亲爱的BitMart用户,AVATANETWORK(AVAT)将于2022年4月7日20:00(香港时间)上线BitMart!为庆祝AVAT上线,我们向广大交易用户开放AVAT交易送空投活动—瓜分333.

1900/1/1 0:00:00
BKEX 关于上线 COW(CoW Protocol) 并开放充值功能的公告

尊敬的用户:?????????BKEX即将上线COW,详情如下:上线交易对:COW/USDT??币种类型:ERC20充值功能开放时间:已开放交易功能开放时间:2022年3月31日17:00提现功能开放时间:2022年4月1日15:00.

1900/1/1 0:00:00