首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将地址添加到Struct的地址数组中不会持久

将地址添加到Struct的地址数组中不会持久
EN

Ethereum用户
提问于 2017-11-07 23:47:10
回答 1查看 273关注 0票数 0

在我之后,我很难让“观察者”数组持久化:

  1. 部署合同
  2. 创建名为"test1“的魔术
  3. 执行watchMagic (使用test1 1‘S魔法id)
  4. 执行watchMagic (使用来自不同帐户的test1 1‘S魔法id )
  5. 调用getMagicWatchers,它返回一个空数组

有什么想法吗?

代码语言:javascript
复制
contract WTF {

        struct Magic {
            bytes32 id;
            string name;
            address[] watchers;
        }

        uint _nonce;

        mapping (bytes32 => Magic) public allMagic;

        uint private _numWatchersMax = 16;

        function countWatchers(Magic magic) internal returns(uint) {
            uint count;
            uint i;
            for (i = 0; i < magic.watchers.length; i++) {
                if (address(0) != magic.watchers[i]) {
                    count++;
                }
            }
            return count;
        }

        function registerMagicWatcher(Magic magic, address watcher) internal returns(bool success) {
            magic.watchers[countWatchers(magic)] = watcher;
            return true;
        }

        function createMagic(string name) public returns(bytes32 magicId) {
            Magic memory magic = Magic({
                id: keccak256(msg.sender, name, _nonce++),
                name: name,
                watchers: new address[](_numWatchersMax)
            });

            require(registerMagicWatcher(magic, msg.sender));

            return magic.id;
        }

        function getMagicWatchers(bytes32 magicId) returns(address[] watchers) {
            return allMagic[magicId].watchers;
        }

        function watchMagic(bytes32 magicId) returns(bool success) {
            require(allMagic[magicId].id == magicId); // ensure magic with this id exists
            require(countWatchers(allMagic[magicId]) < _numWatchersMax);

            bool alreadyWatcher = false;
            uint i;
            for (i = 0; i < allMagic[magicId].watchers.length; i++) {
                if (msg.sender == allMagic[magicId].watchers[i]) {
                    alreadyWatcher = true;
                    break;
                }
            }
            require(alreadyWatcher == false);

            require(registerMagicWatcher(allMagic[magicId], msg.sender));
            return true;
        }
}
EN

回答 1

Ethereum用户

发布于 2017-11-09 14:18:05

您的createMagic函数创建了一个魔术实例,但从不存储

代码语言:javascript
复制
    function createMagic(string name) public returns(bytes32 magicId) {

        // Allocates magic inmemory
        Magic memory magic = Magic({
            id: keccak256(msg.sender, name, _nonce++),
            name: name,
            watchers: new address[](_numWatchersMax)
        });

        // Add msg.sender as watcher
        require(registerMagicWatcher(magic, msg.sender));

        // Save magic in storage
        allMagic[magic.id] = magic;             // <------- Missing part

        // return id
        return magic.id;
    }
票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/30142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档