我想要在solidity里通过众筹例子,但我遇到了下面的情况:

contract Crowdfunding {
struct CampaignData {
    address recipient;
    uint contributed;
    uint goal;
    uint deadline;
    uint num_contributions;
    mapping(uint => Contribution) contributions;
}

struct Contribution {
    address contributor;
    uint amount;
}

uint nextCampaignId;
mapping(uint256 => CampaignData) campaigns;

// Start a new campaign.
function start(address recipient, uint256 goal, uint256 deadline) returns (uint id) {
    var campaign = campaigns[nextCampaignId];
    campaign.recipient = recipient;
    campaign.goal = goal;
    campaign.deadline = deadline;
    nextCampaignId ++;
    id = nextCampaignId;
}

这里发生了什么?

我们为什么要使用映射? 它有什么好处? 我不知道它的工作机制,因此无法使用它。 原文地址

1 人回答 0

1 个回答
投票数
最旧发布
最近发布

回答发布于 2018-09-07 21:33:08

解析映射

映射用于构造值类型,比如布尔值,整数,地址和结构体。 它由两个部分组成:_KeyType_ValueType; 它们以下列语法显示:

mapping (_KeyType => _ValueType) mapName

在上面提供的合约例子中,

mapping (uint256 => CampaignData) campaigns

uint256 是_KeyType,CampaignData _ValueType 。注意_ValueType CampaignData 是一个结构体。

将值类型映射到键类型

可以把_KeyType看做为了得到所需值你要传给函数的键,或者说是_ValueType。默认情况下,映射初始为空,因此新建的_KeyType需要映射到一个_ValueType上。

合约例子里的start函数处理的3个基本过程:(1)给_KeyType赋予新的_ValueType CampaignData结构体; (2)用变量值填充新的CampaignData结构体; (3)获取一个新的_KeyType nextCampaignID为下一次调用合约例子的start函数做准备。 这部分功能可以像这样解析:

(1)给_KeyType赋予新的_ValueType CampaignData结构体;

var campaign = campaigns[nextCampaignId];

在这一行里,nextCampaignId被映射为_KeyType,新的项目结构体是_ValueType

2)用变量值填充新的CampaignData结构体;

campaign.recipient = recipient;
campaign.goal = goal;
campaign.deadline = deadline;

3)为下一次函数调用获取一个新的_KeyType nextCampaignID

nextCampaignId ++;

这里使用映射很有用,因为映射可以存储许多对_KeyTypes_ValueTypes - 在这种情况下,如果有多个项目同时发生,则每个项目都可以拥有自己的campaignID。 在将来的功能中调用CampaignData时,每个项目都有自己的ID是很有用的。

从具有键的映射访问值

这个合约例子实际上不提供任何函数来访问映射中的值。 但我们可以想象一下这可能是什么样的:如果一个项目的截止日期以某种方式延长,那么extendDeadline函数可能如下所示:

function extendDeadline(uint campaignID, uint256 newDeadline) {
    var campaign = campaigns[campaignId];
    campaign.deadline = newDeadline;
}

extendDeadline函数使用campaignID _KeyType查询项目映射,查找相应的CampaignData结构体并使用newDeadline更新其截止日期

||
||

回答发布于 2018-09-07 21:33:08

解析映射

映射用于构造值类型,比如布尔值,整数,地址和结构体。 它由两个部分组成:_KeyType_ValueType; 它们以下列语法显示:

mapping (_KeyType => _ValueType) mapName

在上面提供的合约例子中,

mapping (uint256 => CampaignData) campaigns

uint256 是_KeyType,CampaignData _ValueType 。注意_ValueType CampaignData 是一个结构体。

将值类型映射到键类型

可以把_KeyType看做为了得到所需值你要传给函数的键,或者说是_ValueType。默认情况下,映射初始为空,因此新建的_KeyType需要映射到一个_ValueType上。

合约例子里的start函数处理的3个基本过程:(1)给_KeyType赋予新的_ValueType CampaignData结构体; (2)用变量值填充新的CampaignData结构体; (3)获取一个新的_KeyType nextCampaignID为下一次调用合约例子的start函数做准备。 这部分功能可以像这样解析:

(1)给_KeyType赋予新的_ValueType CampaignData结构体;

var campaign = campaigns[nextCampaignId];

在这一行里,nextCampaignId被映射为_KeyType,新的项目结构体是_ValueType

2)用变量值填充新的CampaignData结构体;

campaign.recipient = recipient;
campaign.goal = goal;
campaign.deadline = deadline;

3)为下一次函数调用获取一个新的_KeyType nextCampaignID

nextCampaignId ++;

这里使用映射很有用,因为映射可以存储许多对_KeyTypes_ValueTypes - 在这种情况下,如果有多个项目同时发生,则每个项目都可以拥有自己的campaignID。 在将来的功能中调用CampaignData时,每个项目都有自己的ID是很有用的。

从具有键的映射访问值

这个合约例子实际上不提供任何函数来访问映射中的值。 但我们可以想象一下这可能是什么样的:如果一个项目的截止日期以某种方式延长,那么extendDeadline函数可能如下所示:

function extendDeadline(uint campaignID, uint256 newDeadline) {
    var campaign = campaigns[campaignId];
    campaign.deadline = newDeadline;
}

extendDeadline函数使用campaignID _KeyType查询项目映射,查找相应的CampaignData结构体并使用newDeadline更新其截止日期

||
||

回答发布于 2018-09-07 21:33:08

解析映射

映射用于构造值类型,比如布尔值,整数,地址和结构体。 它由两个部分组成:_KeyType_ValueType; 它们以下列语法显示:

mapping (_KeyType => _ValueType) mapName

在上面提供的合约例子中,

mapping (uint256 => CampaignData) campaigns

uint256 是_KeyType,CampaignData _ValueType 。注意_ValueType CampaignData 是一个结构体。

将值类型映射到键类型

可以把_KeyType看做为了得到所需值你要传给函数的键,或者说是_ValueType。默认情况下,映射初始为空,因此新建的_KeyType需要映射到一个_ValueType上。

合约例子里的start函数处理的3个基本过程:(1)给_KeyType赋予新的_ValueType CampaignData结构体; (2)用变量值填充新的CampaignData结构体; (3)获取一个新的_KeyType nextCampaignID为下一次调用合约例子的start函数做准备。 这部分功能可以像这样解析:

(1)给_KeyType赋予新的_ValueType CampaignData结构体;

var campaign = campaigns[nextCampaignId];

在这一行里,nextCampaignId被映射为_KeyType,新的项目结构体是_ValueType

2)用变量值填充新的CampaignData结构体;

campaign.recipient = recipient;
campaign.goal = goal;
campaign.deadline = deadline;

3)为下一次函数调用获取一个新的_KeyType nextCampaignID

nextCampaignId ++;

这里使用映射很有用,因为映射可以存储许多对_KeyTypes_ValueTypes - 在这种情况下,如果有多个项目同时发生,则每个项目都可以拥有自己的campaignID。 在将来的功能中调用CampaignData时,每个项目都有自己的ID是很有用的。

从具有键的映射访问值

这个合约例子实际上不提供任何函数来访问映射中的值。 但我们可以想象一下这可能是什么样的:如果一个项目的截止日期以某种方式延长,那么extendDeadline函数可能如下所示:

function extendDeadline(uint campaignID, uint256 newDeadline) {
    var campaign = campaigns[campaignId];
    campaign.deadline = newDeadline;
}

extendDeadline函数使用campaignID _KeyType查询项目映射,查找相应的CampaignData结构体并使用newDeadline更新其截止日期

||
||