前言
在以太坊上,我們可以通過部署智能合約來實現我們需要的功能,合約代碼中我們往往需要定義一些變量,這就涉及到了智能合約變量的存儲機制。
這篇文章我們將根據solidity的所有的變量命名的類型來講解智能合約的存儲機制。
存儲機制
每個在以太坊虛擬機中運行的智能合約的狀態都在鏈上永久地存儲著。這些值存儲在一個巨大的數組中,數組的長度為2^256,下標從零開始且每一個數組能夠儲存32字節(256個比特)長度的值。并且存儲是稀疏的,并沒有那么密集。
變量類型
Solidity的數據變量類型分為兩類:
工程師Ben Sparks加入Aave智能合約團隊:7月9日消息,智能合約工程師Ben Sparks在推特上宣布,其已加入Aave智能合約團隊。[2022/7/9 2:02:25]
值類型-valuetype
引用類型-referencetype
值類型
布爾型(bool)2bit(0/1)
整型(int/uint)根據關鍵字的不同表示不同長度,int8表示8bits有符號數
定長浮點型(fixed/ufixed)Solidity還沒有完全支持定長浮點型。可以聲明定長浮點型的變量,但不能給它們賦值或把它們賦值給其他變量
Espresso Systems在測試網上線以太坊可配置資產隱私(CAPE)智能合約應用:6月16日消息,Web3應用擴展和隱私系統Espresso Systems在以太坊Goeril測試網中推出隱私產品CAPE,允許資產創建者定義可定制的隱私策略,以確定在某些情況下誰可以看到有關資產持有者和交易的哪些信息。3月份,Espresso Systems完成3200萬美元融資,Greylock Partners和Electric Capital領投,參投方包括紅杉資本、Blockchain Capital和Slow Ventures。Espresso Systems正在開發Layer1區塊鏈基礎設施,通過PoS共識機制協議與ZKRollup機制來實現快速、低成本的交易。(CoinDesk)[2022/6/17 4:33:20]
定長字節數組(byte/bytes)定義數組時定義長度
Terra生態DEX Astroport的智能合約已在Terra2.0測試網上運行:金色財經消息,Terra生態去中心化交易所Astroport智能合約已在Terra2.0測試網上運行,接下來將啟動主網。
此前消息,Astroport發布Terra2.0計劃,計劃將智能合約系統在新網絡上重新部署。[2022/6/3 4:00:54]
地址類型(adress)160bits
地址類型成員變量(balance,transfer....)?
balanceuint256(256bits)?
transfer()uint256(256bits)
Themis智能合約通過頂級公司安全審計 獲得高度贊賞: ?Themis已于近期通過頂級區塊鏈安全技術機構安全審計,智能合約安全、代碼編寫質量獲得高度贊賞。
今日EOS被發現存在“史詩級”高危安全漏洞,此前也出現過一些區塊鏈項目存在智能合約安全的問題。
Themis高度重視區塊鏈技術安全,此次通過審計充分體現了Themis團隊的技術實力,Themis團隊也將借助開源社區的共識力量,將代碼安全做的更好。[2018/5/29]
引用類型
不定長字節數組類型(bytes/byte,string,uint....)
結構體(struct)
映射(mapping)
簡單分析
寫一個簡單值類型的合約
pragmasolidity^0
可以看到雖然規定了了長度為5,但是實際上只用了4個,所以就只是用了四個bytes8的空間。
是不是可以加一個,編譯器會報錯。
變長數組
pragmasolidity^0
functionunlock(bytes32_password)public{?if(password==_password){??locked=false;?}}}
定義為私有變量只能組織其他合約訪問,但是無法阻止公開訪問
按照其代碼,可以知道password的存儲位置是1
web3.eth.getStorageAt(contract.address,1)
直接使用
contract.unlock("Averystrongsecretpassword:)")//密碼錯誤
contract.unlock(web3.utils.hexToBytes('0x412076657279207374726f6e67207365637265742070617373776f7264203a29'))
題目二--LockBox
pragmasolidity0.4.24;import"../CtfFramework.sol";contractLockbox1isCtfFramework{?uint256privatepin;?constructor(address_ctfLauncher,address_player)publicpayable???CtfFramework(_ctfLauncher,_player)?{???pin=now000;?}??functionunlock(uint256_pin)externalctf{???require(pin==_pin,"IncorrectPIN");???msg.sender.transfer(address(this).balance);?}}
讀取私有變量
constructor只在構造的時候執行一次
總結
本篇文章詳細講解了智能合約的優化存儲原則,數組類型,字符串類型,結構體類型和映射類型的存儲機制。同時提供了基于python的計算代碼,用以驗證機制分析的正確性。
當然,本文設計的智能合約設計并不復雜,在實際開發過程中遠比此復雜,需要經歷一些分析,在能找到正確的存儲位置。最后,希望通過本文章可以幫助大家進一步的了解智能合約。
Tags:RESESSLOCKLOCCoreStarterSUCCESSBlockearthblockchain錢包安卓版
頭條 數據:OpenSea日交易額跌至1517萬美元DuneAnalytics數據顯示,OpenSea日交易額為1517萬美元,跌至8月1日以來新低.
1900/1/1 0:00:00尊敬的用戶:? 本著保護用戶的宗旨,BKEXGlobal為保證交易幣種的高標準,將定期對平臺內的代幣進行綜合性審查;如項目方出現對投資者不利因素,我們將采取對應措施,并下架對應項目.
1900/1/1 0:00:00尊敬的中幣用戶: ????由于Terra主網升級,中幣將于香港時間2021年9月30日10:00暫停LUNA充值和提幣業務.
1900/1/1 0:00:00幣安 流動性挖礦 將開啟新一輪交易大賽。活動期間,用戶在ONE/USDT交易池交易即可參與瓜分250,000ONE獎勵.
1900/1/1 0:00:00撰文:Ventures Dfinity概覽 Dfinity基金會 Dfinity是一個非營利性組織,致力于將互聯網重塑為能承載具有超高能力并具有安全性的計算機.
1900/1/1 0:00:00上周對于NFT來說是漫長的一周,圍繞潛在黑客的討論非常多,DapperLabs籌集了新一輪的融資,無聊猿猴簽署了代理協議。一如往常,我們將回顧過去七天NFT領域的重大新聞.
1900/1/1 0:00:00