我有一个安全问题在我的Solidity合同,我不知道如何解决它。
流程如下:
- 首先,我们创建一个合约A的实例;
- 创建合约B的实例,在构造函数中接收合约A的实例(它的地址);
- 在某个时刻,合约B从合约a调用函数'foo',告诉合约a将钱发送到一个地址(地址作为参数接收);
- 契约A看到消息。发送方为合同B的地址;
我的问题是:
- 我想限制合约B中函数'foo'的访问权限,只能由合约A调用(不允许人工调用);
- 我无法创建修改符来检查地址。由于我在创建合同B之前创建了合同A,所以我无法知道合同A中合同B的地址;
- 我不能使函数内部,因为合同不是派生的;
你能给我建议如何解决这个问题或解释另一种方法吗?我是Solidity的新手。谢谢你!
我不能设置修饰符来检查地址
可以,但是地址需要在一个变量中,在部署合约B之后设置。
pragma solidity ^0.8;
contract ContractA {
address contractB;
modifier onlyContractB {
require(msg.sender == contractB);
_;
}
function foo() external onlyContractB {
}
function setContractBAddress(address _contractB) external {
contractB = _contractB;
}
}
pragma solidity ^0.8;
interface IContractA {
function foo() external;
}
contract ContractB {
IContractA contractA;
constructor(address _contractA) {
contractA = IContractA(_contractA);
}
function callFoo() external {
contractA.foo();
}
}
- 部署合同A
- 部署契约B,将其传递给"构造函数 中的地址
- 在"合同a"中设置
contractB
值
为了简单起见,在ContractA
中设置contractB
地址时,我省略了任何验证机制。在本例中,任何人都可以设置地址,这可能是您不想要的,并且您应该添加一种机制,允许只有授权的发送者才能在ContractA
中设置contractB
值。