Надежность - доступ к массиву хранения вызывает возврат моего контракта без объяснения причин. - PullRequest
0 голосов
/ 18 января 2020

У меня есть следующий контракт:

// Inspired by  https://fravoll.github.io/solidity-patterns/eternal_storage.html
pragma solidity ^0.5.8;

import "./lib/Ownable.sol";
import "./MemberStruct.sol";

contract Registry is Ownable, MemberStruct {
    // ------
    // STATE
    // ------

    // Maps member address to Member data
    // Note, this address is used to map to the owner and delegates in the ERC-1056 registry
    mapping(address => Member) public members;
    bytes32 public charter;

    // ------------
    // CONSTRUCTOR:
    // ------------

    /**
    @dev Contructor     Sets the addresses for token, voting, and parameterizer
    */
    constructor (
        bytes32 _charter
    ) public {
        charter = _charter;
    }

    // --------------------
    // GETTER FUNCTIONS
    // --------------------

    function getChallengeID(address _member) external view returns (uint256) {
        Member memory member = members[_member];
        return member.challengeID;
    }

    function getMembershipStartTime(address _member) external view returns (uint256) {
        Member memory member = members[_member];
        return member.membershipStartTime;
    }

    // --------------------
    // SETTER FUNCTIONS
    // --------------------

    function updateCharter(bytes32 _newCharter) external onlyOwner {
        charter = _newCharter;
    }

    function setMember(
        address _member,
        uint256 _membershipStartTime
    ) external onlyOwner {
        // Create the member struct
        Member memory member = Member({
            challengeID: 0,
            membershipStartTime: _membershipStartTime
        });
        // Store the member
        members[_member] = member;
    }

    function editChallengeID(address _member, uint256 _newChallengeID) external onlyOwner {
        Member storage member = members[_member];
        member.challengeID = _newChallengeID;
    }

    function editMembershipStartTime(address _member, uint256 _newTime) external onlyOwner {
        Member storage member = members[_member];
        member.membershipStartTime = _newTime;
    }

    function deleteMember(address _member) external onlyOwner {
        delete members[_member];
    }
}

И контракт MemberStruct:

pragma solidity ^0.5.8;

/*
 The delegate address can execute voting on behalf of the owner of the
 member project.
 The delegate and owner are stored in ERC-1056s registry
*/

// MemberStruct is here so that both Everest and Registry can inherit, and stay seperate contracts
contract MemberStruct {
    struct Member {
        uint256 challengeID;    // Is 0 if it is not challenged
        // Used for reputation: (now - membershipStartTime) = voteWeight
        // Used to determine membership as well: membershipStartTime > now
        uint256 membershipStartTime;
    }
}

Доступ к setMember() не работает. Когда я пытаюсь получить доступ к сопоставлению, он просто падает с возвратом. Я знаю, что это эта строка, потому что, когда я закомментирую ее, мой код пройдет через это. Я действительно понятия не имею, в чем может быть проблема. Я также проверил функцию тег editMembershipStartTime(), и она имеет ту же проблему.

Самое странное - это функция editChallengeID() работает !!! Это смутило меня еще больше.

Может кто-нибудь помочь?

...