Solidity語言

鏈客,專爲開發者而生,有問必答!編程

此文章來自區塊鏈技術社區,未經容許拒絕轉載。數組

在這裏插入圖片描述

Solidity是以太坊智能合約的編程語言,我本身也是學習了好久,感受是有些難度,因此須要去認真的去了解並理解,今天所講的有基礎也有深刻的分析,閱讀以前,須要對以太坊、智能合約進行初步或者深刻的瞭解。數據結構

結構體app

Solidity提供struct來定義自定義類型,自定義的類型是引用類型。 咱們看看下面的例子:編程語言

pragma solidity ^0.4.11;函數

contract CrowdFunding {學習

// 定義一個包含兩個成員的新類型

struct Funder {

    address addr;

    uint amount;

}



struct Campaign {

    address beneficiary;

    uint fundingGoal;

    uint numFunders;

    uint amount;

    mapping (uint => Funder) funders;

}

uint numCampaigns;

mapping (uint => Campaign) campaigns;

function newCampaign(address beneficiary, uint goal) public returns (uint campaignID) {

    campaignID = numCampaigns++; // campaignID 做爲一個變量返回

    // 建立一個結構體實例,存儲在storage ,放入mapping裏

    campaigns[campaignID] = Campaign(beneficiary, goal, 0, 0);

}



function contribute(uint campaignID) public payable {

    Campaign storage c = campaigns[campaignID];

    // 用mapping對應項建立一個結構體引用

    // 也能夠用 Funder(msg.sender, msg.value) 來初始化.

    c.funders[c.numFunders++] = Funder({addr: msg.sender, amount: msg.value});

    c.amount += msg.value;

}



function checkGoalReached(uint campaignID) public returns (bool reached) {

    Campaign storage c = campaigns[campaignID];

    if (c.amount < c.fundingGoal)

        return false;

    uint amount = c.amount;

    c.amount = 0;

    c.beneficiary.transfer(amount);

    return true;

}

}區塊鏈

上面是簡單版的衆籌合約,但可讓咱們去理解structs基礎概念,其能夠用映射和數組中做爲元素。其自己也包括映射和數組等類型。ui

不能聲明一個struct同時將自生做爲成員,這個限制是基於 結構體大小必須是有限的。但struct能夠做爲mapping的值類型成員。this

注意在函數中,將一個struct賦值給一個局部變量,實際是拷貝的引用,因此修改局部變量值的同時,會影響到原變量。

固然,也能夠直接經過訪問成員修改值,而不用必定賦值給一個局部變量,如campaigns[campaignID].amount = 0

映射

映射類型,一種鍵值對的映射關係存儲結構。定義方式爲mapping(_KeyType => _KeyValue)。鍵類型容許除映射、變長數組、合約、枚舉、結構體外的幾乎全部類型。值類型沒有任何限制,能夠爲任何類型包括映射類型。

映射能夠被視做爲一個哈希表,全部可能的鍵會被虛擬化的建立,映射到一個類型的默認值。在映射表中,並不存儲鍵的數據,僅僅存儲它的keccak256哈希值,這個哈希值在查找值時須要用到。映射是沒有長度的,也沒有鍵集合或值集合的概念。

映射類型,僅能用來做爲狀態變量,或在內部函數中做爲storage類型的引用。

能夠經過將映射標記爲public,來讓Solidity建立一個訪問器。經過提供一個鍵值作爲參數來訪問它,將返回對應的值。映射的值類型也能夠是映射,使用訪問器訪問時,要提供這個映射值所對應的鍵,不斷重複這個過程。來看一個例子:

pragma solidity ^0.4.0;

contract MappingExample {

mapping(address => uint) public balances;



function update(uint newBalance) public {

    balances[msg.sender] = newBalance;

}

}

contract MappingUser {

function f() public returns (uint) {

    MappingExample m = new MappingExample();

    m.update(100);

    return m.balances(this);

}

}

注意:映射並未提供迭代輸出的方法,能夠自行實現一個這樣的數據結構。

好了,今天就先寫這麼多,本身在寫的時候都出了些小問題,畢竟不是特別的熟練,均可以算是學了沒多久,湊湊活活的寫了出來,有不對的但願你們留言指出,多交流。

相關文章
相關標籤/搜索