solidity基本類型

https://blog.csdn.net/weixin_45067603/article/details/105726491
1.### 整型

int / uint :分別表示有符號和無符號的不同位數(shù)的整型變量挠铲。 支持關(guān)鍵字 uint8uint256 (無符號疾嗅,從 8 位到 256 位)以及 int8int256玻粪,以 8 位為步長遞增愈污。 uintint 分別是 uint256int256 的別名琼蚯。

2.### 定長字節(jié)數(shù)組
關(guān)鍵字有:bytes1地粪, bytes2首量, bytes3荞驴, …不皆, bytes32。 byte 是 bytes1 的別名熊楼。
成員變量:

.length 表示這個字節(jié)數(shù)組的長度(只讀).

變長字節(jié)數(shù)組

bytes
變長字節(jié)數(shù)組霹娄,參見 數(shù)組。它并不是值類型孙蒙。

image.png

string
變長 UTF-8 編碼字符串類型项棠,參見 數(shù)組。并不是值類型挎峦。

image.png

字符串 轉(zhuǎn) 動態(tài)數(shù)組
string str = "mystr";
bytes b = bytes(str);
動態(tài)數(shù)組 轉(zhuǎn) 字符串
bytes bs = 0x7a4892;
string str = string(b);
定長字節(jié)數(shù)組之前可以互相轉(zhuǎn)換
bytes1 b1= 0x7a;
bytes2 b2=bytes2(b1);
定長字節(jié)數(shù)組 轉(zhuǎn) 動態(tài)字節(jié)數(shù)組


image.png

固定長度數(shù)組:

1.如果不賦值香追,那么默認(rèn)所有位均為0
2.支持直接使用.length查看數(shù)組長度,但不支持對數(shù)組長度做修改
3.不支持通過.push添加數(shù)據(jù)

