将函数访问限制为仅对 Solidity 中的另一个特定合约
Restrict function access ONLY to one other specific contract in Solidity
我的 Solidity 合约存在安全问题,我不知道如何解决。
流程是这样的:
- 首先,我们创建一个合约A的实例;
- 创建合约B实例,在构造函数中接收合约A实例(其地址);
- 在某些时候,合约 B 从合约 A 调用一个函数 'foo',该函数告诉合约 A 将钱发送到一个地址(该地址作为参数接收);
- 合约A将msg.sender视为合约B的地址;
我的问题是:
- 我想限制合约B中的函数'foo'只能被合约A调用(不能人工调用);
- 我无法创建修改器来检查地址。由于我先创建合约A,再创建合约B,无法知道合约A中合约B的地址;
- 我无法将函数设为内部函数,因为合约不是派生的;
能否就如何解决此问题或解释另一种方法向我提供建议?我是 Solidity 的新手。
谢谢!
I cannot make a modifier to check the address.
可以,但地址需要在一个变量中,在部署合约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”地址
- 在“合同A”中设置
contractB
值。
为了简单起见,我在 ContractA
中设置 contractB
地址时省略了任何身份验证机制。在此示例中,任何人都可以设置地址,您可能不希望这样,您应该添加一种机制,只允许授权发件人在 ContractA
.
中设置 contractB
值
我的 Solidity 合约存在安全问题,我不知道如何解决。
流程是这样的:
- 首先,我们创建一个合约A的实例;
- 创建合约B实例,在构造函数中接收合约A实例(其地址);
- 在某些时候,合约 B 从合约 A 调用一个函数 'foo',该函数告诉合约 A 将钱发送到一个地址(该地址作为参数接收);
- 合约A将msg.sender视为合约B的地址;
我的问题是:
- 我想限制合约B中的函数'foo'只能被合约A调用(不能人工调用);
- 我无法创建修改器来检查地址。由于我先创建合约A,再创建合约B,无法知道合约A中合约B的地址;
- 我无法将函数设为内部函数,因为合约不是派生的;
能否就如何解决此问题或解释另一种方法向我提供建议?我是 Solidity 的新手。 谢谢!
I cannot make a modifier to check the address.
可以,但地址需要在一个变量中,在部署合约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”地址
- 在“合同A”中设置
contractB
值。
为了简单起见,我在 ContractA
中设置 contractB
地址时省略了任何身份验证机制。在此示例中,任何人都可以设置地址,您可能不希望这样,您应该添加一种机制,只允许授权发件人在 ContractA
.
contractB
值