以太幣交易所 以太幣交易所
Ctrl+D 以太幣交易所
ads

Rust 智能合約養成日記(7)-ODAILY_UST

Author:

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

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

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

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

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

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

加密投資決策平臺LunarCrush完成500萬美元A輪融資:7月12日消息,加密投資決策平臺LunarCrush完成500萬美元A輪融資,此輪融資由Draper Round Table和INCE Capital共同領投,參投方包括Draper Associates、WWVentures、TRGC、Bitcoin Frontier Fund、Draper Goren Holm、Blockchain Founders Fund、Side Door Ventures、MoonPay、EMURGO、LBANK Labs、FUNFAIR Ventures 和 Techstars。

LunarCrush 將于下周發布其社交搜索工具的測試版,該工具將允許用戶搜索平臺上的任何主題,而不僅僅是金融產品。新工具允許用戶在所有社交媒體平臺上進行搜索,以圍繞既定興趣提取最相關的內容。[2023/7/12 10:50:40]

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

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

慢霧:針對macOS系統惡意軟件RustBucket竊取系統信息:金色財經報道,SlowMist發布安全警報,針對macOS 運行系統的 Rust 和 Objective-C 編寫的惡意軟件RustBucket,感染鏈由一個 macOS 安裝程序組成,該安裝程序安裝了一個帶后門但功能正常的 PDF 閱讀器。然后偽造的 PDF 閱讀器需要打開一個特定的 PDF 文件,該文件作為觸發惡意活動的密鑰。[2023/5/23 15:20:27]

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

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

Trust Wallet:去年11月14日至23日創建新錢包的地址存在漏洞,已為受影響用戶創建補償流程:4月22日消息,加密貨幣錢包Trust Wallet發布《WASM漏洞、事件更新與建議措施》,公告指出,2022年11月,一名安全研究人員通過漏洞賞金計劃報告TrustWallet開源庫Wallet Core中的Web Assembly(WASM)漏洞。Trust Wallet Browser Extension在Wallet Core中使用WASM,Browser Extension在2022年11月14日至23日期間生成的新錢包地址包含此漏洞。TrustWallet迅速修補了漏洞,所有在這些日期之后創建的地址都是安全的。不過,TrustWallet仍然檢測到兩個潛在的漏洞,在攻擊發生時造成了大約17萬美元的總損失。對此,Trust Wallet將補償因漏洞導致的黑客攻擊而造成的符合條件的損失,并為受影響的用戶創建了補償流程。此外,Trust Wallet敦促受影響的用戶盡快轉移所有易受攻擊地址上剩余的約88,000美元余額。對于只使用Trust Wallet移動端、只將錢包地址導入瀏覽器擴展程序、在2023年11月14日之前或2022年11月23日之后僅使用瀏覽器擴展程序創建了一個新錢包的用戶不受此漏洞影響。如果用戶在TW Browser Extension收到警告通知,將有可能受到影響。對于在2022年12月下旬和2023年3月下旬存在異常資金流動的用戶,可能是遭受這兩個漏洞利用的少數受害者之一。[2023/4/22 14:20:27]

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

Chorus One宣布將收購Cryptium Labs驗證器并持續運行節點:據官方消息,Chorus One宣布將收購Cryptium Labs驗證器節點,并繼續在Tezos、Near、Polkadot和Kusama等鏈上運行。此前,Cryptium Labs宣布終止其服務,專注于其他項目。這是第一次此類收購,將使Cryptium的委托人(delegators)質押超過1.25億美元的資產,通過專業質押提供商(同樣位于瑞士)繼續賺取獎勵。[2021/3/2 18:07:49]

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

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

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

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

TrustBase自主研發波卡智能合約編程語言SubScript:據官方消息,TrustBase基于波卡智能合約獨立開發編程語言SubScript,用于優化波卡生態中的開發體驗。Subscript是一個用于Polkadot Wasm智能合約的編程語言,可以提供WebAssembly原生的的智能合約編程環境和IDE支持。相對于當前Parity官方維護的ink!語言,Subscript無需rust編程基礎,任何具備web開發基礎的DApp開發者都可以快速上手Subscript語言。Subscript此前已獲得Web3基金會的官方資助。

TrustBase是一個支持跨鏈消息的波卡Wasm智能合約平行鏈,為開發者提供了方便易用的合約語言及編程工具,DApp開發者不需要拍賣波卡中繼鏈插槽,就可以訪問波卡的XCMP跨鏈消息。[2020/12/19 15:46:32]

在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考慮舍入機制

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

Tags:USTKENTOKENTOKustc幣還有價值嗎CEO TokenINVI TokenWAX Token

歐易交易所app官網下載
Beanstalk Farm攻擊事件分析:只要票數足夠多,惡意提案也可卷走數億資產-ODAILY_BEA

北京時間2022年4月17日,CertiK審計團隊監測到Beanstalk協議被惡意利用,導致24,830ETH和36,398,226BEAN遭受損失.

1900/1/1 0:00:00
DAOrayaki:代幣化憑證及可轉移性-ODAILY_NFT

本篇文章,我想深入地探討一下NFT憑證的機制以及它是如何工作的。Web3用戶可以通過參加活動以及參與協議治理來獲得相關憑證。與其他類型的NFT想比,代幣化憑證具有不同的價值.

1900/1/1 0:00:00
波卡生態周報:波卡穩定幣生態重要事件頻現,更多資本正在涌入波卡生態 -ODAILY_DOT

波卡一周觀察,是我們針對波卡整個生態在上一周所發生的事情的一個梳理,同時也會以白話的形式分享一些我們對這些事件的觀察。本文旨在提供信息和觀點,不為任何項目作背書.

1900/1/1 0:00:00
XCM開啟后波卡生態會有怎樣的變化,并將如何反哺波卡?-ODAILY_MOON

Polkadot生態研究院出品,必屬精品 背景 在國內“五四青年節”的當天,波卡順利完成了v0.9.19版本的升級,而此次升級備受關注的當屬完成了通過XCM進行平行鏈間消息傳遞的功能.

1900/1/1 0:00:00
NFT是否提供了一種民主化和增加科學資助的方式?-ODAILY_NFT

介紹 擁有民主化的科學不是很好嗎?當然是!然而,許多人會說這是一個烏托邦的愿景,而不太可能成真.

1900/1/1 0:00:00
波卡生態周報:首個去信任的BTC轉接橋在Kusama上啟動 -ODAILY_KUS

波卡一周觀察,是我們針對波卡整個生態在上一周所發生的事情的一個梳理,同時也會以白話的形式分享一些我們對這些事件的觀察。本文旨在提供信息和觀點,不為任何項目作背書.

1900/1/1 0:00:00
ads