Javascript 如何在内存中初始化地图
我刚开始写solidity,我有一些问题找不到答案 当您像这样声明贴图时:Javascript 如何在内存中初始化地图,javascript,blockchain,solidity,Javascript,Blockchain,Solidity,我刚开始写solidity,我有一些问题找不到答案 当您像这样声明贴图时: struct UserAccount{ string name; uint id; } mapping (address => UserAccount) public accounts; 这将如何初始化?还是用什么 例如,访问 accounts[0x79d66c53ad6f1847288c0d06c01a2b38c38f15bc] 是否将返回UserAccount的实例?如果是,这意味着映射为
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
我不明白为什么在我的函数中没有触及所有者的值时,所有者的值会发生变化
如果有人能帮忙,我将不胜感激。同样,我知道正确的方法,但我之所以发布这篇文章,是因为我想了解我所做的不是为了完成工作 请不要在一篇帖子中发布多个问题,因为这会导致问题过于宽泛而被关闭 对于第一个问题,所有变量都有一个初始默认值。从: 映射可以被看作是哈希表,它实际上是初始化的,因此每个可能的键都存在,并且映射到一个字节表示为全零的值:一个类型的默认值 零值不使用存储 对于第二个问题,您正在覆盖状态变量,因为您使用的是
存储
变量,而您应该使用内存
变量。请参见此处提供的答案: