火星链 火星链
Ctrl+D收藏火星链

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

Fireblocks与Capital Trust Group合作发行数字债券:金色财经报道,加密托管技术提供商Fireblocks与Capital Trust Group合作,帮助后者称为新西兰第一家在公共区块链平台 Polygon 上以证券代币形式推出数字债券的投资管理公司。该数字债券名为“Private Jet Residence Securities Token(PJST)”,主要用于支持超豪华私人飞机和高尔夫球场项目,Fireblocks在该项目中主要负责安全铸造、销毁、自我托管并将债券分发给投资者,一旦投资者完成购买,债券的所有权将记录在区块链上。此外,Capital Trust Group还宣布与Power-All Networks Ltd. (PAN)达成合作,旨在将实物资产数字化并为传统业务带来创新。(digitaljournal)[2023/2/12 12:02:24]

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

Negentropy Capital联合BikeRush向Boring Games Studio投资200万美元:6月6日消息,Negentropy Capital 联合 Ride-to-Earn 项目 BikeRush 向新加坡游戏工作室 Boring Games Studio 投资 200 万美元,将共同打造 P2E 策略卡牌和足球经营类游戏,同时近期将推出的 HeroRush 卡牌策略游戏将融合 BikeRush 已有的 Token 经济模型,持续扩大 BikeRush 的 Web3 正向外部性生态系统。[2022/6/6 4:06:34]

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

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

TrustBase中国区负责人尔尔:在波卡生态愈加丰富状态下更看好DeFi领域:据官方消息,币赢CoinW《共识52》第十五期《Polkadot的进化之路——奠定波卡生态繁荣的基础设施》主题AMA中尔尔表示,

长期来看,我们知道DeFi这两年之所以很火,主要是因为流动性挖矿带来的流量引入。但事实上,目前的DeFi带来流动性价值的同时也带来了泡沫,一些真正的大方向,比如大数据、物联网、VR和人工智能等主流产业还没有与DeFi有机结合,形成“去中心化的供应链金融”。波卡生态已经有一些项目觉察到了这点并开始尝试,包括TrustBase(我们自己把它称作DeFi2.0)。我希望能够在波卡国度看到这种更为宏观的、全面的、建设性的DeFi,那将是未来社会影响力最大的领域。[2021/3/10 18:33:12]

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

霍比特交易所即将上线ADAUSDT、ZECUSDT和XMRUSDT永续合约:据霍比特HBTC官方公告,霍比特HBTC USDT永续合约板块将于1月13日16:00(UTC+8)上线ADAUSDT、ZECUSDT和XMRUSDT永续合约,最高支持50倍杠杆

目前霍比特HBTC USDT永续合约板块已涵盖BTC、ETH、DOT等十余个主流币种,最高支持100倍杠杆,可高效满足用户交易需求,提供专业、安全的合约交易服务。[2021/1/12 15:58:59]

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

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

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

日本LasTrust推出新服务,可在区块链上颁发数字毕业证书:日本LasTrust公司推出了一项在区块链上提供数字毕业证书的服务。该服务使用链上证书发布平台CloudCerts对传统的毕业证书进行数字化,此举旨在减少在COVID-19疫情期间接受证书时的面对面接触。(Brave New Coin)[2020/7/21]

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

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

标签:USTTOKENTOKETOKtrustwallet大陆无法访问Freemoon TokenFNDZ TokenGolden Society Token V2

比特币交易热门资讯
DOG:Dogemetaverse (DOGEMETA)

一、项目简介?DOGEMETA是为那些喜欢生活在自己的Dogemetaverse的人而制造的硬币。一枚代币,可以满足你的需要,并将爱传播给你周围的人.

1900/1/1 0:00:00
SDT:Gate.io槓桿代幣福利大放送——交易熱門GMT3L/S, 加入官方社羣,瓜分$6K獎池!首次交易贏新人禮!

Gate.io最新熱門槓桿代幣的福利大放送活動即將開啟!我們將爲新老用戶送出三重好禮,總價值6000美元!活動期間按要求完成下列任務,即可獲得對應獎勵.

1900/1/1 0:00:00
ARK:AVAX首个运动元宇宙PARKOUR爆火出圈

2022年,元宇宙、NFT、GameFi可以说是区块链最具流量的板块,吸引了更多领域的资本跨域融合,游戏元宇宙、音乐元宇宙、动漫元宇宙等,随着耐克、李宁、NBA、球队的入局.

1900/1/1 0:00:00
TPS:WEEX唯客-商务助理

商务助理-岗位职责会议安排协助接待和代理谈判,维护日常数据查询和自动化程序维护-任职资格有商务经验與培训经验会SQL,有编程经验者优先沟通能力强,性格乐观可远程办公,能多国语言的优先.

1900/1/1 0:00:00
SDT:MEXC關於FREE3L、 BAKE3L、 XTZ5L、 SRM3L和APX3L等11種ETF產品進行份額合並的公告

尊敬的用戶:由於杠桿ETF產品FREE3L、BAKE3L、XTZ5L、SRM3L、APX3L、SHIB3L、TRX3L、ICP3L、BAL3L、XMR3L、BAT3L和CVC3L的單價均低於0.

1900/1/1 0:00:00
KING:BiKing币王交易所迎来全新升级,带你遨游加密数字体系

DeFi这一创新性的概念,极大地刷新了市场认知,伴随着极速增长的市场份额和日新月异的发展攻势,为中心化数字资产平台带来了前所未有的机遇与挑战.

1900/1/1 0:00:00