Содержание

Тип “структура” в Solidity

В Solidity есть способ объявлять новые типы в форме структур:

pragma solidity ^0.4.11;

contract CrowdFunding {
    // Объявление нового типа с 2 полями.
    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.
        campaigns[campaignID] = Campaign(beneficiary, goal, 0, 0);
    }

    function contribute(uint campaignID) public payable {
        Campaign storage c = campaigns[campaignID];
        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;
    }
}

Данный контракт не предоставляет всю функциональность для краудфандинг-контракта (контракта распродажи), но он демонстрирует базовую концепцию, необходимую для понимания структур. Структурные типы можно использовать внутри маппингов и массивов, и они сами могут содержать маппинги и массивы.

Структуру не может содержать элемент своего типа, хотя сама структура может быть типом значения элемента mapping. Это ограничение необходимо, так как размер структуры должен быть конечным.

В предыдущем примере в функциях тип структуры присваивается локальной переменной (по умолчанию для данных хранения данных). Это не копирует структуру, а только сохраняет ссылку, так что назначения членам локальной переменной фактически записываются в состояние.

Конечно, можно напрямую обращаться к членам структуры, не присваивая ее локальной переменной, как в campaigns[campaignID].amount = 0.

Материал был полезен? Поделитесь в соц. сетях:
Логотип echain.ru

Добавить комментарий

Ваш e-mail не будет опубликован.