智能合約編程語言Solidity,Rust語言原生支持浮點數運算。然而,浮點數運算存在著無法避免的計算精度問題。因此,我們在編寫智能合約時,并不推薦使用浮點數運算(尤其是在處理涉及到重要經濟/金融決策的比率或利率時)。
目前主流計算機語言表示浮點數大多遵循了IEEE754標準,Rust語言也不例外。如下是Rust語言中有關雙精度浮點類型f64的說明與計算機內部二進制數據保存形式:
浮點數采用了底數為2的科學計數法來表達。例如可以用有限位數的二進制數0.1101來表示小數0.8125,具體的轉化方式如下:
然而對于另一個小數?0.7來說,其實際轉化為浮點數的過程中將存在如下問題:
即小數0.7將表示為0.101100110011001100.....(無限循環),無法用有限位長的浮點數來準確表示,并存在“舍入(Rounding)”現象。
Trust Wallet發起Arweave整合提案:12月25日消息,Trust Wallet表示正在尋求增加對數據存儲協議Arweave的支持,該提案旨在整合原生代幣Arweave(AR),目前AR代幣主要用于獎勵網絡礦工和支付網絡數據上傳費用。本次提案投票將于世界標準時間12月27日凌晨3點結束。
Arweave是一個數據存儲協議,可以直接在其原生區塊鏈上永久存儲數字資產,例如交易、智能合約、網頁、視頻、圖像等。[2021/12/25 8:03:13]
假設在NEAR公鏈上,需要分發0.7個NEAR代幣給十位用戶,具體每位用戶分得的NEAR代幣數量將計算保存于result_0變量中。
執行該測試用例的輸出結果如下:
可見在上述浮點運算中,amount的值并非準確地表示了0.7,而是一個極為近似的值0.69999999999999995559。進一步的,對于諸如amount/divisor的單一除法運算,其運算結果也將變為不精確的0.06999999999999999,并非預期的0.07。由此可見浮點數運算的不確定性。
中幣(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]
對此,我們不得不考慮在智能合約中使用其它類型的數值表示方法,如定點數。
根據定點數小數點固定的位置不同,定點數有定點整數和定點小數兩種。
小數點固定在數的最低位之后,則稱其為定點整數
在實際的智能合約編寫中,通常會使用一個具有固定分母的分數來表示某一數值,例如分數'x/N',其中'N'是常數,'x'可以變化。
美國橄欖球明星Russell Okung將以比特幣支付工資:12月28日,“用比特幣支付工資”(Pay me in bitcoin)已成為美國國家橄欖球聯盟球員Russell Okung的現實。據悉,Okung于2019年5月在推特上首次提出使用比特幣支付工資的要求,這項協議是與比特幣初創公司Zap達成的,Zap的Strike產品可以將傳統的工資支票轉換成比特幣。Okung的1300萬美元年薪的一半將以比特幣支付。(Coindesk)[2020/12/30 16:01:35]
若“N”取值為“1,000,000,000,000,000,000”,也就是:'10^18',此時小數可被表示為整數,像這樣:
在NEARProtocol中,該N常見的取值為'10^24',即10^24個yoctoNEAR等價于1個NEAR代幣。
Trustology CEO:FCA已采取更全面的方法監管英國數字資產市場:據此前報道,英國金融行為監管局(FCA)提醒在英國開展加密資產活動的企業,它們必須在6月30日之前提交完整的注冊申請才能展開后續業務。
對此,英國加密托管解決方案提供商Trustology首席執行官Alex Batlin表示,作為其最新合規措施的一部分,FCA已經采取更廣泛、更全面的方法來監管其本地數字資產市場,尤其是在更深入地審視該地區運營的各種加密公司的信息安全和功能業務設置時,“FCA所尋求的不僅僅是遵守AML,還包括您是否有足夠的業務償付能力條款、IT安全控制和風險管理框架,包括災難恢復和保險。”(Cointelegraph)[2020/6/28]
基于此,我們可以將本小節的單元測試修改為如下方式進行計算:
以此可獲得數值精算的運算結果:0.7NEAR/10=0.07NEAR
動態 | TrustToken與加密托管服務商Legacy Trust合作推出穩定幣TrueHKD:據Finance Magnates報道,TrustToken公司香港授權的加密托管服務商Legacy Trust合作,持有為與港元掛鉤的穩定幣TrueHKD提供擔保的法幣。這是該公司在美國以外的第一個托管伙伴關系。TrustToken首席執行官安Jai An表示:“我們很高興能與Legacy Trust合作,向亞洲市場擴張。我們的目標是為交易員提供更好的解決方案,讓他們能夠安全地在本國法定貨幣與全球區塊鏈市場和應用程序之間進行交易。” TrueHKD可以由香港居民或任何持有法幣的人從該公司的應用程序購買,還將允許TrueHKD持有者訪問TrustToken的交易網絡、合作伙伴和錢包。[2019/6/25]
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考慮舍入機制
在設計智能合約時,在舍入問題上,往往都采用“我要占便宜,他人不得薅我羊毛”的原則。根據這個原則,如果向下取整對我有利,則向下;如果向上取整對我有利,則向上;四舍五入不能確定是對誰有利,因此極少被采用。
原文作者:ChrisBurniske原文編譯:H.ForestVentures,CryptoOcean原文標題:《TheCryptoJ-Curve》推薦理由:本文作者為前方舟基金加密投資部門負責.
1900/1/1 0:00:00親愛的用戶: 幣安將啟動ERC20InjectiveProtocol代幣的主網置換計劃,具體安排如下:幣安將於2022年04月11日10:00暫停INJ/BUSD、INJ/USDT、INJ/BT.
1900/1/1 0:00:00親愛的ZT用戶: ZT創新板即將上線shibking,並開啟shibking/USDT交易對。具體上線時間如下: 充值:已開啟; 交易:2022年4月2日16:00; shibking 項目簡介.
1900/1/1 0:00:00俄烏大戰硝煙未散,新冠疫情再度抬頭,能有本事在這個當口拿下微博熱搜第一的,也只有熱搜體質的孫哥了。3月9日,美國科技媒體TheVerge再度炮制出了一篇孫哥特稿.
1900/1/1 0:00:00Feb.2022,VincyDataSource:FootprintAnalytics-CronosDashboardCrypto.com自2016年6月創立以來,一直是媒體聚光燈的中心.
1900/1/1 0:00:00尊敬的唯客用戶您好! 唯客福利大放送 活動四:天天紅包雨 活動方式: 活動期間每天抽出10位有完成合約交易的用戶隨機送8、18、38、68、88USDT,周一至周五不限幣種.
1900/1/1 0:00:00