買以太坊 買以太坊
Ctrl+D 買以太坊
ads

TOK:Rust 智能合約養成日記(7)_Poodl Token

Author:

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

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

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

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

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

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

Trust Wallet宣布與Instagram NFT達成合作伙伴關系:金色財經報道,加密錢包服務Trust Wallet宣布已經與科技巨頭Meta合作,將在Instagram上支持以太坊和Polygon NFT。根據Trust Wallet錢包官方社交媒體披露,他們是本次Instagram NFT項目的“主合作伙伴錢包”(main partner wallet)。據此前消息,Meta已經宣布與Coinbase Wallet和Dapper Labs整合并將在100多個國家/地區推出NFT。(web3wire)[2022/8/7 12:07:37]

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

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

Alpha Finance Lab加入Avalanche Rush獎勵計劃:據官方消息,跨鏈DeFi平臺Alpha Finance Lab宣布加入Avalanche Rush獎勵計劃,Avalanche基金會和Alpha Finance Lab向Alpha Homora V2分配了總計600萬美元的流動性挖礦獎勵(AVAX為300萬美元,ALPHA為300萬美元)。項目將在12月啟動,具體日期將很快公布。[2021/12/2 12:44:55]

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

Crust Network 道長:用戶的資產在Rollup解決方案中是安全的:金色財經現場報道,7月9日,金色沙龍第66期Layer2-擴容“空間站”,探索更高維度的破局之道在杭州舉辦,Crust Network 道長在圓桌對話環節中表示,V神曾提到, 二層解決方案有兩大問題:一個是資產安全性問題,還有一個是系統安全性問題。Rollup已經將資產安全性問題基本解決,也就是用戶的資產在Rollup解決方案中是安全的。但Rollup的系統安全性問題仍有待解決。

他山之石,可以攻玉。Crust網絡提供了高安全性和高可用的數據存儲網絡,有能力為Layer2方案提供更高的系統安全性。

一些實際的例子已經證明了Crust的存儲優勢。Uniswap已經將它的網站去中心化的部署在了Crust之上,除此之外,還有更多DApp和NFT項目將他們的數據存儲在Crust網絡。[2021/7/9 0:40:09]

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

波卡生態項目CrustNetwork將于11月12日進入測試網封閉測試階段:據官方消息,基于波卡平行鏈構建的去中心化存儲項目CrustNetwork(CRU)發推表示,為了確保測試網“方舟計劃”(ProfitArk)的安全性和穩定性,Crust測試網將于北京時間11月12日上午10點左右進入封閉測試階段,并將持續到11月25日前后。

在此期間,節點手冊將會失效,新節點將無法按照節點手冊正常訪問網絡,已經加入網絡的節點無法穩定運行。11月25日將會發布新的節點手冊和詳細的收益計算明細。11月底,“方舟計劃”激勵性測試網將正式起啟動。注:Crust是分布式的云存儲網絡,目前已經獲得NGC、HashCIB、SNZ等10多家機構A輪投資,此前已經獲得過Web3基金會Grant,同時也是Web3Bootcamp和SubstrateBuildersProgram的成員。[2020/11/12 14:07:05]

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

現場 | TrustNote創始人周正軍:未來是通證化的時代:金色財經現場報道,7月4日,在日本東京舉辦的TOKENSKY區塊鏈+全球高峰論壇上,TrustNote創始人周正軍表示今后是通證化的時代,所以的事物都會通證化,通證化可以使數據更透明、更公平、更高效、更具有流動性,這需要在底層公鏈之上構建快速運作、發行、使用通證的平臺。[2018/7/4]

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

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

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

在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:USTKENTOKENTOKJUST StablecoinREG TokenPoodl TokenGatechain Token

酷幣下載
VEN:一周融資速遞 | 37家項目獲投;已披露融資總額約為12億美元(3.28-4.3)_TAL

經Odaily星球日報不完全統計,3月28日-4月3日當周公布的海內外區塊鏈融資事件共37起,較前一周有一定增加;已披露融資總額約為12億美元,較前一周有一定上升.

1900/1/1 0:00:00
區塊鏈:詳解ICP與BTC集成_比特幣

PresentedbyDiegoPrats&ManuDrijvers開發者的增長非常驚人.

1900/1/1 0:00:00
ALM:「最火超英」蝙蝠俠NFT來了,未來兩年的賦能也規劃好了_PalGold

周三,全球最大電影和電視娛樂制作公司之一的華納兄弟在贊助的<NFT|LA>線下峰會上宣布.

1900/1/1 0:00:00
ITF:Bitfinex周報(0328-0403)_bitFlowers

ETH從Bitfinex轉出根據WhaleAlert數據顯示,24小時內有大量的以太坊從Bitfinex交易所轉出.

1900/1/1 0:00:00
HTT:XT.COM關於下架BSST/USDT, KIND/USDT交易對公告_https://etherscan.io

尊敬的XT.COM用戶:XT.COM作為致力於為全球優質的數字資產提供優質服務的交易平臺。平臺會定期對已上線的幣種進行綜合性審核,以確保平臺幣種的高水準交易.

1900/1/1 0:00:00
WIT:幣安NFT市場推出“邁克·泰森”盲盒系列_Twittelon BOSS

親愛的用戶: 幣安NFT市場將於2022年04月05日19:00推出男子世界重量級拳王邁克·泰森在盲盒系列!該NFT盲盒系列展示了以邁克·泰森為主角的藝術品,以及獨家獎勵.

1900/1/1 0:00:00
ads