買比特幣 買比特幣
Ctrl+D 買比特幣
ads

TRU:Rust 智能合約養成日記(7)-ODAILY_trustwallet錢包被凍結

Author:

Time:1900/1/1 0:00:00

1.浮點數運算的精度問題

不同于常見的智能合約編程語言Solidity,Rust語言原生支持浮點數運算。然而,浮點數運算存在著無法避免的計算精度問題。因此,我們在編寫智能合約時,并不推薦使用浮點數運算(尤其是在處理涉及到重要經濟/金融決策的比率或利率時)。

目前主流計算機語言表示浮點數大多遵循了IEEE754標準,Rust語言也不例外。如下是Rust語言中有關雙精度浮點類型f64的說明與計算機內部二進制數據保存形式:

浮點數采用了底數為2的科學計數法來表達。例如可以用有限位數的二進制數0.1101來表示小數0.8125,具體的轉化方式如下:

然而對于另一個小數0.7來說,其實際轉化為浮點數的過程中將存在如下問題:

BlockFi最大債權人為Ankura Trust,其次為FTX US和美國證券交易委員會:11月28日消息,據BlockFi破產申請表顯示,Ankura Trust Company, LLC是其最大債權人,擁有價值約7.29億美元的無擔保債權,其次是FTX US和美國證券交易委員會,無擔保債權分別為2.75億美元和3000萬美元。FTX US似乎源于今年早些時候向BlockFi提供的信貸額度,而美國證券交易委員會則是與BlockFi與其達成的多方調查和解金額有關。(The Block)[2022/11/28 21:07:48]

即小數0.7將表示為0.101100110011001100.....(無限循環),無法用有限位長的浮點數來準確表示,并存在“舍入(Rounding)”現象。

假設在NEAR公鏈上,需要分發0.7個NEAR代幣給十位用戶,具體每位用戶分得的NEAR代幣數量將計算保存于result_0變量中。

執行該測試用例的輸出結果如下:

Web3游戲STELLA FANTASY完成600萬美元融資,KRUST UNIVERSE參投:9月13日消息,據外媒報道,RING GAMES旗下Web3游戲STELLA FANTASY宣布完成600萬美元融資,韓國互聯網巨頭Kakao旗下公鏈KLAYTN主網開發商兼KLAYTN生態系統孵化器KRUST UNIVERSE參投。RINGGAMES首席執行官JoohoYUN透露,在KRUSTUNIVERSE支持下,預計能在年內為全球游戲玩家推出一款真正的P2E游戲,此外STELLA FANTASY第一次NFT預售將于9月14日開啟。(雅虎財經)[2022/9/13 13:25:16]

可見在上述浮點運算中,amount的值并非準確地表示了0.7,而是一個極為近似的值0.69999999999999995559。進一步的,對于諸如amount/divisor的單一除法運算,其運算結果也將變為不精確的0.06999999999999999,并非預期的0.07。由此可見浮點數運算的不確定性。

基于Arbitrum AnyTrust技術的主網Nova對開發人員開放:7月12日消息,Arbitrum官方博客今日宣布,第一條基于Arbitrum AnyTrust技術構建的新鏈Arbitrum Nova已在主網上運行,并開放供開發人員部署應用程序。今年早些時候,Arbitrum發布了AnyTrust,這是針對超低成本交易優化、更安全的新技術。隨著Nova的運行,Arbitrum有兩條獨立的鏈在主網上實時運行,可支持幾乎所有區塊鏈用例。Nova將成為游戲和社交應用程序的首選解決方案,而Arbitrum One將繼續覆蓋DeFi和NFT項目。(Medium)[2022/7/12 2:06:47]

對此,我們不得不考慮在智能合約中使用其它類型的數值表示方法,如定點數。

根據定點數小數點固定的位置不同,定點數有定點整數和定點小數兩種。

小數點固定在數的最低位之后,則稱其為定點整數

