Solidity基礎語法

Solidity

Solidity是編寫智能合約的語言恢恼,運行在ethereum虛擬機上民傻。語法類似于JS,它擁有異常機制,一旦出現(xiàn)異常漓踢,所有的執(zhí)行都會被撤回牵署,這是為了保證合約執(zhí)行的原子性,避免中間狀態(tài)出現(xiàn)的數(shù)據(jù)不一致喧半。

官方提供了IDE: remix
下面看一個簡單的合約的例子:

pragma solidity ^0.4.9;
contract Helloworld {
    function multi(uint a, uint b) returns (uint c) {
    uint result = a * b;
    return result;
    }
}

上面這個函數(shù)很簡單奴迅,調(diào)用multi方法進行乘法運算。

基礎語法

1.數(shù)據(jù)類型

  • address 以太坊地址的長度挺据,20個字節(jié)
  • int/uint 變長的有符號或無符號整型取具。支持以8遞增,uint8到uint256扁耐。uint 默認為uint256暇检。
  • bool 布爾型
  • mapping 鍵值對映射關系,如mapping(address => uint)
  • struct 結構體婉称,如下例子


2.狀態(tài)變量storage和局部變量memory

兩者區(qū)別很容易理解块仆,memory可以理解為臨時變量,不會記錄在鏈上酿矢,而storage是永久存儲的榨乎。

  • 變量定義時默認為storage,而作為函數(shù)參數(shù)時瘫筐,默認為memory
contract HelloWorld{
    
    //等價于 string storage public a;
    string public a;

    //參數(shù)等價于string memory _a
    function changeNum(string _a){
    }
    
    
}

  • 當函數(shù)參數(shù)為memory類型時蜜暑,相當于值傳遞,storage才是指針傳遞
contract HelloWorld2{
    
    string public a;
    
    function HelloWorld2(){
        a = "abc";
    }
    
    
    function f(){
        changeNum(a);
    }
    
    function changeNum(string _a){
        bytes(_a)[0] = "d";
      //由于_a默認為memory策肝,所以_a只是值傳遞肛捍,所以此時修改a的值是不成功的,輸出還是abc
      //需要把函數(shù)參數(shù)修改為string storage _a之众,才能輸出dbc
    }
}

  • 將變量賦值給一個新變量時拙毫,新變量的類型由賦值給它的類型決定。
function changeNum(string _a){
        //_a默認為memory類型棺禾,所以b也為memory
        string b = _a;
        bytes(_a)[0] = "d";
    }

3.函數(shù)四種訪問權限

函數(shù)聲明有public缀蹄、private、internal和external四種訪問權限

  • 1.函數(shù)默認聲明為public膘婶,即可以以internal方式調(diào)用缺前,也可以通過external方式調(diào)用⌒螅可以理解為能夠被內(nèi)部合約訪問和外部合約訪問衅码。
  • 2.Internal聲明的只允許通過internal方式調(diào)用,不能被外部合約脊岳。而external能夠被外部合約訪問逝段。
  • 3.private和internal類似垛玻,都不能被外部合約訪問,唯一的不同是private函數(shù)不能被子類調(diào)用奶躯,而internal可以帚桩。

如下例子:

contract FunctionTest{
    
    function publicFunc() {}

    function callFunc(){
        //以`internal`的方式調(diào)用函數(shù)
        publicFunc();
        
        //以`external`的方式調(diào)用函數(shù)
        this.publicFunc();
    }
    
    function internalFunc() internal{}
    
    function externalFunc() external{}
    
    
}

contract FunctionTest1 {
    function externalCall(FuntionTest ft){
        //調(diào)用另一個合約的外部函數(shù)
        ft.publicFunc();
        ft.externalFunc();
       //ft.internalFunc();調(diào)用失敗,無法調(diào)用internal函數(shù)
    }
}


4.pure巫糙、view朗儒、constant三種函數(shù)定義

當函數(shù)有返回值時,可以添加這三種定義参淹,用這三種方式定義的函數(shù)都只執(zhí)行讀操作醉锄,不會進行編譯執(zhí)行。即用了這三種方式定義的函數(shù)浙值,不會執(zhí)行函數(shù)里的邏輯恳不,只會執(zhí)行一個返回的讀操作。所以執(zhí)行這些函數(shù)不需要消耗gas費用开呐。

  • pure區(qū)別是用于返回非變量烟勋,如returns 10;
  • 而view和constant用于返回全局變量,兩者的區(qū)別為新舊版本
contract HelloWorld4{
    
    uint public a = 1;
    
  //由于被constant聲明的函數(shù)執(zhí)行讀操作筐付,所以a無法被修改  
  //執(zhí)行為f()卵惦,a依然為1
    function f() constant{
       a = 3;
    }

}

5.函數(shù)修飾符

用于以聲明方式修改函數(shù)的語義,如下例子:

