如何在内存中初始化地图

时间:2018-06-19 12:06:18

标签: javascript blockchain solidity

我只是想写出扎实的文字,我有一些我找不到答案的问题。

当您声明这样的地图时:

struct UserAccount{
    string name;
    uint id;
}

mapping (address => UserAccount) public accounts;

该如何初始化?还是什么?

例如,访问

accounts[0x79d66c53ad6f1847288c0d06c01a2b38c38f15bc]

将返回UserAccount的实例吗?如果是,是否意味着该映射为每个可能的地址创建一个UserAccount实例?那不占用很多内存吗?如果没有,那么您怎么能做到这一点:

accounts[_address].name = _name;

第二个问题:

我在合同中保留了作为所有者的地址,即创建合同的地址。

address public owner;
constructor() public {
    owner = msg.sender;
}

调用此函数后:

uint userCount=0;
mapping (address => UserAccount) public accounts;

function createAccount(string _name, uint _id, address _address) onlyOwner() public {
    UserAccount user;
    user.name = _name;
    user.id = _id;
    accounts[_address] = user;
    userCount += 1;
    // accounts[_address].name = _name;
    // accounts[_address].id = _id;
    // userCount += 1;
    emit UserCreated(_address, _id, _name);
}

modifier onlyOwner() {
    require(msg.sender == owner);
    _;        
}

所有者地址更改。我知道,createAccount函数中的注释行是做到这一点的方法,但是我想了解为什么它不起作用。

为澄清我的问题,我还将发布一个js测试。

beforeEach(async () => {
    voting = await Voting.new({from: owner});
});

it("Should delete poll, as owner", async () =>{
    var name = "Sandu";
    console.log("LOCAL OWNER= " + owner);
    console.log("OWNER BEFORE CREATE ACCOUNT FROM SOL= " + await voting.owner());
    await voting.createAccount(name, 1, firstUser,{from:owner});
    console.log("OWNER AFTER CREATE ACCOUNT FROM SOL= " + await voting.owner());
    var pollName = "First Poll";
    var endDateS="2018-08-11T10:20:30Z";
    var endDate=new Date(endDateS)
    await voting.createPoll(pollName, 1, endDate.getTime()/1000,{from:firstUser});


    try{
        await voting.deletePollById(1,{from: owner});
    }catch(err){
        console.log(err.message);
    }

    assert.notEqual(pollName, await voting.getPollById(1));
});

上面的测试显示:

LOCAL OWNER= 0x79d66c53ad6f1847288c0d06c01a2b38c38f15bc //Owner that o have in my js file local, first address from the ganache accounts.
OWNER BEFORE CREATE ACCOUNT FROM SOL= 0x79d66c53ad6f1847288c0d06c01a2b38c38f15bc  //The owner account from my contract before calling the function
OWNER AFTER CREATE ACCOUNT FROM SOL= 0x000000000000000000000000000000000000000a   //The owner account from my contract after calling the function

我不明白为什么所有者的值会发生变化,因为我没有在函数中进行修改。

如果有人可以提供帮助,将不胜感激。再说一次,我知道正确的方法,但是出于了解我没有做完这项工作的愿望,我发布了它。

1 个答案:

答案 0 :(得分:0)

请不要在一个帖子中发布多个问题,因为这可能会导致问题过于广泛。

对于第一个问题,所有变量都具有初始默认值。来自Solidity docs

  

映射可以看作是哈希表,实际上已经进行了初始化,因此每个可能的键都存在,并且映射到一个字节表示全为零的值:一种类型的默认值。

没有存储用于零值。

对于第二个问题,您正在覆盖状态变量,因为您正在使用storage变量,而应该使用memory变量。请参阅此处提供的答案:what are state variables in solidity?