以太坊價格 以太坊價格
Ctrl+D 以太坊價格
ads
首頁 > 區塊鏈 > Info

UST:Rust 智能合約養成日記(7)-ODAILY

Author:

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

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

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

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

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

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

灰度CEO:Grayscale Decentraland Trust為投資者接觸元宇宙的一種方式:金色財經報道,Grayscale首席執行官 Michael Sonnenshein 在本周活動上表示,該公司已經將其Grayscale Decentraland Trust視為投資者接觸元宇宙的一種被動方式。?對于那些不一定想積極管理Axie Infinity賬戶或為MANA建立和銷售場景的投資者來說,Grayscale Decentraland Trust一直是一種有吸引力的方式。因此,這是投資者可以考慮將資金投入到一種資產中的一種方式,這種資產將隨著像Decentraland本身這樣的元宇宙的崛起而潛在地升值,這只是幾個應用中的一個。我們一直在尋找我們也能帶給投資者的其他資產。

MANA是灰度Decentraland信托背后的唯一資產,在過去24小時內上漲高達28%。在過去的14天里,MANA的價格已經上漲了超過253%。

Grayscale Decentraland Trust 于 2 月底推出,目前管理著 4920 萬美元。它自成立以來上漲了 943.8%,僅在上個月就上漲了 235.9%。?[2021/11/13 6:49:41]

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

TrustBase首批Grant基金正式推出,Grant申請面向全球開放:據官方消息,5月14日,TrustBase Grant首批20萬美元資助金到位,地址正式對外公布。TrustBase Grant首批基金將持續擴充到100萬美元,每一個獲得Grant的項目可以得到最高價值30000美元的資助。現在TrustBase Grant申請已面向全球開放,歡迎更多的開發者和團隊申請Grant,為TrustBase生態系統增加具有價值的技術搭建,幫助增強 Polkadot提供高級功能,擴展Web 3.0系統。

TrustBase Grant由Subscript技術社區發起,HECO生態戰略合作支持,TrustBase基金會提供百萬資金支持,每個通過Grant的項目將獲得資金、技術和生態的支持。在初期,TrustBase將在HECO建立Pool,專門為通過Grant項目提供資產應用場景。[2021/5/15 22:06:18]

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

IoTeX發布開源協議TruStream:IoTeX宣布發布TruStream。TruStream是由IoTeX基金會原創的開源協議,為開發人員提供從物聯網設備獲取實時可驗證數據的功能。TruStream結合了防篡改的硬件和軟件,采用一個與區塊鏈無關的框架來創建加密簽名的數據流,這些數據流可以在IoTeX和其他網絡獲得信任、使用,甚至實現數字貨幣化。[2020/12/7 14:26:00]

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

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

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

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

SPDR Gold Trust持倉較上日減少7.12噸:全球最大黃金ETF--SPDR Gold Trust持倉較上日減少7.12噸,當前持倉量為1182.7噸。[2020/12/5 14:05:18]

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

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

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

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

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

TaurusGroup獲1100萬美元融資,阿拉伯銀行瑞士分行領投:4月29日消息, 加密基礎設施初創公司Taurus Group已獲得1000多萬英鎊(約1100萬美元)A輪融資,阿拉伯銀行瑞士分行領投,Tezos基金會和其他投資者參投。Taurus Group計劃擴大其團隊,并將其業務擴展到整個歐洲的新市場。

該公司聯合創始人Lamine Brahimi表示,“我們希望以歐洲為重點,擴大我們的工程和銷售團隊。我們計劃在倫敦、法蘭克福或巴黎等金融中心開設新的辦事處。”該公司希望在未來12到18個月內將員工人數從目前的20人增加到40人。目前還不清楚Taurus Group迄今為止的融資總金額。該公司拒絕透露總額及其估值,但表示“2019年收入達到7位數”。

據悉,總部位于日內瓦的Taurus Group成立于2018年4月,為銀行等機構客戶提供數字資產的發行、保管和轉移的基礎設施解決方案。其知名客戶包括SEBA、Vontobel和阿拉伯銀行。(The Block)[2020/4/29]

以此可獲得數值精算的運算結果: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:USTTRUTRUSTTOKTrust Wallettrustwallet錢包被凍結TrustVerseimtoken錢包清空授權

區塊鏈
DEFI:Web3如何為金融行業實現轉型-ODAILY

媒體對Web3的報道通常都聚焦在近期火爆的NFT銷售和每日cryptocurrency價格波動上。但是這只不過是冰山一角,真正的Web3遠不止如此.

1900/1/1 0:00:00
加密貨幣:世界宏觀局勢影響下,加密市場將駛向何方?-ODAILY

作者:秋月(twitter:@qiuyue_analyst);公眾號:worldeye2020 審校:Jeffrey 翻譯:biubiubird媒體:@bitmidas 恐怖的CPI數據 在20.

1900/1/1 0:00:00
BIT:Bitfinex一周簡報(0502-0508)-ODAILY

Bitfinex委任GilesDixon為授權部主管Bitfinex近日委任GilesDixon為授權部主管,他將在Bitfinex獲得全球多個司法管轄區的監管批準和牌照方面發揮主導作用.

1900/1/1 0:00:00
MOON:波卡插槽拍賣后,波卡生態項目正在做哪些探索?-ODAILY

背景 不知不覺距離波卡首次插槽拍賣已經過去了快4個月,而上個月底,波卡理事會通過了Motion158的決議,安排了今年剩余時間的平行鏈拍賣時間.

1900/1/1 0:00:00
mfers: 社會文化新風潮,我也要在Web3的世界里「躺平」-ODAILY

在《Azuki:日本動畫與Web3.0后民族身份特征》一文中,我從Azuki作為日本動畫的一個延續的角度,闡述了Web3.0的去中心化理念與日本科幻動畫里的虛擬世界相互呼應的原因.

1900/1/1 0:00:00
ETHER:Tether項目周報(0314-0320)-ODAILY

MediaCoverageTether駁回烏克蘭關于禁止俄羅斯交易的上訴此前,費多羅夫曾呼吁多家西方公司實施類似禁令.

1900/1/1 0:00:00
ads