Tengo dos contratos, uno es Admin, otro es sujeto. Para simplificar las cosas, solo incluyo las funciones que se invocan en los contratos que se relacionan entre sí.
contract Subject {
uint public count = 0;
function increaseCount() returns newCount{
count ++;
newCount = count;
}
}
El objeto del contrato tiene un contador que se puede aumentar mediante una llamada directa desde web3.js
o desde el Master
contrato.
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();
}
}
por lo tanto, una transacción se dispara para Master
contratar (una vez que se realiza, por supuesto) junto con una cantidad suficiente de gas. Esta función luego usa la función gas para llamar increaseCount()
en el Subject
contrato que devuelve el nuevo contador. Esto, a su vez, es devuelto por el Master
contrato a través de web3.js
. El problema al que me enfrento es que si uso la solidez del navegador para compilar el Master
contrato, arroja un error que dice el parámetro SubjectContract indefinido. Si agrego ambos contratos y luego compilo el código, cuando uso
var myContract = web3.eth.contract(masterContract.abi);
¿Esto no causará problemas si el código abi incluye el tema y el contrato maestro juntos, pero si no hago esto, el compilador arroja un montón de errores?
Otra cosa que he considerado es usar declaraciones de importación antes de la compilación, pero no estoy seguro de cómo implementarlas de manera segura. Por favor, ayuda chicos!
Lo que debe hacer es definir la interfaz del SubjectContract
contrato para que el Master
contrato pueda compilarse.
Aquí está su Master
contrato con la SubjectContract
interfaz, junto con algunos cambios menores:
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();
}
}
Por separado, tendrá que implementar lo siguiente SubjectContract
con algunos cambios menores:
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)
y ejecuto esto, el código abi tiene la palabra contract
usada dos veces, entonces, ¿cómo sabe web3js que quiero crear el contrato maestro y el contrato sujeto es solo una interfaz? ¿No habrá confusión con respecto a esto?
11t
@Varun
¿Cómo conseguiste elSubjectAddr
? Tengo problemas para importar el contratoSubjectContract subjectContract = SubjectContract(subjectAddr);
porque quiero que obtenga la dirección por sí mismo, como usarSubject.deplyed().address
o algo así.Varun Agarval
subjectAddr
, es un parámetro que debes conocer de antemano y pasarlo como una expresión regular.11t
@Varun
Quise decir eso porque tengo ambos contratos en el mismo*.sol
archivo y tengo que obtenersubjectAddr
paraSubjectContract subjectContract = SubjectContract(subjectAddr);
. Entonces, ¿hay un comando que pueda usar en Solidity para no tener que insertar la dirección del contrato en truffle o web3? algo como el.address
Varun Agarval
SubjectContract subjectContract = SubjectContract(subjectAddr);
era hacer referencia a un contrato existente en una dirección conocida e inspeccionar sus valores. Entonces, si hay 100 contratos de este tipo implementados, quiero poder llamar a cada uno por separado e inspeccionar sus valores delMaster
contrato. Si no se insertara la dirección del contrato, anula el propósito de mi función. :)11t
address
de algún otro contrato en ese archivo.Varun Agarval
.sol
archivo o no. De hecho, creo que no podrá acceder a la dirección de otro contrato si está en el mismo archivo que el contrato principal. Pruébelo utilizando la solidez del navegador o una red de prueba, porque estoy bastante seguro de que no podrá hacerlo. Avísame si puedes sin embargo.