solidity - 当您将合约存储在映射中时,实际存储了什么?
问题描述
例如,如果我有一个名为 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
从映射中检索,并且可以调用它的函数而不必实例化它,但也许在幕后从它的地址实例化合约的地方有一些魔法,这使得我可以调用它的函数?
解决方案
存储在合约存储中的实际值(在映射的People
每个项下)是已部署合约的地址。myPeople
Person
Person
合约存储在合约中不重复People
。
我可以从映射中检索 Person,并且可以调用它的函数而无需实例化它
当People
合约与Person
实例交互时,它只是使用合约的接口。Person
所以People
合约知道函数Person
有什么,预期的参数是什么,返回值等。
当你从映射中分配一个变量时,Solidity 使用本地接口myPeople
实例化一个与远程合约交互的辅助对象Person
(记住第一段,地址存储在你的合约中) 。 Person
所以,是的,这就是魔法的来源。:)
推荐阅读
- python - 消除一维数组中的斑点/斑点
- ios - 获取默认日历时出错,仅第一次出现,但之后工作正常
- xquery - 3 个查询总和不等于数据库中总文档数的精确值?
- java - 如何在主线程的 onCreate/ 中获取房间列表的大小?
- java - eclipse Oxygen 2“控制台”空白
- java - 我无法解决此问题 无法解析构造函数 BarData(java.lang.String
- drupal - Drupal 增加分页索引从 1 开始而不是 0
- angular - angular2 / 4 上的 getDate() 错误
- hadoop - Hadoop 3.0 纠删码:对文件读取性能的影响?
- apache - RandomSortField 没有给出相同的结果 Apache Solr 5.5