问题很简单,但我哪儿也找不到答案。
如何知道第三方是否在CALLCODE或DELEGATECALL中使用了我的合同代码,因为如果我没有错,address(this)返回调用方的地址而不是合同地址?
发布于 2019-04-11 13:27:16
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是真的,但在CALLCODE或DELEGATECALL情况下,您的代码将观察调用契约的存储,因此magic很可能包含MAGIC以外的其他内容。虽然这种方法很容易被调用契约所欺骗,但它只保护不发生意外,而不受恶意使用。
您需要保存合同的实际部署地址,然后在方法中需要比较address(this)和保存的地址。问题是您无法将部署地址保存到存储中,因为当通过CALLCODE或DELEGATECALL调用您的合同时,存储将不可用,因此您需要将部署地址保存到智能契约的字节代码中。在智能契约的构造函数中修改字节码是可能的,尽管这需要一些程序集编程。更简单的方法是在发布之前修改字节码。您只需要预测契约地址,这实际上是可能的,因为契约地址是从部署契约和事务的人的地址派生出来的。所以,你需要这样做:
function isDelegated () internal view returns (bool) {
return address (this) != 0x0123456789012345678901234567890123456789;
}在部署合同之前,您需要:
0123456789012345678901234567890123456789然后,isDelegated将返回准确的结果。
顺便说一句,坚固性保护图书馆不被直接调用。和我认为这是使用字节码修改构造函数技术,如上所述,以实现这一点。
https://ethereum.stackexchange.com/questions/69551
复制相似问题