0

我正在尝试通过从此链接中获取参考来编写医疗保健合同。当患者发送地址时,医生只能更新患者的详细信息。

文件: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(). Doctor contract它不会进入循环内部。看来owner != msg.sender. 我正在使用 remix IDE 并将患者的合同地址输入到医生At Address输入区域。

4

2 回答 2

3

加载之前创建的合约。

remix 中的At Address字段允许您将地址视为某种类型的合约。

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

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

医生合同没有意义。

APatient应该有 aDoctor和/或 aDoctor应该有多个Patients。

是不是Doctor合同名错了?

患者添加医生

无论如何,Doctor似乎希望将其创建者视为患者地址,这意味着Patient应该有一种方法可以通过以下方式在其内部某处创建Doctor合同:

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

然后你可以创建一个Patient,调用病人的createDoctor函数。

调用后,您可以获得PatientmyDoctor地址,然后在 remix 中选择 remix 中的合约,在字段Doctor中输入您获得的地址并单击。myDoctorLoad contract from addressAdd Address

这应该意味着您在 Remix 中有 aPatient和 aDoctor可见,但是您需要在内部的方法Patient来调用AddProblemit's 内部的方法myDoctor,因为这只能由 the 调用,Patient而不能由您调用。

于 2018-04-10T15:17:10.080 回答
0

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

看起来您正在尝试创建Patient合约,获取合约地址,然后Doctor使用您检索到的地址创建合约。这行不通。如果您想msg.sender成为合约Doctor的地址,则Patient需要在( )Doctor内创建合约。Patientnew Doctor()

于 2018-04-10T15:17:27.247 回答