首页 > 解决方案 > 当您将合约存储在映射中时,实际存储了什么?

问题描述

例如,如果我有一个名为 Person 的合同,其中包含一个姓名和一个年龄,以及另一个名为 People 的合同,而 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 合约的存储中。如果是第二个,听起来只存储地址会便宜很多。我注意到我可以Person从映射中检索,并且可以调用它的函数而不必实例化它,但也许在幕后从它的地址实例化合约的地方有一些魔法,这使得我可以调用它的函数?

标签: solidity

解决方案


存储在合约存储中的实际值(在映射的People每个项下)是已部署合约的地址。myPeoplePerson

Person合约存储在合约中不重复People

我可以从映射中检索 Person,并且可以调用它的函数而无需实例化它

People合约与Person实例交互时,它只是使用合约的接口Person所以People合约知道函​​数Person有什么,预期的参数是什么,返回值等。

当你从映射中分配一个变量时,Solidity 使用本地接口myPeople实例化一个与远程合约交互的辅助对象Person(记住第一段,地址存储在你的合约中) 。 Person

所以,是的,这就是魔法的来源。:)


推荐阅读