我试图通过参考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
输入区域。
答案 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
合同,输入您获得的地址从Doctor
到myDoctor
字段,然后点击Load contract from address
。
这应该意味着您在混音中可以看到Add Address
和Patient
,但是您需要Doctor
内的方法来调用Patient
在AddProblem
内部的方法,因为这只能由myDoctor
调用,而不能由你调用。
答案 1 :(得分:0)
您没有正确使用at
。该字段用于获取对已部署合同的引用msg.sender
将是启动对函数的调用的地址(在建立对已部署合同的引用之后)。
您似乎正在尝试创建Patient
合同,获取合同地址,然后使用您检索到的地址创建Doctor
合同。这不行。如果您希望msg.sender
中的Doctor
成为Patient
合约的地址,则需要在Doctor
内创建Patient
合约({{1} }})。