顺晟科技
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(此);
}
}
17
2022-03
28
2021-08
28
2021-08
28
2021-08
16
2021-06
16
2021-06