18910140161

智能合约语言Solidity教程系列:结构体与映射

顺晟科技

2021-06-16 10:45:30

440

写在前面

实性是以太网智能契约的编程语言。在阅读本文之前,您应该对以太网和智能契约有所了解。

如果你不懂,建议你先看看什么是以太馆

本系列文章一部分参考Solidity官方文件(目前最新版本:0.4.20)进行翻译,另一部分是Solidity深度分析。

结构(结构)

实性提供了定义自定义类型的结构,自定义类型是引用类型。

让我们看看下面的例子:

务实稳健的^0.4.11;

合同众筹{

//用两个成员定义一个新类型

struct Funder {

地址地址;

uint金额;

}

结构活动{

地址受益人;

uint fundingGoal

uint numFunders

uint金额;

映射(uint=Funder)资助者;

}

uint numCampaigns

策划活动;

职能部门新活动(地址受益人,uint目标)公共回报(uint活动)

campaignID=numCampaigns//campaignID作为变量返回

//创建一个结构实例,将其存储在存储器中,并将其放入映射中

活动[campaignID]=活动(受益人,目标,0,0);

}

function contribute(uint Campaignid)public payable {

活动存储c=活动[Campaignid];

//用对应的映射项创建结构引用

//也可以用functor (msg)初始化。发送者,msg。值)。

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

c . amount=msg . value;

}

函数CheckGoalRealted(uint Campaignid)公共返回(bool Realted){

活动存储c=活动[Campaignid];

if (c .金额c .资金目标)

返回false

uint amount=c.amount

c .金额=0;

c .受益人.转让(金额);

返回true

}

}

以上是一个简化的众筹契约,但是可以帮助我们理解struct的基本概念,可以作为地图和数组中的元素。它还可以包含映射和数组等类型。

您不能声明一个结构并将其自身的结构作为成员。这一限制是基于结构尺寸必须受到限制的事实。

但是,struct可以用作映射的值类型成员。

请注意,在函数中,将结构分配给局部变量(默认为存储类型)实际上是一个复制引用,因此修改局部变量值将影响原始变量。

当然,您也可以通过访问成员直接修改该值,而无需将其分配给局部变量,如campaignID。金额=0

映射(映射)

映射类型,键值对映射关系的存储结构。定义为映射(_KeyType=_KeyValue)。除了映射、可变长度数组、协定、枚举和结构()之外,键类型几乎允许所有类型。值类型没有限制,值类型可以包括任何类型的映射类型。

映射可以看作是一个哈希表,所有可能的键都将被虚拟创建,并映射到一个类型的默认值(二进制全零)。在映射表中,不存储密钥的数据,只存储其keccak256哈希值,这是搜索值时需要的。

正因为如此,映射没有长度,没有键集或值集的概念。

映射类型只能用作状态变量或内部函数中存储类型的引用。

您可以通过将映射标记为公共来让实度创建访问器。通过提供一个键值作为参数来访问它,相应的值将被返回。

映射的值类型也可以是映射。当使用访问器访问时,您应该提供对应于映射值的键,并连续重复此过程。

让我们看一个例子:

务实稳健的^0.4.0;

合同映射示例{

映射(address=uint)公共余额;

功能更新(uint newBalance)公共{

balances[msg . sender]=new balance;

}

}

合同映射用户{

函数f()公共返回(uint) {

mapping example m=new mapping example();

m . update(100);

返还m.balances(此);

}

}

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航