限制函数只能访问Solidity中另一个特定的合约



我有一个安全问题在我的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();
}
}
  1. 部署合同A
  2. 部署契约B,将其传递给"构造函数
  3. 中的地址
  4. 在"合同a"中设置contractB

为了简单起见,在ContractA中设置contractB地址时,我省略了任何验证机制。在本例中,任何人都可以设置地址,这可能是您不想要的,并且您应该添加一种机制,允许只有授权的发送者才能在ContractA中设置contractB值。

相关内容

最新更新