Как работает Mapping in solidity?

Я убедился в примере Crowdfunding, где я столкнулся с следующим:

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

Что на самом деле происходит здесь?

Почему мы использовали картографирование? Как это помогает нам? Я не мог понять его работу и, следовательно, не смог его использовать.

23 голоса | спросил Rahul Sharma 8 22016vEurope/Moscow11bEurope/MoscowTue, 08 Nov 2016 07:03:30 +0300 2016, 07:03:30

1 ответ


26

Анатомия отображения

Отображение используется для структурирования типов значений, таких как логические значения, целые числа, адреса и структуры. Он состоит из двух основных частей: _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 code> struct; (2) заполнение новой структуры CampaignData значениями переменных; и (3) закупать новый _KeyType nextCampaignID, чтобы быть готовым на палубе, в следующий раз, когда вызывается функция start примера контракта. Эти сегменты функции можно разбить так:

(1), давая _KeyType новый _ValueType CampaignData struct:

    var campaign = campaigns[nextCampaignId];

В этой строке nextCampaignId отображается как _KeyType, а новая структура campaign - это _ValueType .

(2) заполнение новой структуры CampaignData с переменными значениями:

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

(3) закупает новый _KeyType nextCampaignID для следующего вызова функции:

    nextCampaignId ++;

Использование отображения здесь полезно, потому что отображение может хранить много _KeyTypes до _ValueTypes - в этом случае, если есть много кампаний, происходящих сразу, у каждого из них есть свои собственные CAMPAIGNID. Каждая кампания, имеющая свой собственный идентификатор, является мощной при вызове CampaignData в будущих функциях.

Доступ к типам значений из сопоставления с ключевыми типами

Этот пример контракта фактически не предоставляет никаких функций, которые получают доступ к типам значений в сопоставлении. Но мы можем представить, как это может выглядеть: возможно, если срок действия кампании будет как-то расширен, функция extendDeadline может выглядеть так:

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

Функция extendDeadline будет использовать campaignID _KeyType, чтобы запросить сопоставление campaigns, чтобы найти подходящий CampaignData и обновить его CampaignData с помощью deadline.

ответил CBobRobison 8 22016vEurope/Moscow11bEurope/MoscowTue, 08 Nov 2016 10:27:41 +0300 2016, 10:27:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132