標籤:不可 交易 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合約詳解