solidity合約詳解

來源:互聯網
上載者:User

標籤:不可   交易   rem   ethereum   rac   環境   inter   錯誤   s函數   

Solidity 是一個面向合約的進階語言,其文法類似於JavaScript 。是運行在以太坊虛擬機器中的代碼。這裡我們用的是remix編譯環境。是一個線上的編譯環境。地址為http://remix.ethereum.org

Solidity的合約類似於物件導向語言中的類。下面我們可以先建立一個合約。

pragma solidity ^0.4.7;contract a{    uint x;    function set(uint num) public{        x = num;    }    function get() public returns(uint){        return x;    }}

  

這裡我們建立了一個合約a,合約中有一個狀態變數 x,狀態變數的儲存方式是storage的,定義了兩個函數 set 和 get,通過這兩個函數就可以得到和修改x。同時也可以申明建構函式。

pragma solidity ^0.4.7;contract a{    uint x;    function a() public{        x = 2;    }    function set(uint num) public{        x = num;    }    function get() public returns(uint){        return x;    }}

  

建構函式的名字要和合約的名字相同,上面的建構函式中對 x 初始化為1。

pragma solidity ^0.4.7;contract b{    uint public y;}contract a{    uint x;    b B = new b();    function a() public{        x = 1;    }    function set(uint num) public{        x = num;    }    function get() public returns(uint){        return x;    }}

  

上面的合約中我們在合約a中建立了合約b的對象 B,就可以通過B來調用 b 中的變數和函數。

在合約中的函數可以被指定為外部的,公用的,內部的或私人的,預設是公用的。 對於狀態變數,外部是不可能的,預設是內部的。

external:
外部功能是合約介面的一部分,這意味著它們可以通過其他合約和交易進行調用。 外部函數f不能在內部調用(即f()不起作用,但this.f()可以正常工作

public:
公用功能是合約介面的一部分,可以在內部或通過訊息進行調用。 對於公用狀態變數,產生自動Getters函數。

internal:
這些功能和狀態變數只能在內部進行訪問(即從當前合約或從其中獲得的合約),而不使用這些變數。

private:
私人函數和狀態變數只對其中定義的合約而不是衍生合約可見。

 

pragma solidity ^0.4.7;contract b{    uint public y;    function set(uint num) public{        y = num;    }    function get() internal returns(uint){        return y;    }}contract a{    uint x;    b B = new b();    function a() public{        x = 1;    }    function set(uint num) public{        B.set(2);        x = num;    }    function get() public returns(uint){        return x;    }    function gety() public returns(uint){        return B.get();//錯誤,在合約b中的函數        return B.y();    }   }

  

編譯器會自動為所有公用狀態變數建立getter函數。因此編譯器將產生一個名為y的函數,它不接受任何參數,並返回一個uint,即狀態變數資料的值。

solidity也支援合約的繼承,由於繼承實現是代碼複製。如果出現函數名重寫,最終使用的是繼承鏈上哪個合約定義的代碼呢?實際執行時,依據的是最遠繼承的原則

pragma solidity ^0.4.7;contract b{    function data() public returns(uint){        return 1;    }}contract a{    function data() public returns(uint){        return 2;    }}contract c is a,b{    function call() public view returns(uint){        return data();    }}contract d is b,a{    function call() public view returns(uint){        return data();    }}

  

上面的代碼中根據最遠繼承原則,合約 c 中 call 函數調用的是合約 b 的data 函數,合約 d 調用的是合約 a 的 data 函數

 

solidity合約詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.