谁能接触到这个?
例如,如果我打电话给type(SimpleStorage).creationCode,这会不会引起一个问题,因为有很多SimpleStorage's
type()函数如何知道我在没有地址的情况下调用的特定C/contract?
所以从Solidity网站上
包含契约的创建字节码的内存字节数组。这可以用于内联程序集来构建自定义创建例程,特别是使用create2操作码。无法在合同本身或任何派生合同中访问此属性。它导致字节码包括在调用站点的字节码中,因此不可能有类似的循环引用。
因此,不能在合同本身内调用它(这是有意义的),也不能从我们希望creationCode来自的合同中调用它。
那么合同只能从父合同中调用吗?
说清楚,我至少有三个问题
C的合同呢?发布于 2022-07-29 13:25:21
您不能遇到多个合同名为C的情况。这个语言构造是编译时(而不是运行时),这意味着为了使用C,必须导入契约type(C).creationCode,而Solidity不允许在同一个源文件中使用相互冲突的名称。
您可以在以下情况下调用此函数:
C中,您不能使用type(C).creationCode。C继承了合同B,则不能使用type(B).creationCode。C是由合同B创建的,那么您就不能在C中使用type(B).creationCode。在所有这些情况下,这种用法在某种程度上是自引用的,这就是不允许使用的原因。
实际上,我没有任何安全考虑,因为使用来自create的代码调用type(C).creationCode实际上与new C()相同。
发布于 2022-11-13 04:51:44
从您共享的文档中可以看到:“包含契约的创建字节码的内存字节数组。”这意味着您要将当前的契约代码传递给type函数,它将为您提供契约的字节码。
// SimpleStorage is not just the name, it is full contract code
bytes memory bytecode = type(SimpleStorage).creationCode;可能有很多名为"SimpleStorage“的契约,但是它们的代码是不同的,因此它们的字节代码是不同的。
https://ethereum.stackexchange.com/questions/132580
复制相似问题