Debuggen der Registrierung in einem Mapping

Ich habe diesen Vertrag namens Registry

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]];
    } 
}

und ein anderer namens Benutzer

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);
    }
}

Die registry(), getPublicAddress(), und getContractAddress()funktionieren nicht und ich kann nicht verstehen, warum.

Ich habe versucht, mit Truffle zu testen, bin aber auf einen bekannten Fehler gestoßen, der bis jetzt ungelöst ist. Ich habe hier danach gefragt , die Diskussion auf GitHub ist hier .

Ich habe versucht, es in meiner privaten Blockchain auszuführen, wo ich den folgenden Code habe

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);
        }
    })
}

Nach der Registrierung (und dem Mining) melde ich mich einfach zurück

[]

beim Anruf getPublicAddress()oder getContractAddress().

Kann jemand sehen, wo das Problem liegt?

Müssen bytes32Parameter getPublicAddressund getContractAddressFunktionen übergeben werden?

Antworten (1)

Ihr Vertrag weist viele Fehler auf, wie folgt:

  • regparams, es gibt keine Möglichkeit, es einzustellen. Der Standardwert von reg ist null, sodass der Register-Vertrag nicht aufgerufen wird, wenn Sie getPublicAddressdie Methode aufrufen.
  • Es gibt keine Rückgabewerte von getPublicAddressund getContractAddressMethoden.

Also habe ich Ihren Vertrag geändert und getestet, dass alles in Ordnung ist remix , Vertrag wie folgt:

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);
    }
}

Zuerst sollten Sie den Register-Vertrag und dann den Benutzervertrag bereitstellen, jetzt die Register-Vertragsadresse kopieren, um die setRegisterMethode aufzurufen, zu minen und zu testen. Das Ergebnis ist

Geben Sie hier die Bildbeschreibung ein

Hoffe es hilft~