Solidity概述及基本代碼展現

Solidity是實施智能合約的契約導向的高級語言。它受到C ++,Python和JavaScript的影響,旨在針對以太坊虛擬機(EVM)。html

Solidity是靜態類型的,支持繼承,庫和複雜的用戶定義類型等功能。java

您將會看到,能夠建立投票,衆籌,盲目拍賣,多重簽名錢包等等的合約。數據庫

 

1 Solidity智能合約例子

咱們從一個基礎的solidity例子開始。開始的時候,你可能看不懂每一行具體的意思,可是不要緊,咱們會在後續的講解中介紹每個細節。瀏覽器

1
2
3
4
5
6
7
8
9
10
11
pragma solidity ^0.4.0;
contract SimpleStorage {
    uint storedData;
    function set(uint x) {
        storedData = x;
    }
    function get() constant returns (uint) {
        return storedData;
    }
}

第一行告訴該合約用的是0.4.0版本的solidity編寫,而且這些代碼具備向上兼容性。保證不會在不一樣solidity編譯版本下編譯會出現不一樣的行爲。併發

  從Solidity角度來看,合約就是存在於以太坊區塊鏈中的一個特定地址中的代碼和數據集合。uint storedData 聲明瞭一個類型爲 uint(256位的無符號整型)的變量,變量名稱爲 storedData。你能夠把它想象爲數據庫中的一個字段,該字段是能夠被數據庫中的方法進行查詢,修改。在以太坊中,這個字段是屬於一個合約字段。在這個例子中,該變量能夠經過提供的get,set方法進行獲取或是修改。在Solidity中,訪問一個變量是不須要經過this來引用的。app

這個合約很簡單,只是容許以太坊上的任何人來存儲一個數據到某個節點,同時把這個操做發佈到以太坊中,固然,以太坊上的其餘節點一樣能夠經過調用set方法來修改你已經存儲好的值。雖然有被修改,可是對該值操做的任何歷史記錄都是保存在以太坊中的。不用擔憂你的存儲記錄或是修改記錄會丟失。後面咱們會將到如何對合約進行限制,只容許你一我的修改這個數據。區塊鏈

 

2 Solidity子貨幣例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
pragma solidity ^0.4.0;
contract Coin {
    //public關鍵字可讓外部訪問該變量
    address public minter;
    mapping (address => uint) public balances;
    //事件可讓輕客戶端快速的響應變化
    event Sent(address from, address to, uint amount);
    // 構造方法
    function Coin() {
        minter = msg.sender;
    }
    function mint(address receiver, uint amount) {
        if (msg.sender != minter) return;
        balances[receiver] += amount;
    }
    function send(address receiver, uint amount) {
        if (balances[msg.sender] < amount) return;
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        Sent(msg.sender, receiver, amount);
    }
}

下面的例子將實現一個簡單的加密貨幣例子。無中生幣不在是夢想,固然只有合約的建立人才有這個特權。此外,任何人只要有一個以太坊密鑰對就能夠進行貨幣交易,根本不須要註冊用戶名和密碼。這個合約引入了一些新的概念,讓咱們一個個都過一遍。ui

  address public minter;this

  聲明瞭一個public,類型爲address的狀態變量。Address類型是一個160位的值,不容許任何的算術操做。它適合於存儲合約地址或是其餘人的密鑰對。Public關鍵字會自動產生用於外部訪問該變量值的方法。若是不聲明public,其餘的合約是沒法訪問該變量的。自動產生的方法相似於:加密

  function minter() returns (address) { return minter; }

  固然若是你增長了一個和上面徹底同樣的方法是沒有任何做用的,咱們須要變量和產生的方法名徹底一致。這塊其實編譯器會幫助咱們完成,不須要咱們本身動手編寫,咱們只要知道這個概念就能夠。

  mapping (address => uint) public balances;

  仍是建立了一個公有狀態變量,這是一個比address更復雜的數據類型,相似java裏的Map<address,uint>,它描述了一個地址和一個uinit數據類型的map關係。Mappings的關係能夠當作是一個hash表,全部可能的key都對應了一個0的值。固然在map裏不存在只有key值或是隻有value值的狀況。因此咱們須要記住添加了一個什麼樣的map關係或是像這個例子同樣,如何使用它。由於這是個public變量,因此係統會自動爲它生成一個get方法,相似於:

  function balances(address _account) returns (uint) {

     return balances[_account];

  }

  經過上面的方法咱們能夠很容易的查詢一個帳號的餘額。

  event Sent(address from, address to, uint amount);

  這一行建立了一個名爲event 的事件。該事件會在該示例的最後一行被觸發。用戶或是server應用能夠花很低的代價(後面會講代價是什麼)來監聽事件的觸發。一旦這個事件被觸發了,監聽者接收到三個參數:from, to,amount.也是說從哪一個帳號,到哪一個帳號,金額是多少。經過這三個參數能夠很容易追蹤到具體的交易。爲了監聽這個事件,咱們須要使用以下代碼:

1
2
3
4
5
6
7
8
9
10
Coin.Sent().watch({}, '', function(error, result) {
    if (!error) {
        console.log("Coin transfer: " + result.args.amount +
            " coins were sent from " + result.args.from +
            " to " + result.args.to + ".");
        console.log("Balances now:\n" +
            "Sender: " + Coin.balances.call(result.args.from) +
            "Receiver: " + Coin.balances.call(result.args.to));
    }
})

注意 :用戶是如何調用系統自動生成的balances方法。

Coin方法是構造方法,是在合約產生的時候系統會調用,並且以後不容許被調用。Msg(以及tx和block)是一個全局變量,保存了能夠被區塊鏈訪問的一些屬性。它持久化了建立合約的節點的地址。 Msg.sender是值該方法調用者的地址。

最後,真正完成合約功能的,而且被其餘用戶調用的是mint和send方法。若是mint是被不是建立該合約的帳號調用,不會起任何做用。可是,send能夠被任何帳號(必須有以太幣的帳號)調用併發送以太幣給另一個帳號。注意,若是你用合約發送以太幣到另一個帳號,經過區塊鏈瀏覽器查看是查看不到任何變化的,由於發送以太幣的過程和金額的變化都被存儲在了特殊的以太幣合約裏。而不是體如今帳號上。經過使用事件,能夠很容易的建立一個區塊鏈瀏覽器,用來查看交易和帳號餘額。

 

原文連接:http://wangxiaoming.com/blog/2018/04/20/HPB-45-ETH-Solidity-code/

相關文章
相關標籤/搜索