前言
在以太坊上,我們可以通過部署智能合約來實現我們需要的功能,合約代碼中我們往往需要定義一些變量,這就涉及到了智能合約變量的存儲機制。
這篇文章我們將根據solidity的所有的變量命名的類型來講解智能合約的存儲機制。
存儲機制
每個在以太坊虛擬機中運行的智能合約的狀態都在鏈上永久地存儲著。這些值存儲在一個巨大的數組中,數組的長度為2^256,下標從零開始且每一個數組能夠儲存32字節(256個比特)長度的值。并且存儲是稀疏的,并沒有那么密集。
變量類型
Solidity的數據變量類型分為兩類:
LlamaNodes推出符合ERC-4337標準的智能合約錢包基礎設施:6月7日消息,DefiLlama 推出的區塊鏈基礎設施 LlamaNodes 宣布與 Candide Labs 團隊合作,發布符合 ERC-4337 標準的捆綁服務(Bundler Service)Voltaire,該服務目前正在 Polygon 和 Goerli Testnet 上運行,并將在未來幾個月內在更多 EVM 鏈上推出。
此外,LlamaNodes 的智能合約錢包基礎設施還包括即將推出的 Paymaster Gas 服務,該服務可幫助項目方支付用戶的全部交易費用,支持以 ERC-20 支付 Gas 費,旨在提供易于使用的符合 ERC-4337 標準的 paymaster 服務。[2023/6/7 21:21:06]
值類型-valuetype
Arbitrum鏈上智能合約創建總量突破250萬,鎖倉總量超50億美元:金色財經報道,據Dune Analytics最新數據顯示,以太坊Layer2網絡Arbitrum鏈上智能合約創建總量突破250萬,本文撰寫時達到2,508,321個,鎖倉總量為50.62億美元,累計鏈上ERC-20資產總價值達到92.2億美元。歷史數據顯示,Arbitrum鏈上智能合約創建總量于2022年11月底突破100萬,4月中旬超200萬,這意味著該指標過去一個月時間內增長約25%。[2023/5/27 9:45:55]
引用類型-referencetype
值類型
布爾型(bool)2bit(0/1)
OpenZeppelin智能合約開發庫更新3.2版本:區塊鏈開發工具提供商OpenZeppelin發布智能合約開發庫OpenZeppelinContracts的3.2版本,此次最大的變更是將代理合約(proxycontract)從OpenZeppelinSDK遷移到了OpenZeppelinContracts項目中。另外對于智能合約編程語言Solidity0.7版本的用戶而言,OpenZeppelin已經在npm上發布了較新的編譯器版本支持,最新版本為3.2.0-solc-0.7。[2020/9/14]
整型(int/uint)根據關鍵字的不同表示不同長度,int8表示8bits有符號數
FUTchain燃料鏈利用智能合約 數字化管理和分配實體燃料:FUTchain燃料鏈是實體燃料數字化管理分配解決方案。中平德能源科技通過城市污水,垃圾滲濾液,工業污水等廢料,通過添加特殊培育的微生物發酵制成HTF高效能源燃料。同時將區塊鏈技術和實體資產有機結合,利用智能合約等互信機制用于實體燃料的數字化管理和分配,推出燃料鏈FUT。[2017/12/27]
定長浮點型(fixed/ufixed)Solidity還沒有完全支持定長浮點型。可以聲明定長浮點型的變量,但不能給它們賦值或把它們賦值給其他變量
定長字節數組(byte/bytes)定義數組時定義長度
地址類型(adress)160bits
地址類型成員變量(balance,transfer....)?
balanceuint256(256bits)?
transfer()uint256(256bits)
引用類型
不定長字節數組類型(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的計算代碼,用以驗證機制分析的正確性。
當然,本文設計的智能合約設計并不復雜,在實際開發過程中遠比此復雜,需要經歷一些分析,在能找到正確的存儲位置。最后,希望通過本文章可以幫助大家進一步的了解智能合約。
尊敬的歐易OKEx用戶:歐易OKEx上線LithiumFinance(LITH),具體時間如下:1.LITH充值:9月27日15:00(HKT)2.LITH/USDT的市場交易:9月27日17:.
1900/1/1 0:00:00專案簡介: 華爾街遊戲(WallStreetGames)是基於區塊鏈的下一代混合型線上遊戲平臺,玩家在有趣和令人上癮的簡單遊戲中相互戰鬥,以獲得加密貨幣的獎勵.
1900/1/1 0:00:00DeFi與傳統金融之間的差距。實現這一點的重要因素是優先考慮安全性、可用性和降低每個人進入DeFi的障礙.
1900/1/1 0:00:0010月2日,HuobiGlobal發布《關于幣幣與OTC交易中國大陸地區存量用戶清退流程的公告》,據該公告顯示,為響應當地政府監管政策要求.
1900/1/1 0:00:00親愛的BitMart用戶:Hideous.Finance(HIDEOUS)將于香港時間2021年10月1日上線BitMart持倉返利平臺.
1900/1/1 0:00:00據Bitcoin.com9月27日消息,約翰內斯堡大學教授RabelaniDagada敦促南非,如果該國仍想成為數字貨幣創新中心,就要最終確定其加密貨幣公共政策.
1900/1/1 0:00:00