首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型(C).creationCode谁有这个权限?

类型(C).creationCode谁有这个权限?
EN

Ethereum用户
提问于 2022-07-28 16:31:12
回答 2查看 584关注 0票数 1

谁能接触到这个?

例如,如果我打电话给type(SimpleStorage).creationCode,这会不会引起一个问题,因为有很多SimpleStorage's

type()函数如何知道我在没有地址的情况下调用的特定C/contract?

所以从Solidity网站上

包含契约的创建字节码的内存字节数组。这可以用于内联程序集来构建自定义创建例程,特别是使用create2操作码。无法在合同本身或任何派生合同中访问此属性。它导致字节码包括在调用站点的字节码中,因此不可能有类似的循环引用。

因此,不能在合同本身内调用它(这是有意义的),也不能从我们希望creationCode来自的合同中调用它。

那么合同只能从父合同中调用吗?

说清楚,我至少有三个问题

  1. 如果有多个名为C的合同呢?
  2. 我可以在哪里叫这个函数?
  3. 它的范围是什么?安全方面的考虑是什么?
EN

回答 2

Ethereum用户

发布于 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()相同。

票数 1
EN

Ethereum用户

发布于 2022-11-13 04:51:44

从您共享的文档中可以看到:“包含契约的创建字节码的内存字节数组。”这意味着您要将当前的契约代码传递给type函数,它将为您提供契约的字节码。

代码语言:javascript
复制
    // SimpleStorage is not just the name, it is full contract code
    bytes memory bytecode = type(SimpleStorage).creationCode;

可能有很多名为"SimpleStorage“的契约,但是它们的代码是不同的,因此它们的字节代码是不同的。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/132580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档