solidity學習筆記(一)

關於搭建的第一個solidity ----Hello World

pragma solidity ^0.5.0;

contract Hello {
    string public name;
    function sayhello() public returns (string memory){
        name = 'hello world';
        return name;
    }
}

在remix編譯器上運行這個代碼
在這裏插入圖片描述
通過點擊deploy來部署智能合約,部署成功後會出現下面綠色框的內容,裏面展示的是你的智能合約中 public 出來的函數和變量名字;可以通過點擊他們進行數據的展示和函數方法的調用。當點擊sayhello的時候,會調用合約中的函數,控制檯也會打印出調用成功的日誌,然後再點擊name查看調用之後的name的值,會發現變成了hello world

pragma solidity ^0.5.0;

contract Calculate {
    uint public a = 20;
    uint public b = 30;
    uint public c;
    function add() public{
        c = a + b;
    }
    function sub() public {
        c = b - a;
    }
    function mul() public {
        c = a * b;
    }
    function div() public {
        c = b / a;
    }
}

上面的例子中a 和 b 已經定義並且給了固定的值,如果想要通過從外界傳值的話需要改變一下代碼的結構;

pragma solidity ^0.5.0;

contract Calculate {
    // uint public a = 20;
    // uint public b = 30;
    uint public c;
    function add(uint a, uint b) public{
        c = a + b;
    }
    function sub(uint a, uint b) public {
        c = a - b;
    }
    function mul(uint a, uint b) public {
        c = a * b;
    }
    function div(uint a, uint b) public {
        c = a / b;
    }
}

在這裏插入圖片描述
點擊部署之後可以傳入你的參數,用逗號隔開,寫入參數之後點擊調用函數方法,就可以運行方法;
看起來這一切和以往的編程語言差不多~確實差不多,現在在來看看判斷語句;if 的應用:

pragma solidity ^0.5.0;

contract Judge {
   uint public c = 0;
   function judgement(uint a, uint b) public returns(uint){
       if(a > b){
           return a + b;
       } else if( a == b) {
           return a * b;
       } else {
           return c;
       }
   }
}

solidity的循環(數組)

pragma solidity ^0.5.0;

contract Judge {
   uint[5] a = [1,2,3,4,5];
   uint[] b;
   function getList() public returns(uint){
       for(uint i = 0; i < a.length; i++){
           b.push( a[i]);
       }
       return b[2]; // 3
   }
}

說道循環不得不說一下solidity的數組這個概念,目前對於solidity定義一個數組是有兩種方式,一個是規定了數組的長度的,一個是不確定數組長度的;
uint[5] 表示定義的數組的長度是5位
uint[] 表示的是不確定數組的長度的情況下,一般這種數組是memory類型,

  • T[k]:元素類型爲T,固定長度爲k的數組;
  • T[]:元素類型爲T,長度爲動態的數組;
  • bytes string: 是一種特殊的數組;
  • string 可以轉換爲bytes,bytes類似於byte[];
    數組的成員有:length和push()
    通過bytes()可以將字符串轉換成一個字節數組

memory表示你的數據變量是臨時的,這是一個標記,與他相對的是storage,就是我們常說的內存,他不是永久存在的,比如函數的參數和函數的返回值都默認的存在內存中,memory是一個臨時的空間,在函數調用的時候出現,在函數調用之後被釋放;
storage修飾的變量是永久存在的,比如一些複雜變量,狀態變量就是存在區塊鏈中,storage對gas的消耗是遠遠大於memory的;

solidity的public 和 private

public:
公開函數是合約接口的一部分,可以通過內部或者消息來進行調用。對於public類型的狀態變量,會自動創建一個訪問器。 函數默認的可見性是public
private:
私有函數和狀態變量僅在當前合約中可以訪問,在繼承的合約內,不可訪問,外部也是無法訪問的。
internal:
這種狀態變量可供外部和子合約調用,這種類型的函數和private類型的函數一樣,智能合約自己內部調用,不過和private不一樣的是,他可以在繼承的合約裏面調用,它和其他語言中的protected不完全一樣。
external:
外部函數是合約接口的一部分,只能使用消息調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章