建议和反馈

请填写你的反馈内容

问答 > 公链 > 问答详情
求助中

将需要恢复在同一交易中的单独合约中所做的存储更改 - Solidity10LK

我是 Solidity(以及一般编码)的新手,所以如果这是一个愚蠢的问题,请原谅我!我试图了解跨多个合同的 require 语句的范围。我想设计一个主合约,用户可以为其设置配额,然后与其他几个需要定制 ERC20 代币进行交互的子合约进行交互。这个想法是,用户只需要授权管理他们的代币的主合约,并确保它们在与其他合约交互时被转移到其他合约中进行支付,而不是必须让用户为所有其他合约设置配额单独签约。

比如说我们有两个合约,合约 A 是主合约(在这种情况下用户已经设置了正确的配额),合约 B,用户想要与之交互的合约。用户调用合约 A 中的函数,在执行之前检查他们是否拥有使用 b 中的函数所需的代币数量。如果一切都在财务方面检查出来,则合约 A 调用合约 B 中的函数,该函数还需要检查某些变量才能继续。提供所有检查后,B 将用户添加到映射并返回,然后 A 执行 transferfrom 函数。(我希望这一切都有意义);

用户是否可以在 call_b 执行期间的某个时刻以通过前两个 require 语句但在 transferfrom 执行时失败的方式将允许更改为零,如果确实发生了这种情况,A 中的 require 失败将恢复 B 中所做的存储更改作为结果?

要么

我考虑的另一个选项是在通过财务检查后立即转移用户的代币,并依赖 Bf(msg.sender) 周围的 require 语句在转移失败时恢复转移。(如果继续设置为false)

要么

这一切真的很愚蠢吗,还有更好的方法来进行。

在此先感谢您的帮助。

// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.8.0 <0.9.0;import "Contract_B.sol";import "Token.sol";contract Contract_A{
  Contract_B public contract_B;
  Token public token;
   constructor(Contract_B _contract_B, Token _token){
      contract_B =  Contract_B(_contract_B);
      token = Token(_token);
       
    }
    function call_b() public returns(bool){
      //financial checks - the cost against balance and allowance
      uint costToUse = b.costToUse;
      require(token.balanceOf(address(msg.sender)) >= costToUse ,"You don't have enough!");
      require(token.allowance(address(msg.sender), address(this)) >= costToUse , "Allowance to 
      low");
      //Would transerfrom be better here?.Would (require b.f(msg.sender)) revert a transfer.
      //effects - set values  
      require(b.f(msg.sender), "failed!");
      require(token.transferFrom(address(msg.sender), address(this), costToUse ), "Transfer 
      Error");
    }}contract Contract_B{
  
  // insstance of master contract for security check
  Contract_A public contract_A;
  
  bool public continue;
  uint public costToUse;
  uint public userCount;
  mapping(uint => address) users;
  
  constructor(Contract_A _contract_A, uint _costToUse){
    contract_A = new(_contract_A); 
    costToUse = _costToUse;
    continue = true;
  }
  modifier onlyA(){
      require(msg.sender == contract_A, "not contract A!");  
    _;
  }
  
  function f(address _user) public onlyA() returns (bool){
    require(continue , "Can not continue");
    users[userCount] = _user;
    userCount++;
    return true;
  }
   
  function setContinue(bool _continue) public onlyA() returns(bool){
      continue= _continue;
      return true;
  }}


2021-08-10
0
请先登陆或注册

xiaohei2021-08-12
区块链资讯,内部资料V:GBLS18057440235


投一票
评论(0)
赞赏(0)
xiaohei2021-08-12
挖矿交流,V:GBLS18057440235


投一票
评论(0)
赞赏(0)

求助中

解决了这个问题,预计可以帮助到

  • 0
  • 1
  • 1
  • 6
  • 1
邀请

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励