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

}

}

注意:映射并未提供迭代输出的方法,能够自行实现一个这样的数据结构。

好了,今天就先写这么多,本身在写的时候都出了些小问题,毕竟不是特别的熟练,均可以算是学了没多久,凑凑活活的写了出来,有不对的但愿你们留言指出,多交流。

相关文章
相关标签/搜索