【发布时间】:2021-10-29 15:58:18
【问题描述】:
如果我有一个叫做 Person 的合同,比如说,它包含一个名字和一个年龄,还有一个叫做 People 的合同,这个合同看起来像
contract People {
mapping(string => Person) myPeople;
addPerson(string memory name, uint age) {
Person person = new Person(name, age);
myPeople[name] = person;
}
}
我想知道在这种情况下,区块链中实际发生了什么。我知道声明 Person person = new Person(name, age) 实际上会将新的 Person 合约部署到区块链上(我会为此付费)。但是当我通过myPeople[name] = person; 将其存储在映射中时,我是仅存储合约地址,还是再次存储其所有数据? (即在已部署合约的存储中,以及在 People 合约的存储中。如果是第二个,听起来只存储地址会便宜很多。我注意到我可以从映射,并且可以调用它的函数而不必实例化它,但也许在幕后从它的地址实例化合约有一些魔法,这使得我可以调用它的函数?
【问题讨论】:
-
这是一个很好的问题。我首先要说我不确定。但我很有信心猜测您的存储中没有合同数据的副本。只是因为这听起来不是一个好计划。考虑一下它的含义,您可能有两个指向相同数据的假定指针,并且可能不同。无论哪种方式,它仍然可能是这种情况,也许我可以编写一些测试并检查 gas 成本..
标签: solidity