前言
在以太坊上,我們可以通過部署智能合約來實現我們需要的功能,合約代碼中我們往往需要定義一些變量,這就涉及到了智能合約變量的存儲機制。
這篇文章我們將根據solidity的所有的變量命名的類型來講解智能合約的存儲機制。
存儲機制
每個在以太坊虛擬機中運行的智能合約的狀態都在鏈上永久地存儲著。這些值存儲在一個巨大的數組中,數組的長度為2^256,下標從零開始且每一個數組能夠儲存32字節(256個比特)長度的值。并且存儲是稀疏的,并沒有那么密集。
變量類型
Solidity的數據變量類型分為兩類:
DefiLlama旗下NFT借貸項目llamalend完成智能合約部署:10月26日消息,據官方消息,NFT借貸項目llamalend已完成智能合約部署。
據此前報道,10月9日,DeFi數據網站DeFiLlama匿名創始人0xngmi宣布,NFT借貸項目llamalend即將推出,目前智能合約已完成并在Github開源。[2022/10/26 16:39:40]
值類型-valuetype
引用類型-referencetype
值類型
布爾型(bool)2bit(0/1)
整型(int/uint)根據關鍵字的不同表示不同長度,int8表示8bits有符號數
USDC2.1版本發布,可自動阻止用戶向智能合約發送USDC:4月27日消息,USDC運營公司centreConsortium宣布對以太坊區塊鏈上USDCoin(USDC)協議和智能合約進行了升級,新版本(2.1版本)會自動阻止用戶向智能合約發送USDC。另外,CentreConsortium還推出對誤發到以太坊智能合約地址的USDC的找回服務。[2021/4/27 21:02:45]
定長浮點型(fixed/ufixed)Solidity還沒有完全支持定長浮點型。可以聲明定長浮點型的變量,但不能給它們賦值或把它們賦值給其他變量
定長字節數組(byte/bytes)定義數組時定義長度
庫幣安全事件更新:AKRO已暫停代幣轉賬,將升級智能合約:Akropolis于推特上表示,針對此次庫幣熱錢包異常轉賬事件涉及的AKRO代幣,Akropolis已對黑客地址進行封鎖,并全面暫停AKRO代幣轉賬,將對智能合約進行升級。[2020/9/28]
地址類型(adress)160bits
地址類型成員變量(balance,transfer....)?
balanceuint256(256bits)?
transfer()uint256(256bits)
引用類型
不定長字節數組類型(bytes/byte,string,uint....)
動態 | SBTC官方表示當區塊高度達到531806時將重新激活智能合約:據SBTC官方消息,超級比特幣技術團隊用一周時間,解決了智能合約項目激活過程中代碼與部分礦機不兼容等問題,最新的Releases版本已經上傳到Github。SBTC官方決定,當區塊高度達到531806時,將重新激活智能合約。當前區塊高度為531694,距離激活條件僅差0.021%。[2018/7/31]
結構體(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:WORINTCONBYTWorld Cup InuBCPAY FinTechFalcon SwapsORBYT價格
前言 EVM是一個輕量級的虛擬機,其設計初衷就是提供一種可以忽略硬件、操作系統等兼容性的虛擬的執行環境供以太坊網絡運行智能合約.
1900/1/1 0:00:00又到了每月安全盤點時刻!鏈必安-區塊鏈安全態勢感知平臺輿情監測顯示,2021年9月,各類安全事件仍然頻發,成都鏈安科技統計9月發生較典型安全事件超『29』起.
1900/1/1 0:00:00Browsers3000是由ProtocolLabs舉辦的為期五周的黑客松活動,專注于為Web3瀏覽器的未來構建去中心化解決方案。下面是開發ION團隊成員DanielBuchner的演講摘要.
1900/1/1 0:00:00Simon:感謝加入ImTokenXAMPL的AMA。今天我們這邊請到了EvanKuo和我本人以及ImToken的Phillipp和Yaxin——讓大家開始自我介紹吧!Phillipp:大家好!.
1900/1/1 0:00:00尊敬的歐易OKEx用戶:歐易OKEx上線Kollect(KOL),具體時間如下:1.KOL充值:9月28日15:00(HKT)2.KOL/USDT的市場交易:9月28日18:00(HKT)3.K.
1900/1/1 0:00:009月27日,ChiaGlobalHackathon@Asia在DoraHacks開發者平臺HackerLink圓滿落幕.
1900/1/1 0:00:00