Teacher合约通过接口调用Score合约的方法,怎么判断调用的用户

区块链技术集训营w2_2的作业

  1. 通过approve将teacher设置为用户b
  2. 用户b通过Teacher合约调用update方法,但是在onlyTeacher里面,msg.sender是Teacher的合约地址,想要让msg.sender == 用户b的条件没办法成立
  3. 请问update里面可以拿到用户b的地址吗,要怎么做权限控制
//  SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Score {

  mapping(address => uint) public scores;
  address public teacher;
  address public owner;

  constructor() {
    owner = msg.sender;
  }

  function update(address _student, uint _score) external onlyTeacher {
    scores[_student] = _score;
  }

  function approve(address _teacher) external onlyOwner {
    teacher = _teacher;
  }

  modifier onlyOwner() {
    require(msg.sender == owner, "only owner");
    _;
  }

  modifier onlyTeacher() {
    // msg.sender是Teacher合约地址,teacher是授权的用户地址
    require(msg.sender == teacher, "only teacher can update score");
    _;
  }
}

interface IScore {
  function update(address, uint) external;
}

contract Teacher {
  function updateScore(address _addr, address _student, uint _score) public {
    IScore(_addr).update(_student, _score);
  }
}
请先 登录 后评论

最佳答案 2022-05-17 09:57

你可以通过使用tx.origin获得用户b的地址。把限制器onlyTeacher()里面的msg.sender改成tx.origin。不知道这样满不满足你的需求

请先 登录 后评论

其它 1 个回答

Tiny熊
  擅长:智能合约,以太坊
请先 登录 后评论
  • 2 关注
  • 0 收藏,2165 浏览
  • 凉拌青瓜 提出于 2022-05-15 12:32