前言
在以太坊上,我們可以通過部署智能合約來實現我們需要的功能,合約代碼中我們往往需要定義一些變量,這就涉及到了智能合約變量的存儲機制。
這篇文章我們將根據solidity的所有的變量命名的類型來講解智能合約的存儲機制。
存儲機制
每個在以太坊虛擬機中運行的智能合約的狀態都在鏈上永久地存儲著。這些值存儲在一個巨大的數組中,數組的長度為2^256,下標從零開始且每一個數組能夠儲存32字節(256個比特)長度的值。并且存儲是稀疏的,并沒有那么密集。
變量類型
Solidity的數據變量類型分為兩類:
智能合約中的USDT供應百分比達到1個月高點:金色財經報道,據Glassnode數據顯示,智能合約中的美元 USDT供應百分比剛剛達到1個月高點 ,數值為20.617%。[2022/1/4 8:23:25]
值類型-valuetype
引用類型-referencetype
值類型
布爾型(bool)2bit(0/1)
整型(int/uint)根據關鍵字的不同表示不同長度,int8表示8bits有符號數
定長浮點型(fixed/ufixed)Solidity還沒有完全支持定長浮點型。可以聲明定長浮點型的變量,但不能給它們賦值或把它們賦值給其他變量
Algorand發布“虛擬機”以提升智能合約性能:金色財經報道,Algorand發布了后端升級,以提高基于Algorand的應用程序的計算能力。新推出的Algorand虛擬機(AVM)將使Algorand智能合約的性能得到提升,使新參與者更容易在鏈上開發程序。Algorand首席產品官Paul Riegel表示,AVM使Algorand智能合約開發“更接近于其他區塊鏈上的開發人員所習慣的思維模型”。[2021/9/30 17:16:16]
定長字節數組(byte/bytes)定義數組時定義長度
地址類型(adress)160bits
地址類型成員變量(balance,transfer....)?
Nervos 首席架構師 Jan:智能合約開發者仍屬小眾群體,應該擁抱傳統開發人員:CoinDesk共識大會中文版分會場于北京時間5月12日13-14點在線上舉行,Nervos首席架構師謝晗劍(Jan Xie)在大會中表示,Nervos目前的主要目標是完善CKB的開發者體驗。
與 C、C++和JavaScript社區相比,智能合約開發人員仍然是很小的一個群體。新的智能合約平臺想要成為主流,一個更實際的方法是擁抱傳統的開發人員,讓他們可以使用任何他們已經熟悉的編程語言,而不是創建一種新的語言并強迫他們使用。Nervos構建了一個與RISC-V完全兼容的虛擬機,GCC/LLVM支持的任何編程語言都可以用來在Nervos上編寫智能合約。
這樣的設計實現了讓更多的開發者加入到Nervos網絡中來進行開發,同時也讓Nervos開發者社區更加強大。目前,Nervos已開啟了Grants計劃和孵化器CK Labs計劃,旨在擁抱更多優秀的開發人員。[2020/5/12]
balanceuint256(256bits)?
瑞銀集團UBS推出智能合約區塊鏈驗證專利 已向美專利局申請專利保護:世界上規模最大的金融服務公司之一瑞銀集團(UBS)正在尋求構建更加安全的計算機系統。根據美國專利局近期發布的一項專利申請信息顯示,瑞銀集團試圖使用分布式賬本來驗證交易,他們會創建一個永久性記錄,來記錄下鏈上的每一個行為。相比于傳統技術,分布式賬本的優勢在于其不變性和去中心化。[2017/12/6]
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的計算代碼,用以驗證機制分析的正確性。
當然,本文設計的智能合約設計并不復雜,在實際開發過程中遠比此復雜,需要經歷一些分析,在能找到正確的存儲位置。最后,希望通過本文章可以幫助大家進一步的了解智能合約。
鏈聞消息,非托管交易所DeversiFi針對此前包含7676.62ETH的Gas費用的交易發布事后分析報告稱.
1900/1/1 0:00:00閃電網絡和雷電網絡看起來非常相近,它們有著基本相同的技術基因和奮斗目標,但又演繹著各自的生命軌跡,為不同的老板服務,閃電網絡是當之無愧的哥哥,老板是比特幣,而雷電網絡的主子是以太坊.
1900/1/1 0:00:00據KoreaTimes9月26日消息,韓國加密貨幣交易所Upbit運營商Dunamu以逾10萬億韓元估值完成近1000億韓元融資.
1900/1/1 0:00:00經Odaily星球日報不完全統計,9月20日-9月26日當周公布的海內外區塊鏈融資事件共36起,雖然從絕對筆數上看較上一周變化并不明顯,但23.17億美元的融資總額較上周卻有著明顯抬升總額.
1900/1/1 0:00:00吳說作者|ColinWu本期編輯|ColinWu本周吳說簡評:因中秋假期,兩周合成一周。本周中國發改委披露了詳細的整治通知。既已形成文字,未來很難再有變數.
1900/1/1 0:00:00親愛的BitMart用戶:為了提升服務質量,進一步優化交易體驗,BitMart平臺計劃將于2021年9月29日15:00(香港時間)進行預計為期2小時的合約系統升級維護.
1900/1/1 0:00:00