Wie aussagekräftig muss ich bei externen Aufrufen zu eingesetzten Verträgen sein?

Nehmen wir an, ich habe gerade einen Vertrag, den ich mit einem zukünftigen oder bestehenden Vertrag interagieren möchte. Dieser Vertrag hat zwei Modifikatoren (onlyPermittedContracts und onlyOwner), die bestimmen, ob ein Vertrag oder Benutzer eine bestimmte Funktion aufrufen darf oder nicht.

contract owned {
    address public owner;
    mapping (address => bool) public permittedContracts;
    function owned(){
        owner = msg.sender;
    }
    modifier onlyOwner{
        if(msg.sender != owner){
            throw;
        }
        _;
    }
    function transferOwnership (address newOwner) onlyOwner{
        owner = newOwner;
    }
    function addPermittedContract(address newPermittedContract)onlyOwner{
        if(permittedContracts[newPermittedContract]==true){
            throw;
        }
        permittedContracts[newPermittedContract]=true;
    }
    function removePermittedContract(address oldPermittedContract)onlyOwner{
        if(permittedContracts[oldPermittedContract]!=true){
            throw;
        }
        permittedContracts[oldPermittedContract]=false;
    }
    modifier onlyPermittedContracts{
        if(permittedContracts[msg.sender]!= true){
            throw;
        }
        _;
    }
}

contract ExistingContract is owned{
    //stuff has been removed
    mapping (address=> uint) public balanceOf;
    function issueNewToken(address recipient, uint amount)onlyOwner onlyPermittedContracts{
        if(balanceOf[recipient]+amount<balanceOf[recipient]){throw;}
        balanceOf[recipient]+=amount;
    }
}

Nehmen wir nun an, ich möchte einen neuen Vertrag erstellen, der sich auf diesen vorhandenen, vorab bereitgestellten Vertrag bezieht:

contract NewToken{
    oldToken previousToken = new oldToken();
    previousToken.issueNewToken(xxxxx, yyyy);

}

//an abstract contract
contract OldToken{
    function issueNewToken(address recipient, uint amount){}
}

Meine Frage ist, wie viele Informationen muss ich in die Funktion issueNewToken() in den abstrakten Vertrag aufnehmen, den ich in meinem zweiten Vertrag habe? Muss ich die verschiedenen Modifikatoren beschreiben oder reicht das aus, damit das Programm läuft? Danke.

Antworten (1)

So wie du vorgehst ist es richtig. Modifikatoren sind Teil der internen Funktionsweise des Vertrags, wirken sich jedoch in keiner Weise auf die externe Schnittstelle aus. Allein aus dem Funktionsnamen und den Argumenttypen kann die Funktion eindeutig aufgerufen werden.

Weitere Einzelheiten finden Sie in der ABI-Spezifikation