msg.sender不等于所有者

时间:2018-04-10 13:29:51

标签: solidity smartcontracts remix ether

我试图通过参考Link来编写医疗保健合同。医生只能在患者发送地址时更新患者的详细信息。

档案:Patient.sol

pragma solidity ^0.4.21;

contract Patient {
    string public name = "";
    string public dateOfBirth;
    mapping (address => uint) public balances;

    function () payable{
        balances[msg.sender] = 40;
    }

    function getContractAddress() public view returns(address) {
        return address(this);
    }

    // ############### Get Functions Begin ######################
    function getName() external view returns (string) {
        return name;  // First_Name Last_Name
    }

    function getDateOfBirth() external view returns (string) {
        return dateOfBirth; // YYYYMMDD
    }
}

档案:Doctor.sol

pragma solidity ^0.4.21;
import './Patient.sol';

contract Doctor{
    // the address of the owner (the patient)
    address public owner;
    string public name;
    string public dateOfBirth;
    string public patient_problem;

    modifier isOwnerPatient {
        require(msg.sender == owner);
        _;
    }
    // constructor that sets the owner to the address creating
    // this smart contract
    function Doctor() {
        owner =  msg.sender;
    }
    // allows physician to add an allergy
    function AddProblem(string _allergie) public isOwnerPatient {
        patient_problem =  _allergie;
    }
}

但是当我运行function AddProblem()的{​​{1}}时。它不会进入循环内部。似乎是Doctor contract。我正在使用remix IDE并将患者的合同地址输入到医生owner != msg.sender输入区域。

2 个答案:

答案 0 :(得分:2)

加载以前创建的合同。

混音中的At Address字段允许您将地址视为特定类型的合约。

在这种情况下,您告诉它Patient合约是Doctor,这是不正确的。

但是你有另一个问题......

医生合同没有意义。

Patient应该有Doctor和/或Doctor应该有多个Patient

可能是Doctor合同被错误命名了吗?

患者加入医生

无论如何,Doctor似乎想将其创建者视为患者地址,这意味着Patient应该有一种方法可以在某处创建Doctor合同在它里面通过例如:

address public myDoctor;
function createDoctor() public {
    myDoctor = new Doctor();
}

然后您可以创建Patient,呼叫患者的createDoctor功能。

拨打该号码后,您可以获取Patient的{​​{1}}地址,并在重新混音中,选择重新混合的myDoctor合同,输入您获得的地址从DoctormyDoctor字段,然后点击Load contract from address

这应该意味着您在混音中可以看到Add AddressPatient,但是您需要Doctor内的方法来调用PatientAddProblem内部的方法,因为这只能由myDoctor调用,而不能由你调用。

答案 1 :(得分:0)

您没有正确使用at。该字段用于获取对已部署合同的引用msg.sender将是启动对函数的调用的地址(在建立对已部署合同的引用之后)。

您似乎正在尝试创建Patient合同,获取合同地址,然后使用您检索到的地址创建Doctor合同。这不行。如果您希望msg.sender中的Doctor成为Patient合约的地址,则需要在Doctor内创建Patient合约({{1} }})。