1.浮點數運算的精度問題
不同于常見的智能合約編程語言Solidity,Rust語言原生支持浮點數運算。然而,浮點數運算存在著無法避免的計算精度問題。因此,我們在編寫智能合約時,并不推薦使用浮點數運算(尤其是在處理涉及到重要經濟/金融決策的比率或利率時)。
目前主流計算機語言表示浮點數大多遵循了IEEE754標準,Rust語言也不例外。如下是Rust語言中有關雙精度浮點類型f64的說明與計算機內部二進制數據保存形式:
浮點數采用了底數為2的科學計數法來表達。例如可以用有限位數的二進制數0.1101來表示小數0.8125,具體的轉化方式如下:
然而對于另一個小數0.7來說,其實際轉化為浮點數的過程中將存在如下問題:
Trust Wallet發起Arweave整合提案:12月25日消息,Trust Wallet表示正在尋求增加對數據存儲協議Arweave的支持,該提案旨在整合原生代幣Arweave(AR),目前AR代幣主要用于獎勵網絡礦工和支付網絡數據上傳費用。本次提案投票將于世界標準時間12月27日凌晨3點結束。
Arweave是一個數據存儲協議,可以直接在其原生區塊鏈上永久存儲數字資產,例如交易、智能合約、網頁、視頻、圖像等。[2021/12/25 8:03:13]
即小數0.7將表示為0.101100110011001100.....(無限循環),無法用有限位長的浮點數來準確表示,并存在“舍入(Rounding)”現象。
假設在NEAR公鏈上,需要分發0.7個NEAR代幣給十位用戶,具體每位用戶分得的NEAR代幣數量將計算保存于result_0變量中。
執行該測試用例的輸出結果如下:
Penguin Finance從Avalanche Rush計劃獲得250萬美元獎勵:金色財經報道,據官方消息,Penguin Finance(PeFi)正式加入Avalanche Rush計劃,將獲得價值250萬美元的AVAX獎勵,用于其第二層流動性挖礦“Igloos”和Penguin Emperor游戲。[2021/10/23 20:50:16]
可見在上述浮點運算中,amount的值并非準確地表示了0.7,而是一個極為近似的值0.69999999999999995559。進一步的,對于諸如amount/divisor的單一除法運算,其運算結果也將變為不精確的0.06999999999999999,并非預期的0.07。由此可見浮點數運算的不確定性。
對此,我們不得不考慮在智能合約中使用其它類型的數值表示方法,如定點數。
根據定點數小數點固定的位置不同,定點數有定點整數和定點小數兩種。
小數點固定在數的最低位之后,則稱其為定點整數
在實際的智能合約編寫中,通常會使用一個具有固定分母的分數來表示某一數值,例如分數'x/N',其中'N'是常數,'x'可以變化。
中幣(ZB)將于4 月19日上線CHZ(Chiliz)及CRU(Crust):中幣(ZB)于2021年4月19日16:00開放CHZ(Chiliz)及CRU(Crust)充值。4月21日14:00開放CHZ/USDT和CHZ/QC交易;16:00開放CRU/USDT和CRU/QC交易。更多詳情等查看中幣官方公告。[2021/4/19 20:35:26]
若“N”取值為“1,000,000,000,000,000,000”,也就是:'10^18',此時小數可被表示為整數,像這樣:
在NEARProtocol中,該N常見的取值為'10^24',即10^24個yoctoNEAR等價于1個NEAR代幣。
基于此,我們可以將本小節的單元測試修改為如下方式進行計算:
Kingdom Trust首席執行官:比特幣是奧地利經濟學的數字體現:金融托管公司Kingdom Trust的首席執行官Ryan Radloff認為,比特幣(BTC)是奧地利經濟學的一種體現。Ryan Radloff第一次接觸比特幣是在2011年底,然后他很快就開始積累比特幣。與許多早期采用者不同,Radloff表示,吸引他使用加密技術的不是支撐比特幣的技術,而是這種新興加密貨幣所體現的經濟原則。他稱,“在我們這個時代,政府一直在印鈔,但過去幾代人不是這樣的。很多人都不了解金本位和奧地利基礎經濟和市場的概念,比特幣現在重新開啟了這種對話。”(Cointelegraph)[2020/6/1]
以此可獲得數值精算的運算結果:0.7NEAR/10=0.07NEAR
2.Rust整數計算精度的問題
從上文第1小節的描述中可以發現,使用整數運算可解決某些運算場景中浮點數運算精度丟失問題。
但這并非意味著使用整數計算的結果完全是準確可靠的。本小節將介紹影響整數計算精度的部分原因。
聲音 | Bitfury Russia總經理:加密貨幣有助于監控國有資產使用 避免公款盜用:據俄羅斯衛星通訊社消息,礦業巨頭Bitfury Group俄羅斯分公司總經理德米特里·烏法耶夫在東方經濟論壇期間對媒體表示,加密貨幣有助于監控國有資產使用,避免公款盜用。他指出,\"有別于無現金支付,使用加密貨幣能跟蹤觀察各種代幣,相應地你可以清楚地判斷,如果撥了一筆資金,這筆錢具體花在了哪。在這方面加密貨幣的主要優點是可以用來監管資金的分配。\"[2018/9/13]
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:USTTOKETOKTOKENtrustwallet錢包錢不見了Tribal TokenRouletteTokenChihua Mom Token
全球保險行業市值高達數萬億美元。大到頂尖跨國企業,小到個人,都需要購買保險來防范重大風險。保險公司的業務范圍也非常廣,大到幾十億美元的供應鏈,小到個人數碼產品,都有對應的保險產品.
1900/1/1 0:00:00Jan.2022,vincy@footprint.networkDataSource:FootprintAnalytics-2021BTCDashboard本文是FootprintAnalyti.
1900/1/1 0:00:00今日,BoredApeYachtClub在推特發布與之有關的生態治理系統代幣ApeCoin正式推出.
1900/1/1 0:00:00一、前言 北京時間2022年3月21日,知道創宇區塊鏈安全實驗室監測到BSC鏈和以太坊上的UmbNetwork獎勵池遭到黑客攻擊,損失約70萬美元。實驗室第一時間對本次事件進行跟蹤并分析.
1900/1/1 0:00:00內容整理:付茗瑤 后期編輯:張悅然、JaniceDeGame.com是新加坡區塊鏈公司L2Y旗下的去中心化區塊鏈游戲聚合平臺,為玩家與投資者提供一站式體游戲體驗.
1900/1/1 0:00:001、Qredo誕生于熊市首先要注意的是,Qredo并不是在牛市泡沫中一夜之間冒出來的。早在2018年,Brian、Anthony和其他聯合創始人就開始將去中心化托管的想法整合在一起——給了當時的.
1900/1/1 0:00:00