1.浮點數運算的精度問題
不同于常見的智能合約編程語言Solidity,Rust語言原生支持浮點數運算。然而,浮點數運算存在著無法避免的計算精度問題。因此,我們在編寫智能合約時,并不推薦使用浮點數運算(尤其是在處理涉及到重要經濟/金融決策的比率或利率時)。
目前主流計算機語言表示浮點數大多遵循了IEEE754標準,Rust語言也不例外。如下是Rust語言中有關雙精度浮點類型f64的說明與計算機內部二進制數據保存形式:
浮點數采用了底數為2的科學計數法來表達。例如可以用有限位數的二進制數0.1101來表示小數0.8125,具體的轉化方式如下:
然而對于另一個小數0.7來說,其實際轉化為浮點數的過程中將存在如下問題:
EOS EVM項目Trust將實現RPC全兼容,并將在未來啟動黑客松:4月19日消息,EOS網絡基金會在Twitter Space舉辦EOS EVM發布會活動,期間EOS EVM核心貢獻者Matias Romeo和Yarkin博士表示:EOS EVM將具有確定性的Gas計算、指令集級別的EVM兼容性以及完全的RPC兼容。Trust為EOS公鏈帶來了一個新的運行時系統,允許EVM合約和EOS合約交互,并由此打開了諸多全新應用可能性,例如通過無需擔保的跨鏈橋來轉移Token。
EOS作為一個久經考驗、性能優秀的公鏈,Trust可以在延遲方面使Web3的交互體驗接近Web2。基于這些現狀,ENF將在之后為Trust項目組織黑客松,邀請全球開發人員開發出推動EOS和EVM元宇宙發展的優質應用和項目。
未來Trust EVM發展路線圖還將包括:1、基于Erigon的架構,通過插件拓展EOS客戶端(nodeos)來實現支持JSON-RPC;2、優化EVM實現以支持更高的交易通量;3、完成EVM預編譯合約的支持;4、使改動后的EOS客戶端支持Graph等。[2022/4/20 14:34:37]
即小數0.7將表示為0.101100110011001100.....(無限循環),無法用有限位長的浮點數來準確表示,并存在“舍入(Rounding)”現象。
去中心化存儲激勵層協議Crust Network發布經濟白皮書草案:去中心化存儲激勵層協議 Crust Network 發布經濟白皮書草案,闡述了Crust網絡參與者的角色、通證體系、經濟模型、交易市場和治理機制。
Crust Network表示,該項目實現了去中心化存儲的激勵層協議,適配包括IPFS在內的多種存儲層協議,并對應用層提供支持,同時Crust的架構也有能力對去中心化計算層提供支持,構建分布式云生態。另外,Crust還表示將作為平行鏈加入波卡生態,為 Web3 應用提供去中心化的存儲。[2020/6/5]
假設在NEAR公鏈上,需要分發0.7個NEAR代幣給十位用戶,具體每位用戶分得的NEAR代幣數量將計算保存于result_0變量中。
執行該測試用例的輸出結果如下:
黃金ETF SPDR Gold Trust持倉降低1.52%:全球最大黃金ETF--SPDR Gold Trust持倉較上日減少14.04噸,降幅1.52%,當前持倉量為908.19噸。[2020/3/21]
可見在上述浮點運算中,amount的值并非準確地表示了0.7,而是一個極為近似的值0.69999999999999995559。進一步的,對于諸如amount/divisor的單一除法運算,其運算結果也將變為不精確的0.06999999999999999,并非預期的0.07。由此可見浮點數運算的不確定性。
對此,我們不得不考慮在智能合約中使用其它類型的數值表示方法,如定點數。
根據定點數小數點固定的位置不同,定點數有定點整數和定點小數兩種。
小數點固定在數的最低位之后,則稱其為定點整數
在實際的智能合約編寫中,通常會使用一個具有固定分母的分數來表示某一數值,例如分數'x/N',其中'N'是常數,'x'可以變化。
若“N”取值為“1,000,000,000,000,000,000”,也就是:'10^18',此時小數可被表示為整數,像這樣:
動態 | Prime Trust取消數字資產托管費用:據CoinDesk報道,內華達信托公司Prime Trust宣布,已將加密貨幣和代幣的存儲費用降至0美元,與股票和債券的托管費用一致,立即生效。[2019/2/1]
在NEARProtocol中,該N常見的取值為'10^24',即10^24個yoctoNEAR等價于1個NEAR代幣。
基于此,我們可以將本小節的單元測試修改為如下方式進行計算:
以此可獲得數值精算的運算結果:0.7NEAR/10=0.07NEAR
2.Rust整數計算精度的問題
動態 | 上市公司Systech與FarmaTrust合作 提供藥物區塊鏈解決方案:據PRnewswire消息,上市公司晶門科技(Systech)宣布與FarmaTrust合作,為制藥行業提供可靠的藥物區塊鏈解決方案,保證藥品供應鏈的安全性和真實性。據悉,FarmaTrust是全球藥品跟蹤系統。[2018/9/13]
從上文第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:USTTOKENTOKETOKtrustwallet安卓版下載VANCAT Sperm TokenGanesha Tokenimtoken錢包官方版下載教程
轉眼間已經陪伴CertiK走入了第五個年頭,然而隨著閱盡千篇審計報告,卻一直有一個問題,讓譬如小編這樣的技術門外漢倍感疑惑。有的時候,我們辨別一個項目的代碼是否優質,就是查看它的審計報告.
1900/1/1 0:00:00區塊鏈擁有可以改變我們飲食方式的潛力,而豪華NFT型餐廳只觸及了這種潛力的表面。 DAOs與過去傳統合作社形式的組織有很多共同點——比如其中的參與者都很喜歡美食.
1900/1/1 0:00:00Manta/Calamari的社區朋友們好!非常感謝大家對于Dolphin測試網V1版本的支持。我們收到了很多有建設性的反饋,并根據這些反饋對產品進行了改進.
1900/1/1 0:00:00Web3目的是實現價值交換,DEX處于提供這種效用和捕獲價值的最佳位置,它們是如何捕獲和分配價值,本文為你解答。交易費用是為DeFi協議產生現金流的最直接方法之一.
1900/1/1 0:00:00MinterestLBP通證活動 如何參加 開創性借貸協議Minterest由行業領導者創建,通過為用戶提供最高的DeFi的長期收益率旨在為數十億TVL提供服務,挑戰現有DeFi項目.
1900/1/1 0:00:00Jan.2022,Sabrina@footprint.networkDataSource:FootprintAnalytics目前AssangeDAO是JuiceBox歷史上最大的DAO.
1900/1/1 0:00:00