как один смарт-контракт взаимодействует с другим смарт-контрактом с помощью web3js?

Это мой контракт с доктором.

pragma solidity ^0.4.24;

contract doctor {

    struct doctor_ds {
        address doctor_address;
        string speciality;
    }
    mapping(address => doctor_ds) public doctors_list;
    address hospital_address;

    function doctor() {
        hospital_address = msg.sender;
    }

    function add_doctors(address _new_doctor_address, string _speciality) {

        doctors_list[_new_doctor_address].doctor_address = _new_doctor_address;
        doctors_list[_new_doctor_address].speciality = _speciality;
    }

    function doctor_exist(address _doctor) public view returns(bool) {
        if (doctors_list[_doctor].doctor_address == _doctor) {
            return true;
        } else {
            return false;
        }
    }
}

================

Это мой терпеливый контракт.

pragma solidity ^0.4.24;

import "./doctor.sol";

contract patient {

    doctor doctor_obj;

    function patient(address _doctor_contract) {
        doctor_obj = doctor(_doctor_contract);
    }

    function check_if_doctor(address _ddoctor) returns(bool) {

        return doctor_obj.doctor_exist(_ddoctor);
    }

    function add_doc(address _d, string _s) {
        doctor_obj.add_doctors(_d, _s);
    }

    function A() payable {

    }
}

Я получаю сообщение об ошибке превышения газа, когда я звоню врачу, существующему в контракте с пациентом (используя ремикс и частную цепочку блоков Эфириума), а также я хочу создать внешний интерфейс для контракта с пациентом, но как ABI контакта врача будет использоваться при вызове контракта с пациентом add_doc и check_if_doctor функции. Я не знаю кода для web3js, когда контракты взаимодействуют друг с другом. Кто-нибудь, пожалуйста, помогите

Ответы (1)

Я попытался скомпилировать его после изменения конструктора пациента на:

doctor_obj = new doctor();

Таким образом, он автоматически создаст новый контракт с врачом при развертывании пациента. После этого "add_doc" и "check_if_doctor" работают нормально.

Итак, разверните пациента, результат abi будет включать в себя обе функции контракта, потому что пациент зависит от врача. Я думаю, вы сможете использовать одно и то же аби для прямого взаимодействия с двумя контрактами. Но адреса контрактов будут другими.

Я использовал интерфейс в Solidity, и он отлично работает. Спасибо сид за ответ.