[英]Is the msg.sender address changed while passing to another contract as a parameter?
[英]Check if msg.sender is a specific type of contract
现在,任何人都可以在FirstContract
中调用setMyString
function 。 我正在尝试将对 function 的访问限制为SecondContract
的实例。 但不是一个特定的实例,任何SecondContract
类型的合约都应该能够调用setMyString
。
contract FirstContract{
String public myString;
function setMyString(String memory what) public {
myString=what;
}
}
contract SecondContract{
address owner;
address firstAddress;
FirstContract firstContract;
constructor(address _1st){
owner=msg.sender;
firstAddress=_1st;
firstContract=FirstContract(firstAddress);
}
function callFirst(String memory what){
require(msg.sender==owner);
firstContract.setMyString("hello");
}
}
Solidity 目前还没有一种简单的方法可以根据接口验证地址。
您可以检查字节码,它是否包含(公共属性和方法的)指定签名。 这需要比通常的 StackOverflow 答案大一点的 scope,所以我只描述步骤而不是编写代码。
首先,定义您要查找的签名列表(名称的 keccak256 hash 和 arguments 数据类型的第一个 4 个字节)。 您可以在此处和此处的我的其他答案中找到有关签名的更多信息。
文档中的一个示例显示了如何将任何地址(在您的情况下为msg.sender
)字节码作为bytes
(动态长度数组)获取。
然后,您需要遍历返回的bytes
数组并搜索 4 字节签名。
如果全部找到,则意味着msg.sender
“实现了接口”。 如果外部合约中缺少任何签名,则意味着它没有实现接口。
但是......我真的建议你重新考虑你的白名单方法。 是的,当新的SecondContract
想要第一次调用setMyString()
function 时,您需要维护列表并调用setIsSecondContract()
。 但是对于FirstContract
的setMyString()
function 的所有调用者来说,它的 gas 效率更高,并且首先更容易编写和测试功能。
contract FirstContract{
String public myString;
address owner;
mapping (address => bool) isSecondContract;
modifier onlySecondContract {
require(isSecondContract[msg.sender]);
_;
}
modifier onlyOwner {
require(msg.sender == owner);
_;
}
function setIsSecondContract(address _address, bool _value) public onlyOwner {
isSecondContract[_address] = _value;
}
function setMyString(String memory what) public onlySecondContract {
myString=what;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.