contract HelloWorld{
    
    address public sender;
    
    function HelloWorld(){
        //創(chuàng)建合約時將合約創(chuàng)建者賦值給sender
        sender = msg.sender;
        
    }

  modifier onlyOwner(){
      //如果調(diào)用合約的人不是合約創(chuàng)建者則throw
      if(msg.sender != sender) throw;
      _;  //占位符
  }
  
  //這樣a函數(shù)就只能被合約的創(chuàng)建者調(diào)用了
  function a() onlyOwner{
      ...
  }
    
    

6.回退函數(shù)

fallback function 回退函數(shù)瓦戚,每一個合約有且僅有一個沒有名字的函數(shù)沮尿,往合約發(fā)送消息時,會執(zhí)行該函數(shù)较解。如果合約要正常接受ether畜疾,需要加上payable聲明。聲明后印衔,當有用戶往合約轉賬時啡捶,將觸發(fā)該函數(shù),可以在里面寫相應的邏輯奸焙。

7.異常處理

Solidity使用狀態(tài)恢復來處理異常瞎暑,就是說當拋出異常時將恢復到調(diào)用(包括自調(diào)用)前的狀態(tài)。
拋出異常的方式有assert与帆,require了赌,revert,throw鲤桥。

  • assert函數(shù),用于條件檢查渠概,只能測試內(nèi)部錯誤和檢查常量茶凳。
//檢查內(nèi)部計算是否會整型溢出
function add(uint256 a, uint256 b) internal constant returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }

  • require函數(shù)嫂拴,也是用于條件檢查,用于測試調(diào)用的輸入或者合約狀態(tài)變量贮喧。
function sendHalf(address addr) payable returns (uint balance) {
        require(msg.value % 2 == 0); // 只允許偶數(shù)
        .....
    }

  • revert 函數(shù)用于標記錯誤并恢復當前調(diào)用筒狠。
    function buy(uint amount) payable {
        if (amount > msg.value / 2 ether)
            revert("Not enough Ether provided.");
    }

  • throw 和revert一樣,但是throw在0.4.13被棄用箱沦,將來會被淘汰辩恼。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市谓形,隨后出現(xiàn)的幾起案子灶伊,更是在濱河造成了極大的恐慌,老刑警劉巖寒跳,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聘萨,死亡現(xiàn)場離奇詭異,居然都是意外死亡童太,警方通過查閱死者的電腦和手機米辐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來书释,“玉大人翘贮,你說我怎么就攤上這事”澹” “怎么了狸页?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長检激。 經(jīng)常有香客問我肴捉,道長,這世上最難降的妖魔是什么叔收? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任齿穗,我火速辦了婚禮,結果婚禮上饺律,老公的妹妹穿的比我還像新娘窃页。我一直安慰自己,他們只是感情好复濒,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布脖卖。 她就那樣靜靜地躺著,像睡著了一般巧颈。 火紅的嫁衣襯著肌膚如雪畦木。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天砸泛,我揣著相機與錄音十籍,去河邊找鬼蛆封。 笑死,一個胖子當著我的面吹牛勾栗,可吹牛的內(nèi)容都是我干的惨篱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼围俘,長吁一口氣:“原來是場噩夢啊……” “哼砸讳!你這毒婦竟也來了?” 一聲冷哼從身側響起界牡,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤簿寂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后欢揖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陶耍,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年她混,在試婚紗的時候發(fā)現(xiàn)自己被綠了烈钞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡坤按,死狀恐怖毯欣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情臭脓,我是刑警寧澤酗钞,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站来累,受9級特大地震影響砚作,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嘹锁,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一葫录、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧领猾,春花似錦米同、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至继低,卻和暖如春熬苍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袁翁。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工柴底, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钱磅,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓似枕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親年柠。 傳聞我的和親對象是個殘疾皇子凿歼,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 什么是智能合約 一個智能合約是一套以數(shù)字形式定義的承諾(promises) ,包括合約參與方可以在上面執(zhí)行這些承諾...
    CristicMei閱讀 4,379評論 0 16
  • 翻譯原文date:20170617 Solidity是靜態(tài)類型語言冗恨,這意味著每個變量的類型必須在編譯的時候指定(或...
    gaoer1938閱讀 676評論 0 0
  • 我的貓答憔,它叫花卷,是一只三花母貓掀抹。 和花卷的相遇沒有被尾隨的浪漫虐拓,也沒有救助流浪街頭的它的苦情,是在花鳥市場花10...
    Alice有只貓閱讀 353評論 3 7
  • 2018年3月27日辟谷第7天 早晨6點起床傲武,稱體重45.3kg蓉驹。 早餐:姜糖水1杯 站樁,心不能完全靜下來揪利,腦袋...
    愛學習的hvy閱讀 293評論 0 0
  • 我屏息 斌松 且讓我候一份婉約的愛戀态兴, 也給你盛一整滿杯的等待, 有關于西去的冷月疟位, 以及無車次的列車瞻润, 就從第一...
    深藍色木魚閱讀 406評論 0 2