当您将合约存储在映射中时,实际存储的是什么?
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
界面。
是的,这就是魔法的来源。 :)
如果我有一个名为 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
界面。
是的,这就是魔法的来源。 :)