前言
在以太坊上,我們可以通過部署智能合約來實現我們需要的功能,合約代碼中我們往往需要定義一些變量,這就涉及到了智能合約變量的存儲機制。
這篇文章我們將根據solidity的所有的變量命名的類型來講解智能合約的存儲機制。
存儲機制
每個在以太坊虛擬機中運行的智能合約的狀態都在鏈上永久地存儲著。這些值存儲在一個巨大的數組中,數組的長度為2^256,下標從零開始且每一個數組能夠儲存32字節(256個比特)長度的值。并且存儲是稀疏的,并沒有那么密集。
變量類型
Solidity的數據變量類型分為兩類:
QuickSwap與以太坊智能合約自動執行工具Gelato Network合作提供限價訂單功能:Polygon網絡上的去中心化交易所QuickSwap與以太坊智能合約自動執行工具Gelato Network達成合作,已為用戶提供限價單服務。[2021/8/17 22:19:31]
值類型-valuetype
引用類型-referencetype
值類型
布爾型(bool)2bit(0/1)
整型(int/uint)根據關鍵字的不同表示不同長度,int8表示8bits有符號數
定長浮點型(fixed/ufixed)Solidity還沒有完全支持定長浮點型。可以聲明定長浮點型的變量,但不能給它們賦值或把它們賦值給其他變量
動態 | 瑞士安全公司Kudelski Security與智能合約審計公司Hosho達成合作:據Cointelegraph消息,3月19日,瑞士網絡安全解決方案提供商Kudelski Security宣布與智能合約審計公司Hosho建立戰略合作伙伴關系,以為區塊鏈生態系統提供更高的安全性。[2019/3/20]
定長字節數組(byte/bytes)定義數組時定義長度
地址類型(adress)160bits
地址類型成員變量(balance,transfer....)?
balanceuint256(256bits)?
聲音 | Symbiont.io,Inc.聯合創始人:智能合約更有潛力:據CoinDesk消息,金融科技公司Symbiont.io,Inc.聯合創始人兼首席技術官Adam Krellenstein刊文稱:一方面,面向普通大眾的智能合約制度實際上并不是一個好主意;另一方面,在私有鏈領域,智能合約更有潛力,其目標用戶不是個人,而是大型機構(例如政府和公司)。另外,Krellenstein還指出,就像中本聰最初設想的那樣,公有鏈的最大用途實際上是數字貨幣和支付系統,它們可以用于構建新類型的數據庫,而不是用數字黃金替換法定貨幣。在公有鏈網絡上建立復雜的智能合約并沒有解決現有去中心化系統設計中固有的問題,而只是努力成為對于集中系統來說更有用的版本。據悉,Krellenstein也是最早嘗試使用比特幣區塊鏈進行更多實驗性用途的人之一。[2018/10/23]
transfer()uint256(256bits)
GuildOne的Royalty Ledger通過R3的Corda區塊鏈平臺 首次執行一份版稅智能合約:GuildOne Inc.宣布,公司在R3的Corda區塊鏈平臺上使用該公司的新版稅收總賬應用程序,首次執行一份版稅智能合約。該聲明于2月14日,在阿爾伯塔省卡爾加里召開的石油和天然氣會議上宣布了這一消息。[2018/2/21]
引用類型
不定長字節數組類型(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:WORINTLOCKLOCFile Network StarIntegriteeBlockChain Search ArtifactsELOC價格
此前Gate.ioWNCG/USDT、WNCG/BTC流動性礦池已開啟自動做市商AMM模式,為鼓勵更多用戶積極參與,今日中午12:00.
1900/1/1 0:00:00親愛的用戶:為響應全球各地監管要求,符合各地加密貨幣法律法規的營運要求,HomiEx將進行部分調整,現已暫停全部幣種的充值服務,請用戶悉知.
1900/1/1 0:00:00鏈聞消息,元宇宙項目Computecoin宣布將于紐約時間9月27日推出測試網Dome-A1.0,此外還將發布瀏覽器插件錢包ALE,并將空投3萬枚測試網代幣.
1900/1/1 0:00:00公告編號2021092702各位關心ZBG的投資者們和項目方:USDT(OMNI鏈)因錢包維護暫停提幣,具體開放時間以公告為準,給您帶來不便深感抱歉,敬請諒解.
1900/1/1 0:00:00昨日,Coinbase在推特轉發其在InstitutionalInvestor發布的公關稿:“Coinbase報告:預計加密基金將增長以及美國SEC將很快批準ETF”.
1900/1/1 0:00:00尊敬的BitGlobal用戶:為慶祝BNS正式上線BitGlobal,我們將舉行“BNS充值&交易瓜分$5,000美金大獎”福利活動.
1900/1/1 0:00:00