Registro de depuración en un mapeo

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?

¿ Hay que pasar bytes32parámetros getPublicAddressy getContractAddressfunciones?

Respuestas (1)

Su contrato tiene muchos errores, de la siguiente manera:

  • regparams, no hay forma de configurarlo. El valor predeterminado de reg es cero, por lo que no se llamará al contrato de registro cuando llame getPublicAddressal método.
  • No hay valores de retorno de getPublicAddressy getContractAddressmé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 setRegistermétodo, extraer y probar. El resultado es

ingrese la descripción de la imagen aquí

Espero que ayude ~