У меня два контракта, один админ, другой субъект. Для простоты я просто включаю функции, которые вызываются в контрактах, связанных друг с другом.
contract Subject {
uint public count = 0;
function increaseCount() returns newCount{
count ++;
newCount = count;
}
}
Субъект контракта имеет счетчик, который можно увеличить с помощью прямого вызова из web3.js
или из Master
контракта.
contract Master {
bool public isActive=false;
uint public num=0;
function changeState() returns bool newState{
isActive = !isActive;
newState = isActive;
}
function increaseSubjectCount(subjectAddr) returns uint newCount{
SubjectContract subjectContract = SubjectContract(subjectAddr);
newCount = ubjectAddr.increaseCount();
}
}
Таким образом, транзакция запускается для Master
заключения контракта (конечно, после того, как она будет совершена) вместе с достаточным количеством газа. Затем эта функция использует газ для вызова increaseCount()
функции в Subject
контракте, который возвращает новый счетчик. Это, в свою очередь, возвращается по Master
контракту через web3.js
. Проблема, с которой я сталкиваюсь, заключается в том, что если я использую твердость браузера для компиляции Master
контракта, он выдает ошибку о том, что параметр SubjectContract не определен. Если я добавлю оба контракта, а затем скомпилирую код, когда я использую
var myContract = web3.eth.contract(masterContract.abi);
не вызовет ли это проблем, если код abi включает в себя код предмета и основного контракта вместе, но если я этого не сделаю, компилятор выдаст кучу ошибок.
Еще одна вещь, которую я рассматривал, — это использование операторов импорта перед компиляцией, но я не уверен, как это безопасно реализовать. Пожалуйста, помогите ребята!
Что вам нужно сделать, так это определить интерфейс SubjectContract
контракта, чтобы Master
контракт можно было скомпилировать.
Вот ваш Master
контракт с SubjectContract
интерфейсом вместе с небольшими изменениями:
pragma solidity ^0.4.2;
contract SubjectContract {
function increaseCount() returns (uint newCount);
}
contract Master {
bool public isActive=false;
uint public num=0;
function changeState() returns (bool newState) {
isActive = !isActive;
newState = isActive;
}
function increaseSubjectCount(address subjectAddr) returns (uint newCount) {
SubjectContract subjectContract = SubjectContract(subjectAddr);
newCount = subjectContract.increaseCount();
}
}
Отдельно вам придется развернуть следующее SubjectContract
с небольшими изменениями:
pragma solidity ^0.4.2;
contract SubjectContract {
uint public count = 0;
function increaseCount() returns (uint newCount) {
count ++;
newCount = count;
}
}
let myContract = web3.eth.contract(MasterContract.abi)
и выполняю это, в коде abi слово contract
используется дважды, так как же web3js узнает, что я хочу создать основной контракт, а предметный контракт — это просто интерфейс? Не будет ли путаницы по этому поводу?
11т
@Varun
Как вы получилиSubjectAddr
? У меня возникли проблемы с импортом контракта,SubjectContract subjectContract = SubjectContract(subjectAddr);
потому что я хочу, чтобы он получил адрес сам по себе, например, с помощьюSubject.deplyed().address
или что-то в этом роде.Варун Агарвал
subjectAddr
, это параметр, который вам нужно знать заранее и передавать как регулярное выражение.11т
@Varun
Я имел в виду это, потому что у меня есть оба контракта в одном файле, и я*.sol
должен получить . Итак, есть ли команда, которую я могу использовать, чтобы мне не приходилось вставлять адрес контракта в трюфель или web3. что-то вродеsubjectAddr
SubjectContract subjectContract = SubjectContract(subjectAddr);
.address
Варун Агарвал
SubjectContract subjectContract = SubjectContract(subjectAddr);
заключался в том, чтобы сослаться на существующий контракт по известному адресу и проверить его значения. Итак, если развернуто 100 таких контрактов, я хочу иметь возможность вызывать каждый из них отдельно и проверять его значения изMaster
контракта. Если адрес контракта не будет вставлен, это противоречит цели моей функции. :)11т
address
какой-либо другой контракт в этом файле.Варун Агарвал
.sol
файле или нет. На самом деле я думаю, что вы не сможете получить доступ к адресу другого контракта, если он находится в том же файле, что и основной контракт. Пожалуйста, проверьте это, используя браузер Solidity или тестовую сеть, потому что я уверен, что вы не сможете. Дайте мне знать, если вы можете, хотя.