Tengo este contrato llamado Registro
pragma solidity ^0.4.11;
contract Registry {
mapping(bytes32 => address) public ID;
mapping(address => address) public Contract;
function register(bytes32 _id) {
ID[_id] = tx.origin;
Contract[tx.origin] = msg.sender;
}
function getPublicAddress(bytes32 _id) constant returns (address) {
return (ID[_id]);
}
function getContractAddress(bytes32 _id) constant returns (address) {
return Contract[ID[_id]];
}
}
y otro llamado Usuario
contract User {
address owner;
address reg;
Registry registry = Registry(reg);
// Register in the system
function register(bytes32 _id) {
registry.register(_id);
}
function getContractAddress(bytes32 _id) {
registry.getContractAddress(_id);
}
function getPublicAddress(bytes32 _id) {
registry.getPublicAddress(_id);
}
}
Los registry()
, getPublicAddress()
y getContractAddress()
no funcionan y no entiendo por qué.
Intenté probar con Truffle pero me encontré con un error conocido que no se ha resuelto a partir de ahora. Pregunté al respecto aquí , la discusión en GitHub está aquí .
Intenté ejecutarlo en mi cadena de bloques privada, donde tengo el siguiente código
register: function(publicAddress, contractAddress, _id) {
// Getting that user's instance of the contract
const contract = contractInstance("User", contractAddress);
// Interaction with the contract
contract.register(web3.fromAscii(_id), {from: publicAddress}, (err, res) => {
// Log transaction to explore
if (err) {
console.log(err);
} else {
console.log('tx: ' + res);
helpers.addTransaction(publicAddress, res);
}
});
},
getContractAddress: function(contractAddress, _id) {
const contract = contractInstance("User", contractAddress);
contract.getContractAddress.call(web3.fromAscii(_id), (err, res) => {
if (err) {
console.log(err);
} else {
console.log(res);
}
})
},
getPublicAddress: function(contractAddress, _id) {
const contract = contractInstance("User", contractAddress);
contract.getPublicAddress.call(web3.fromAscii(_id), (err, res) => {
if (err) {
console.log(err);
} else {
console.log(res);
}
})
}
Después de registrarme (y minar) simplemente vuelvo
[]
al llamar getPublicAddress()
o getContractAddress()
.
¿Alguien puede ver dónde está el problema?
Su contrato tiene muchos errores, de la siguiente manera:
reg
params, no hay forma de configurarlo. El valor predeterminado de reg es cero, por lo que no se llamará al contrato de registro cuando llame getPublicAddress
al método.getPublicAddress
y getContractAddress
métodos.Así que modifiqué su contrato y probé que todo está bien en remix , contrato de la siguiente manera:
pragma solidity ^0.4.11;
contract Registry {
mapping(bytes32 => address) public ID;
mapping(address => address) public Contract;
event log(bytes32,address);
function register(bytes32 _id) {
ID[_id] = tx.origin;
Contract[tx.origin] = msg.sender;
}
function getPublicAddress(bytes32 _id) constant returns (address) {
log(_id,ID[_id]);
return (ID[_id]);
}
function getContractAddress(bytes32 _id) constant returns (address) {
log(_id,Contract[ID[_id]]);
return Contract[ID[_id]];
}
}
contract User {
address owner;
Registry registry;
// Register in the system
function register(bytes32 _id) {
registry.register(_id);
}
function getContractAddress(bytes32 _id) constant returns (address){
return registry.getContractAddress(_id);
}
function getPublicAddress(bytes32 _id) constant returns (address) {
return registry.getPublicAddress(_id);
}
function setRegister(address _addr){
registry = Registry(_addr);
}
}
Al principio, debe implementar el contrato de registro y luego el contrato de usuario, ahora copie la dirección del contrato de registro para llamar al setRegister
método, extraer y probar. El resultado es
Espero que ayude ~
Sotavento
bytes32
parámetrosgetPublicAddress
ygetContractAddress
funciones?