, ,

Solidity教學第二集_資料型別與架構

Solidity教學

Solidity教學第二集_資料型別與架構

區塊鏈的應用日趨廣泛,智能合約現階段也在金融、供應鏈等領域快速發展,讓許多流程高效率自動化,同時資安管控品質也大幅提升。以下將會有五篇教學文章,讓有或沒有程式背景的讀者都能先撰寫基礎智能合約,以便繼續深造或參與區塊鏈相關項目之商業開發案時能順利溝通。

上一篇章我們介紹了智能合約、Remix、儲存與檢驗、ETH的基本概念,忘記的朋友可以回去多家複習。這一集我們將會針對資料型別與結構做教學,承接上一集的程式碼繼續。

上一篇 : Solidity教學第一集

前置更新資料

在我們開始之前,讓我們先更新我們的智能合約,以配合最新版的solidity語言吧

而更新的方法就是將第一行的程式碼改成如下圖。

pragma solidity ^0.5.1;

這時你可能會遇到許多的警告標誌,但別緊張我們來修改我們的程式碼並解決這個狀況。

第一步我們修改 get() 這個function

function get() public view returns(string memory) {
    return value;
}

注意!我們的set() function一樣也要改成這樣的形式:

function set(string memory _value) public {
    value = _value;
}

很好各位現在已經更新成最新的版本嘍!

Solidity教學

資料型別與結構

Data Types and Data Structures


STRING

接下來我們要來講講什麼事資料型別以及結構,讓你們可以在智能合約上應用,之前我們只有簡單的宣告value這個變數,但卻沒告訴系統他是什麼種類的變數,而現在我們將他加上變數型態 string。

string public value;

我們將變數定義為public,讓外部使用者都可以使用到這個變數,而當我們做了這個動作 solidity就內建了 value()這個function,這樣一來就不用get()的function來呼叫,而且我們一樣可以給初始值。

string public value = “myValue”;

而這樣一來我們就不用在寫constructor,這樣也不用在寫很多很多的程式碼了。我們也可以將它設定為常數(constant)。

string public constant value = “myValue”;

完成後我們要將set這個fuction刪除,因為solidity不允許常數(constant)被更改。

Solidity教學

BOOL

現在我們學到了string這個資料型別我們要來試試看其他的資料型別,bool

bool public myBool = true;

這個bool的型態就是我們所說的true 跟false

INT

接下來是interger(整數),可以用以下的方法定義,interger可以是正整數也可以是負整數

int public myInt = 1;

如果不想要數字是負數的話可以利用以下的資料型態 unit

uint public myUint = 1;

可以指定變數為256 bits

uint256 public myUint256 = 9999;

我們也可以指定變數為8 bits

uint256 public myUint256 = 99999;

Solidity教學

ENUM

現在讓我們看看其他基礎的資料結構 : Enum

enum讓使用者可以自定義變數而不需要指定型態

enum State { Waiting, Ready, Active }

可以指定enum 內有各種不同的型態

就像上面的案例我們可以查看enum當中的 state

State public state;

接下來我們可以在constructor中設定預設值

constructor() public {
    state = State.Waiting;
}

我們可以更改Active值:

function activate() public {
    state = State.Active;
}

接下來我們可以檢查現在狀態是否在活動狀態

function isActive() public view returns(bool) {
    return state == State.Active;
}

所以我們現在的程式碼應該會長這樣:

pragma solidity 0.5.1;

contract MyContract {
    enum State { Waiting, Ready, Active }
    State public state;

    constructor() public {
        state = State.Waiting;
    }

    function activate() public {
        state = State.Active;
    }

    function isActive() public view returns(bool) {
        return state == State.Active;
    }
}

這樣一來你就能在你的智能合約內檢查以及改變的狀態拉!有了這個方法在未來在撰寫智能合約時就能確認合約是否有被打開或是關起來。

Solidity教學
Solidity教學
Solidity教學
Solidity教學

STRUCTS

我們可以使用structs這個方法來定義自己的變數型態,我們來看看是怎麼做的

struct Person {
    string _firstName;
    string _lastName;
}

我們創造了Person這個變數並在裡面放入了firstname以及lastname這個變數,而在這個structs的範圍內我們可以定義多達17個不同的變數,但今天我們簡單的先設定兩個變數就好。

Arrays:

而我們現在有了person這個structs這個結構我們需要將他儲存起來,我們利用Arrays這個資料型態,我們宣告一個people array。

Person[] public people;

我們將這個people變數設定為公開讓所有人都可以存取到。

我們可以利用一個索引數字(也就是資料位置)去查看我們在people中的資料,而我們的索引數字是從0開始的歐(這個很重要),所以我們要查看第一個資料 會用這樣的方式。

people(0)

但我們需要有一個函式去加入資料進去,我們使用一個addPerson的函式。

function addPerson(string memory _firstName, string memory _lastName)public {
    people.push(Person(_firstName, _lastName));
    peopleCount += 1;
}

這個function會接收struct person當中的變數「firstName」、「lastName」,並利用push這個方法將變數加到people這個array當中,剛剛也有提到我們在取得array中的值時會利用索引值的方式,所以也會有一個peopleCount這個變數去計算我們的索引值。

而因為這邊需要使用peopleCount,所以我們也需要定義這個變數像這樣

uint256 public peopleCount;

而現在你的程式應該會長得像這樣

pragma solidity 0.5.1;

contract MyContract {
    Person[] public people;

    uint256 public peopleCount;

    struct Person {
        string _firstName;
        string _lastName;
    }

    function addPerson(string memory _firstName, string memory _lastName) public {
        people.push(Person(_firstName, _lastName));
        peopleCount += 1;
    }
}

Solidity教學
Solidity教學

Mappings:

而在solidity當中也有一個資料型態,Mappings我們可以用以下方式定義他

mapping(uint => Person) public people;

但是在Mapping的型態當中是沒有一個索引值得所以我們必須自己將索引值加在先前的person struct當中像是

struct Person { uint _id; string _firstName; string _lastName; }

而接下來我們要改寫addperson這個fuction

function addPerson(string memory _firstName, string memory _lastName) public {
    peopleCount += 1;
    people[peopleCount] = Person(peopleCount, _firstName, _lastName);
}

在這邊我們用了peoplecount這個變數去判別現在資料的位置,像是底下的圖我利用id=1去查詢先前我所加入的資料。

Solidity教學

最後我們的程式碼應該會像這樣

pragma solidity 0.5.1;

contract MyContract {
    uint256 peopleCount = 0;

    mapping(uint => Person) public people;

    struct Person {
        uint _id;
        string _firstName;
        string _lastName;
    }

    function addPerson(string memory _firstName, string memory _lastName) public {
        peopleCount += 1;
        people[peopleCount] = Person(peopleCount, _firstName, _lastName);
    }
}

Solidity教學
發佈留言