contract fixedarrtest{
    uint[3] testarr1;//不進(jìn)行賦值直接聲明數(shù)組
    uint[3] testarr2=[1,2,3];//聲明數(shù)組并進(jìn)行賦值
    
    function showarr1() public view returns(uint[3]){
        return testarr1; //如果不賦值坦胶,那么默認(rèn)所有位均為0
    }
    
    function showarr2() public view returns(uint[3]){
        return testarr2;
    }
    
    function initarr() public{
        testarr1[0]=12;//進(jìn)行賦值操作
    }
    
    function lengthtest() public view returns(uint){
        return testarr1.length;//solidity支持直接查看數(shù)組長度
    }

可變數(shù)組:

1.支持直接使用.length查看數(shù)組長度透典,也支持對數(shù)組長度做修改。
將數(shù)組長度縮小則會從前往后保留
將數(shù)組長度增長則后面原本沒有值的位會被默認(rèn)置0
2.支持直接通過.push方法在末尾添加數(shù)值

contract dynamicarrtest{
    uint[] testarr=[1,2,3,4,5];
    
    function showarr() public view returns (uint[]){
        return testarr;
    }
    
    function changearr() public{
        //for(uint i=0;i<5;i++){
            testarr[0] = 2;//如果不使0位有值顿苇,那么該函數(shù)無用
        //}
    }
    
    function lengthtest() public view returns(uint){
        return testarr.length;
    }
    
    function changelengthtest1() public{
        testarr.length=1;
    }
    
    function changelengthtest2() public{
        testarr.length=10;//變長之后后面默認(rèn)置0
    }
    
    function pushtest() public{
        testarr.push(6);//可變數(shù)組支持此操作
    }
    
}

二維數(shù)組

1.初始化時峭咒,uint[ i ] [ j ]表示有j個元素,每個元素包含i個值(和其他許多語言不同)
2.二維數(shù)組可以直接獲取長度纪岁,既可以獲得所有元素個數(shù)凑队,也可以獲得單獨(dú)元素有多少值
3.對二維數(shù)組進(jìn)行增刪改等操作時時是與初始化時反過來的,即uint[ i ] [ j ]表示第i個元素的第j個值(和其他許多語言一樣)
4.不支持push方法幔翰,也不支持對長度進(jìn)行修改

pragma solidity ^0.4.0;

contract TwoArray{
    // 定義二維數(shù)組 3行2列: 3個元素 每個元素里有2個值
    uint[2][3] grade = [[1,2],[3,4],[6,5]];
    //獲取行數(shù)
    function getOneLength() returns(uint){
        return grade.length; // 3
    }
    // 獲取列數(shù)
    function getTwoLength() returns(uint){
        return grade[0].length; //2
    }
    // 獲取值 
    function getData()   returns(uint[2][3]){
        return grade;
    }
    //求和
    function getSum()  returns(uint){
        uint sum = 0;
        for(uint i = 0; i < grade.length; i++){
            for(uint j = 0; j < grade[i].length; j++){
                sum +=  grade[i][j];
            }
        }
        return sum;
    }
    
    // 改變數(shù)組的值 : 改變第一個元素的第二個值
    function changeData() {
        grade[1][2] = 100;
    }
}

地址類型成員變量

1.以太坊中的地址的長度為20字節(jié)漩氨,一字節(jié)等于8位,一共160位遗增,所以address其實亦可以用uint160來聲明叫惊。比如:0x5B38Da6a701c568545dCfcB03FcB875f56beddC4轉(zhuǎn)uint160就是520786028573371803640530888255888666801131675076(16進(jìn)制轉(zhuǎn)10進(jìn)制)
2.地址之間支持大小比較

1.可以通過地址.balance獲取某個地址的余額
2.this指的是當(dāng)前合約的地址,如此處就是paytest合約的地址
3.轉(zhuǎn)賬可以通過remix圖形界面來進(jìn)行轉(zhuǎn)賬數(shù)目的改變
4.對其他賬戶的轉(zhuǎn)賬需要使用賬戶名稱.transfer(msg.value)或者賬戶名稱.transfer(數(shù)量 單位做修,如1 ether)如果在輸入value的同時又寫的是數(shù)量 單位霍狰,那么多余的value就自動轉(zhuǎn)賬到合約地址里去
5.如果對當(dāng)前合約使用transfer轉(zhuǎn)賬this.transfer(msg.value)則必須需要一個回滾函數(shù)。
6…如果函數(shù)含有payable而函數(shù)里面沒有要求給某個賬戶轉(zhuǎn)賬的話饰及,則會默認(rèn)轉(zhuǎn)賬到合約當(dāng)中
7.send和transfer的區(qū)別是蔗坯,前者是底層函數(shù),返回bool值燎含;后者會直接在調(diào)用時報錯步悠。具體體現(xiàn)在如果轉(zhuǎn)賬金額為0是,send正常運(yùn)行但是返回false 現(xiàn)在嘗試了之后發(fā)現(xiàn)即使轉(zhuǎn)賬金額0瘫镇,兩者均都不報錯鼎兽,返回的為true,見測試5

查看所有的成員铣除,可參考 地址成員谚咬。

  • balancetransfer
pragma solidity ^0.4.0;

contract addressTest{
    address public account = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
    
    // address 轉(zhuǎn) uint160 其實就是 16進(jìn)制 轉(zhuǎn) 10進(jìn)制
    function addressToInt16() view returns(uint160){
        return uint160(account);
    }
    
    // 加上payable 就默認(rèn)是給 當(dāng)前合約轉(zhuǎn)賬 msg.value的數(shù)額
    function toContract() payable {
        
    }
    // 獲取當(dāng)前合約地址, 合約也是可以轉(zhuǎn)賬的
    function getThis() view returns(address){
        return this;
    }
    // 獲取合約余額
    function getContractBalance() view returns(uint){
        return this.balance;
    }
     // 獲取指定地址的余額尚粘, address類型默認(rèn)屬性balance
    function getAccountBalance(address acc) view returns(uint){
        return acc.balance;
    }
    // 給acc 轉(zhuǎn)賬 msg.value择卦; msg.value是全局變量,轉(zhuǎn)賬的數(shù)額
    function transfer(address acc) payable {
        acc.transfer(msg.value);
    }
    // 使用send 進(jìn)行轉(zhuǎn)賬
    function send(address acc) payable returns(bool){
        return acc 使用send 進(jìn)行轉(zhuǎn)賬(msg.value);
    }
}

3.全局變量

可見深入理解Solidity——全局變量

2.函數(shù)類型:
函數(shù)類型表示成如下的形式

function (<parameter types>) {internal|external} [pure|constant|view|payable] [returns (<return types>)]

函數(shù)類型有兩類:

    內(nèi)部(internal) 函數(shù)類型
    外部(external) 函數(shù)類型

public(或 external)函數(shù)都有下面的成員:

  1. 映射

映射類型在聲明時的形式為 mapping(_KeyType => _ValueType)秉继。 其中 _KeyType 可以是任何基本類型,即可以是任何的內(nèi)建類型加上bytesstring泽铛。 而用戶定義的類型或復(fù)雜的類型如:合約類型尚辑、枚舉、映射盔腔、結(jié)構(gòu)體杠茬、即除 bytesstring 之外的數(shù)組類型 是不可以作為 _KeyType 的類型的。

_ValueType 可以是包括映射類型在內(nèi)的任何類型
在映射中弛随,實際上并不存儲 key瓢喉,而是存儲它的 keccak256 哈希值,從而便于查詢實際的值舀透。

映射只能是 存儲 的數(shù)據(jù)位置栓票,因此只允許作為狀態(tài)變量 或 作為函數(shù)內(nèi)的 存儲 引用 或 作為庫函數(shù)的參數(shù)。 它們不能用合約公有函數(shù)的參數(shù)或返回值

可以將映射聲明為 public 愕够,然后來讓 Solidity 創(chuàng)建一個 getter 函數(shù)走贪。 _KeyType 將成為 getter 的必須參數(shù),并且 getter 會返回 _ValueType 链烈。

pragma solidity ^0.4.0;

contract mappingUse{
//  定義mapping
    mapping(address => string) myName;
    
// mapping 賦值
    function setName(string name) {
        myName[msg.sender] = name;
    }
    
// mapping取值
    function getName(address acc) view returns(string) {
        return myName[acc];
    }
}
  1. 引用類型

引用類型可以通過多個不同的名稱修改它的值厉斟,而值類型的變量,每次都有獨(dú)立的副本强衡。因此擦秽,必須比值類型更謹(jǐn)慎地處理引用類型。 目前漩勤,引用類型包括結(jié)構(gòu)感挥,數(shù)組和映射,如果使用引用類型越败,則必須明確指明數(shù)據(jù)存儲哪種類型的位置(空間)里:

    內(nèi)存memory 即數(shù)據(jù)在內(nèi)存中触幼,因此數(shù)據(jù)僅在其生命周期內(nèi)(函數(shù)調(diào)用期間)有效。不能用于外部調(diào)用究飞。
    存儲storage 狀態(tài)變量保存的位置置谦,只要合約存在就一直存儲.
    調(diào)用數(shù)據(jù)calldata 用來保存函數(shù)參數(shù)的特殊數(shù)據(jù)位置堂鲤,是一個只讀位置。

更改數(shù)據(jù)位置或類型轉(zhuǎn)換將始終產(chǎn)生自動進(jìn)行一份拷貝媒峡,而在同一數(shù)據(jù)位置內(nèi)(對于 存儲 來說)的復(fù)制僅在某些情況下進(jìn)行拷貝瘟栖。

在 存儲 和 內(nèi)存 之間兩兩賦值(或者從 調(diào)用數(shù)據(jù) 賦值 ),都會創(chuàng)建一份獨(dú)立的拷貝谅阿。
從 內(nèi)存 到 內(nèi)存 的賦值只創(chuàng)建引用半哟, 這意味著更改內(nèi)存變量,其他引用相同數(shù)據(jù)的所有其他內(nèi)存變量的值也會跟著改變签餐。
從 存儲 到本地存儲變量的賦值也只分配一個引用寓涨。
其他的向 存儲 的賦值,總是進(jìn)行拷貝氯檐。

字面常量與基本類型的轉(zhuǎn)換

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末戒良,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子男摧,更是在濱河造成了極大的恐慌蔬墩,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耗拓,死亡現(xiàn)場離奇詭異拇颅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)乔询,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門樟插,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人竿刁,你說我怎么就攤上這事黄锤。” “怎么了食拜?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵鸵熟,是天一觀的道長。 經(jīng)常有香客問我负甸,道長流强,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任呻待,我火速辦了婚禮打月,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚕捉。我一直安慰自己奏篙,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布迫淹。 她就那樣靜靜地躺著秘通,像睡著了一般为严。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上充易,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天梗脾,我揣著相機(jī)與錄音,去河邊找鬼盹靴。 笑死,一個胖子當(dāng)著我的面吹牛瑞妇,可吹牛的內(nèi)容都是我干的稿静。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辕狰,長吁一口氣:“原來是場噩夢啊……” “哼改备!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蔓倍,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤悬钳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后偶翅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體默勾,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年聚谁,在試婚紗的時候發(fā)現(xiàn)自己被綠了母剥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡形导,死狀恐怖环疼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情朵耕,我是刑警寧澤炫隶,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站阎曹,受9級特大地震影響伪阶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芬膝,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一望门、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锰霜,春花似錦筹误、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哄酝。三九已至,卻和暖如春祷膳,著一層夾襖步出監(jiān)牢的瞬間陶衅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工直晨, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留搀军,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓勇皇,卻偏偏與公主長得像罩句,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子敛摘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354