当您将合约存储在映射中时,实际存储的是什么?

What is actually stored when you store a contract in a mapping?

如果我有一个名为 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; 将它存储在映射中时,我是只存储合约地址,还是第二次存储它的所有数据? (即既在已部署合同的存储中,也在人员合同的存储中。如果是第二个,听起来只存储地址会便宜很多。我注意到我可以检索 Person从映射中,并且可以调用它的函数而不必实例化它,但也许在合约从它的地址实例化的场景背后有一些魔法,这使得我可以调用它的函数?

存储在People合约存储中的实际值(在myPeople映射的每个项目下)是已部署[=12]的地址 =]合同。

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

I can a retrieve Person from the mapping, and can call its functions without having to instantiate it

People 合约与 Person 实例交互时,它仅使用 Person 合约的 接口 。所以 People 合约知道 Person 有什么功能,预期的参数是什么,return 值等

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

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