ERC20 Token-Transfer durch Delegatecall-Würfe

Ich versuche, die Funktion transfer () auf einem ERC20-Token mithilfe von "delegatecall" aufzurufen, mein Proxy-Vertrag gibt jedoch "false" von "delegatecall" zurück.

Wenn ich versuche, Ansichtsfunktionen wie balanceOf() aufzurufen, gibt mein Proxy-Vertrag true zurück. Da es jedoch keine möglichen Ausnahmen in der balanceOf-Funktion gibt, würde ich auch "true" erhalten, selbst wenn "0" anstelle von "100000" zurückgegeben wird.

Der Token-Vertrag wird über den Konstruktor des Proxy-Vertrags bereitgestellt. Der Eigentümer des Token-Vertrags ist der Proxy-Vertrag. Bei der Bereitstellung prägt der Proxy-Vertrag 10.000 Token für den Ersteller.

Der importierte token.sol-Vertrag stammt von open-zeppelin und funktioniert eigenständig.

pragma solidity ^0.4.20;

import './token.sol';

contract Test {
    Token public token;
    constructor () {
        token = new Token("Test", "TST", 18);
        token.mint(msg.sender, 10000);
    }

    function call(address _to, uint256 _value) returns (bool) {
       return  address(token).delegatecall(bytes4(sha3('transfer(address, uint256)')), _to, _value);
    }
} 


status  0x1 Transaction mined and execution succeed  
decoded input   {
        "address _to": "0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C",
        "uint256 _value": "50"
    }
decoded output  {
        "0": "bool: false"
    }

Antworten (1)

Ich glaube du missverstehst den Zweck von delegatecall(). Er führt den aufgerufenen Vertrag im Kontext des aufrufenden Vertrags aus.

Mit anderen Worten, es wird der Code aus dem aufgerufenen Vertrag verwendet, aber der Code aus msgdem aufrufenden Vertrag. Da es nur Zugriff auf den Speicher des aufrufenden Vertrags hat, kann es keine Salden oder irgendetwas anderes über das Token selbst nachschlagen oder ändern.

Abhängig von Ihren Zielen möchten Sie möglicherweise stattdessen die Freibetragsfunktion des Tokens verwenden.

Richtig, wie ich es verstanden habe, würde es das msg-Objekt beibehalten, aber das ist dann nur für Vertragskonten der Fall? Gibt es keine Möglichkeit, die ursprüngliche Benutzeradresse, die die Funktion aufgerufen hat, beizubehalten? Ich kenne die Methoden Allowance und TransferFrom, aber es schien eine "langweilige" Problemumgehung zu sein.
Die Benutzeradresse bleibt erhalten. Das Problem ist, dass auch der Speicher erhalten bleibt. Der Token-Vertrag versucht also, den Kontostand usw. im Speicher Ihres TestVertrags nachzuschlagen , nicht im eigentlichen Token-Vertrag. Da diese Variablen einfach nicht im TestVertrag vorhanden sind, führen alle derartigen Suchen wahrscheinlich zu einer 0.