在實際的智能合約編寫中,通常會使用一個具有固定分母的分數來表示某一數值,例如分數'x/N',其中'N'是常數,'x'可以變化。

行情 | 庫幣上線Suterusu 24h內漲幅達26%:據庫幣KuCoin消息,庫幣已于2月25日上線Suterusu(SUTER)并開啟交易對:SUTER/USDT,24h內漲幅達26%。Suterusu是基于智能合約為區塊鏈交易及數據提供隱私保護。原創的零知識證明協議ZK-conSNARK,無需“可信預設”更安全,優化ZKP大小,支持智能合約,可為BTC、ETH、NEO等主流數字資產實現隱私保護。 庫幣數字貨幣交易所,為來自207個國家的500萬用戶提供幣幣、法幣、合約、礦池、借貸等一站式服務。全球每4個數字貨幣持有者就有1個是庫幣用戶。[2020/2/25]

若“N”取值為“1,000,000,000,000,000,000”,也就是:'10^18',此時小數可被表示為整數,像這樣:

在NEARProtocol中,該N常見的取值為'10^24',即10^24個yoctoNEAR等價于1個NEAR代幣。

動態 | 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]

基于此,我們可以將本小節的單元測試修改為如下方式進行計算:

以此可獲得數值精算的運算結果: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考慮舍入機制

在設計智能合約時,在舍入問題上,往往都采用“我要占便宜,他人不得薅我羊毛”的原則。根據這個原則,如果向下取整對我有利,則向下;如果向上取整對我有利,則向上;四舍五入不能確定是對誰有利,因此極少被采用。

Tags:USTTRUTOKTOKENtrustwallet錢包被凍結Truedeal TokenLODE TokenChihua Token

中幣交易所
DEX:頂峰AscendEX甄選:戰斗GameFi、音樂NFT、DeFi新星與高效Dex-ODAILY_SCE

憑借獨到的金融市場眼光,頂峰AscendEX致力在全球范圍內廣泛甄選具有應用價值潛質的優秀區塊鏈項目。精準的市場定位和嚴格的遴選標準,讓頂峰AscendEX穩居全球加密交易平臺投資回報率前列.

1900/1/1 0:00:00
BNB:波場TRON進展周報(2022.04.30-2022.05.06)-ODAILY_PETRO

過去的一周,波場TRON項目進展順利,為滿足波場TRON全球社區愛好者閱讀,本周周報共分為14種語言,請您選擇閱讀.

1900/1/1 0:00:00
COS:Cosmos專題研究二:Juno&Evmos生態繁榮的基礎-ODAILY_cosmos代幣atom幣

一、JunoNetwork介紹1.概覽—為什么要有JunoJuno由社區推動開發,是由CosmosSDK打造的一條layer1公鏈,使用Tendermint共識模塊,接入IBC協議.

1900/1/1 0:00:00
LOT:保護區塊鏈行業與市場,波場聯合儲備繼續大力度增持儲備金-ODAILY_區塊鏈

據官方消息,為保護整個區塊鏈行業和加密市場,波場聯合儲備繼續大力度增持儲備金。5月12日,波聯儲官方宣布,已先后買入1000枚BTC、1,467,612,695枚TRX及100,000,000枚.

1900/1/1 0:00:00
ACE:SupraOracles與INT3.FACE建立合作關系,彌合了DeFi與傳統金融之間的鴻溝-ODAILY_SUP

SupraOracles很高興地宣布與無縫web3去中心化交易所INT3.FACE建立合作伙伴關系。INT3.FACE是一個用戶友好的平臺,可讓您在次世代金融中進行借貸、質押等.

1900/1/1 0:00:00
DOT:波卡上各個平行鏈的資產是如何傳輸的?-ODAILY_POL

“波卡知識圖譜”是我們針對波卡從零到一的入門級文章,我們嘗試從波卡最基礎的部分講起,為大家提供全方位了解波卡的內容,當然這是一項巨大的工程,也充滿了挑戰.

1900/1/1 0:00:00
ads