Solidity教学第二集_资料类别与架构

区块链的应用日趋广泛,智能合约现阶段也在金融、供应链等领域快速发展,让许多流程高效率自动化,同时资安管控品质也大幅提升。以下将会有五篇教学文章,让有或没有程序背景的读者都能先撰写基础智能合约,以便继续深造或参与区块链相关项目之商业开发案时能顺利沟通。

上一篇章我们介绍了智能合约、Remix、储存与检验、ETH的基本概念,忘记的朋友可以回去多家复习。这一集我们将会针对资料类别与结构做教学,承接上一集的程序代码继续。

前置更新资料

 

 

在我们开始之前,让我们先更新我们的智能合约,以配合最新版的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;
}

很好各位现在已经更新成最新的版本喽!

资料类别与结构

 

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)被更改。

 

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;

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;
    }
}

这样一来你就能在你的智能合约内检查以及改变的状态拉!有了这个方法在未来在撰写智能合约时就能确认合约是否有被打开或是关起来。

 
 
 
 

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;
    }
}

 

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去查询先前我所加入的资料。

最后我们的程序代码应该会像这样

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);
    }
}


本文链接地址:https://www.wwsww.cn/btbjiaoxue/5933.html
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。