首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止在CALLCODE中使用我的合同代码?

如何防止在CALLCODE中使用我的合同代码?
EN

Ethereum用户
提问于 2019-04-11 12:48:17
回答 1查看 608关注 0票数 1

问题很简单,但我哪儿也找不到答案。

如何知道第三方是否在CALLCODE或DELEGATECALL中使用了我的合同代码,因为如果我没有错,address(this)返回调用方的地址而不是合同地址?

EN

回答 1

Ethereum用户

发布于 2019-04-11 13:27:16

简单方式

代码语言:javascript
复制
uint private constant MAGIC = ...; // Your birthday here
uint private magic = MAGIC;

function isDelegated () internal view return (bool) {
  return magic != MAGIC;
}

其思想是MAGIC是编译时常量,因此它将通过Solidity嵌入到字节码中,但是magic是状态变量。通常调用契约时,magic == MAGIC是真的,但在CALLCODEDELEGATECALL情况下,您的代码将观察调用契约的存储,因此magic很可能包含MAGIC以外的其他内容。虽然这种方法很容易被调用契约所欺骗,但它只保护不发生意外,而不受恶意使用。

可靠方法

您需要保存合同的实际部署地址,然后在方法中需要比较address(this)和保存的地址。问题是您无法将部署地址保存到存储中,因为当通过CALLCODEDELEGATECALL调用您的合同时,存储将不可用,因此您需要将部署地址保存到智能契约的字节代码中。在智能契约的构造函数中修改字节码是可能的,尽管这需要一些程序集编程。更简单的方法是在发布之前修改字节码。您只需要预测契约地址,这实际上是可能的,因为契约地址是从部署契约和事务的人的地址派生出来的。所以,你需要这样做:

代码语言:javascript
复制
function isDelegated () internal view returns (bool) {
  return address (this) != 0x0123456789012345678901234567890123456789;
}

在部署合同之前,您需要:

  1. 查找地址,合同将部署在
  2. 用此地址替换契约字节码中的0123456789012345678901234567890123456789
  3. 按惯例部署契约,但使用修改过的字节代码

然后,isDelegated将返回准确的结果。

顺便说一句,坚固性保护图书馆不被直接调用。和我认为这是使用字节码修改构造函数技术,如上所述,以实现这一点。

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

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

复制
相关文章

相似问题

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