Ich habe das Eigentum an meinem Token auf meinen Crowdsale übertragen, wie übertrage ich es zurück?

Ich habe hier 2 Lösungen gesehen und sie haben für andere funktioniert, aber sie funktionieren nicht für mich. Ich habe kein Problem damit, das Eigentum an den Crowdsale zu übertragen, aber wie codiere ich es, um das Eigentum an dem Token zurück auf mein Hauptkonto übertragen zu können?

Ich habe eine Funktion dafür erstellt, und sie gibt mir keine Fehler, sie wird sogar ohne Probleme ausgeführt, aber sie ändert nie den Eigentümer. Hier ist der Teilcode meines Crowdsale:

pragma solidity ^0.4.16;



/**
 * @title Owned
 * @dev The Owned contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Owned {
  address public owner;



  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
  event TokenOwnershipTransferred(address indexed _newOwner, address indexed _previousOwner);


  /**
   * @dev The Owned constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Owned() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    emit OwnershipTransferred(owner, newOwner);
    owner = newOwner;
}


    function transferTokenOwnership(address _newOwner) public onlyOwner {
    require(_newOwner != address(0));
     emit TokenOwnershipTransferred(owner, _newOwner);
     owner = _newOwner;

}
}

interface token {
    function mint(address receiver, uint amount) external;

}


library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

contract FCCCrowdsale is Owned{
    using SafeMath for uint256;

    address public beneficiary;
    uint256 public fundingGoal;
    uint256 public amountRaised;
    uint256 public openingTime;
    uint256 public closingTime;
    uint256 public initialRate;
    uint256 public finalRate;
    token public tokenReward;


    mapping(address => uint256) public balanceOf;

    bool fundingGoalReached = false;
    bool crowdsaleClosed = false;

    event GoalReached(address recipient, uint totalAmountRaised);
    event FundTransfer(address backer, uint amount, bool isContribution);

      event Closed();
Können Sie mehr Details darüber geben, wie Sie versuchen, die Funktion aufzurufen, um den Besitz zurückzuübertragen? Ich bin mir auch nicht sicher, warum Sie zwei verschiedene Eigentumsübertragungsfunktionen haben? Es gibt keinen klaren Grund, warum Sie sich für diese beiden entschieden haben, und ich vermute, das ist wahrscheinlich der Grund, warum Sie auf ein Problem stoßen, aber ohne weitere Informationen darüber, wie Sie das Eigentum zunächst weitergeben und wie Sie versuchen, zu bestehen es ist nicht möglich, eine Lösung zu finden.
1. Funktion dient dazu, das Eigentum am Crowdsale-Vertrag zu übertragen und die 2., um das Eigentum am eigentlichen Token zu übertragen. Ich habe nicht die Absicht, jemals das Eigentum an dem Crowdsale zu übertragen, aber ich bin mir nicht sicher, warum dies zu Problemen bei dem Versuch führen würde, den Token selbst zu übertragen. Ich könnte es mit nur einem versuchen, aber der Crowdsale muss in der Tat besessen werden.

Antworten (2)

Wie @btc4cash sagte, können Sie das nicht, es sei denn, Sie schreiben den Crowd-Sale-Vertrag so, dass er das Eigentum zurück übertragen kann.

Sehen Sie sich diesen Beispielcode an:

pragma solidity ^0.4.17;

contract Token{
    address public owner;

    function transferOwnerShip(address _newOwner) public {
        require (msg.sender == owner);
        owner = _newOwner;
    }

    function Token() public{
        owner = msg.sender;
    }
}


contract Crowdsale{
    Token tokenContract;
    address crowdsaleOwner;

    function Crowdsale(address _tokenAddress) public {
      tokenContract = Token(_tokenAddress);
      crowdsaleOwner = msg.sender;
    }


    function transferOwnerShipBack(address _newOwner) public {
        require(msg.sender == crowdsaleOwner);
        tokenContract.transferOwnerShip(_newOwner);
    }
}

Sie können die transferOwnerShipBackMethode des Crowdsale-Vertrags ausführen, um das Eigentum an einen neuen Benutzer zu übertragen.

PS: Dies war nur zu Demozwecken. Testen Sie vor dem Einsatz in der Produktion.

Bearbeiten 1: Erläuterung zu den Code-Arbeiten Da es sehr klar ist, dass Smart Contracts nur das ausführen können, was ihr Code zulässt. Wenn Sie also das Eigentum an Ihrem Crowdsale-Vertrag übertragen müssen , muss der Crowdsale-Vertrag über eine Methode zur Rückübertragung des Eigentums verfügen. Das obige Codebeispiel macht genau dasselbe.

Lassen Sie mich das ganz klar sagen, es gibt 2 Verträge Token und Crowdsale und beide müssen separat bereitgestellt werden.

  • Öffnen Sie den Remix Compiler (oder wählen Sie andere Methoden, wenn Sie möchten)
  • Fügen Sie den obigen Code in den Editor ein
  • Dort haben Sie 5 Konten (bei Verwendung von Javascript VM). Nennen wir Konten mit Acc1, Acc2 ...
  • Stellen Sie den Token -Vertrag von Acc1 bereit .
  • Kopieren Sie die Token-Vertragsadresse und übergeben Sie diese beim Bereitstellen als Konstruktorargument Crowdsale contract. Stellen Sie den Crowdsale-Vertrag von Acc2 bereit.
  • Rufen Sie die Methode transferOwnership von Token Contact von Acc1 auf und übertragen Sie das Eigentum an Crowdsale Contract.
  • Jetzt können Sie überprüfen, ob Token contractder Crowdsale-Vertrag Eigentümer ist.
  • Wenn Sie nun das Eigentum an Token COntract an Acc1 zurückübertragen müssen. Rufen transferOwnershipBackSie einfach Crowdsale Contract von Acc2 auf und übergeben Sie Acc1 als Argument.

Ich habe ein Beispiel für mehrere Konten genommen, nur um zu zeigen, dass beide Verträge unabhängig sind und sich auch dann verhalten können, wenn sie unterschiedliche Eigentümer haben. Sie können dasselbe auch mit einem einzigen Konto tun, wenn Sie die Dinge nicht komplizieren möchten.

Danke Prashant, ich werde das versuchen. Die andere Lösung soll so ziemlich dasselbe tun, war aber nicht so umfassend wie Ihr Beispiel. Ich lasse euch wissen, wie es klappt!
OK, also habe ich das versucht, und es gibt mir einen TypeError: Member „transferOwnership“ nicht gefunden oder nicht sichtbar nach argumentabhängiger Suche im Vertrag Token tokenContract.transferOwnership. Ich werde etwas anderes versuchen. Ich denke, es hat vielleicht mit den @param-Kommentaren zu tun.
Ich habe die Fehler beseitigt, es bereitgestellt und jetzt gibt es mir eine immer fehlgeschlagene Transaktion oder ein zu hohes Gaslimit. Ich bin ratlos.
Dies ist kein gültiges Problem. Eine wichtige Änderung an der Funktion „Eigentümer zurück übertragen“ ist, dass der Modifikator onlyOwner ersetzt wurde, indem verlangt wurde, dass der Absender der Vertragseigentümer sein muss, was der GLEICHE ist. Sehr schwache Antwort.
Ja, die neue Funktion war genau die gleiche. Aus diesem Grund hat es eine Schleife durchlaufen und wurde nicht ausgeführt. Ich habe das herausgefunden und wollte zurückkommen und es kommentieren, sobald ich die Dinge sortiert habe.
@btc4cash Ja, ich habe nicht den OnlyOnwer-Modifikator hinzugefügt, sondern ihn durch die require-Anweisung ersetzt. Da dies, wie ich bereits erwähnte, ein Democode war, werden beim Schreiben eines Modifikators weitere Codezeilen hinzugefügt. Dies diente lediglich der Vereinfachung. Übrigens können Sie darauf hinweisen, warum Sie die Antwortwoche finden?
Da die zurück zu übertragende Funktion genau dasselbe tut wie das Original, wird modifier nur durch die require-Anweisung ersetzt, die dasselbe tut. Wenn Sie einen neuen Eigentümer festlegen, kann nur der neue Eigentümer dies rückgängig machen. Es ist nicht das OP-Ziel.
Wenn op den Vertrag selbst als neuer Eigentümer festgelegt hat, kann er dies nicht rückgängig machen.
Und wenn er X als neuen Eigentümer festlegt, kann nur X zurückkehren.
Mann, die transferOwnerShipFunktion wird in den Token-Vertrag aufgenommen und transferOwnerShipBackist im Crowdsale-Vertrag. Beide können denselben Benutzer haben oder nicht. Wenn also das Eigentum an Crowdsale übertragen wird, kann der Crowdsale-Eigentümer es zurück übertragen.
Du hast das Konzept nicht verstanden. Es ist nicht dieselbe Funktion zweimal geschrieben. Wenn Sie wenig Aufmerksamkeit schenken, werden Sie sehen, dass es 2 Verträge gibt, die separat bereitgestellt werden müssen. Und Sie müssen nur Token Contract extern anrufen, um das Eigentum zurück zu übertragen.
Lass uns nicht streiten. Prashant, ich nahm an, Sie meinten, der Code sollte in jeden Vertrag aufgenommen werden, war mir aber nicht sicher, und ich bin mir nicht sicher, ob ich ihn richtig codiert habe, wie Sie es meinten. Das führt mich jetzt jedoch zu einer anderen Frage, wie für den Crowdsale-Vertrag, sollte ich die Token-Datei importieren? So wie es aussieht, „Token tokenContract;“ wirft einen Fehler als nicht identifiziert.
Ja, Sie können den Token-Vertrag einschließen, oder sogar die Token-Vertragsschnittstelle reicht aus. Deklarieren Sie einfach die Methoden und schreiben Sie die Implementierung nicht in Crowd Safe.
Leider hat das nicht funktioniert. Wirf alle Arten von Fehlern. Dann, nach einigen Optimierungen, brachte ich es dazu, es bereitzustellen und auszuführen, aber es übertrug das Eigentum immer wieder direkt zurück an den Crowdsale-Vertrag.
Lassen Sie mich die Antwort bearbeiten.
Aktualisiert. Sehen Sie, ob dies Ihre Frage löst.
Danke für deine Hilfe und Geduld Prashant. Ich bin mir nicht sicher, warum das bei mir nicht funktioniert. Das Problem, das ich habe, ist das 'tokenContract.transferOwnerShip(_newOwner);' wirft bei mir immer einen Fehler. "Member "transferOwnership" nicht gefunden oder nach argumentabhängiger Suche im Vertragstoken nicht sichtbar. Ich habe einen anderen Weg versucht, indem ich ein Ereignis erstellt habe. Keine Fehler, und ich kann die Funktion ausführen, die nur die Übertragung des Eigentums verweigert. Hier ist der vollständige Code, damit Sie vielleicht sehen können, was ich falsch mache
Sie verwenden die tokenSchnittstelle, um Ihren Token-Vertrag darzustellen. Daher muss die Schnittstelle die Signatur aller Methoden haben, die Sie verwenden möchten. Fügen Sie einfach eine function transferOwnership(address) external;Zeile hinzu interface tokenund das sollte gut funktionieren.

Sie können nicht.

Bearbeiten:

Wie gesagt, was ich mache, ist, dass das ICO das Token im Konstruktor erstellt und der Konstruktor des Tokens selbst die ICO-Adresse als Parameter akzeptiert. Auf diese Weise haben Sie einen Eigentümer UND die ICO-Adresse im Token.

Tatsächlicher Code, den ich sehe, ist, dass nur der Besitzer das Eigentum übertragen kann und nicht auf sich selbst. Nach der Übertragung kann also nur der neue Eigentümer das Eigentum aufgrund des Modifizierers onlyOwner zurückübertragen.

Wenn es diesen Modifikator nicht gäbe, könnte jeder das Eigentum übertragen, was offensichtlich keine gute Idee ist :)

Genau, das will ich definitiv nicht. Aber es gibt Leute, die das geschafft haben, aber aus irgendeinem Grund funktioniert ihre Saite nicht. Hier ist ein Link zu einer Lösung, aber ich kann nicht sehen, was ich falsch mache. : ethereum.stackexchange.com/questions/34184/…
Ich habe gerade den Link überprüft, es ist auch ein Unsinn. Der Vertrag kann nicht selbst eine Funktion aufrufen, die jemand zum Aufrufen benötigt. Selbst die Übergabe des Eigentums an den Vertrag selbst wird also immer noch das Problem haben, dass jeder das Eigentumsschiff jederzeit an den vorherigen Eigentümer oder am schlimmsten an sich selbst zurückübertragen kann.
Exakt. Ich habe einen Fall gesehen, in dem jemand sagte, dass es funktioniert. Ich kann diesen Thread jedoch nicht mehr finden, aber der Code war sehr ähnlich, wenn auch nicht genau. Ich habe es jetzt zweimal geschafft, es auf verschiedene Arten zu codieren, damit es die Funktion tatsächlich ausführt, es gibt einfach nicht den Besitz an die neue Adresse, der Crowdsale gibt den Besitz immer wieder an sich selbst zurück. Und es muss eine "onlyOwner"-Funktion sein, sonst wäre mein Verkauf/Token zum Scheitern verurteilt. Ich muss das vielleicht einfach anders betrachten und einfach einen festen Verkauf machen und keinen mintable.
Wenn Sie finden, senden Sie mir :), was ich tue, veröffentliche ICO, der Auftragnehmer davon erstellt den Token und liefert den Eigentümer UND die ICO-Adresse, auf diese Weise kann ICO Token prägen. :)
Ich habe es so eingerichtet, aber ich möchte immer noch die Kontrolle über die Token im Nachhinein haben. Nehmen wir an, wenn es Ermittlungen gibt und die Regierung meine Hilfe für ein Konto anfordert, das sie verfolgen, kann ich es einfrieren. Oder (weil ich einen Marktplatz erstelle), nehmen wir an, ein Verkäufer schickt einem Käufer ein Produkt, das nicht der Beschreibung entspricht. aber sie haben ihren Token bereits ausgezahlt. Ich könnte dem Käufer immer noch den Kauf von neuen Token erstatten und das Konto des Verkäufers auf unbestimmte Zeit einfrieren.
Warum willst du dann das Eigentum abgeben? Warum verwenden Sie nicht einfach ein Konto als Eigentümer?
Ich kann nicht, weil sowohl der Token-Vertrag als auch der Crowdsale-Vertrag Eigentum benötigen. Der Crowdsale braucht es, um Token zu prägen.
Wie gesagt, was ich mache, ist, dass das ICO das Token im Konstruktor erstellt und der Konstruktor des Tokens selbst die ICO-Adresse als Parameter akzeptiert. Auf diese Weise haben Sie einen Eigentümer UND die ICO-Adresse im Token :)
urkomisch! Ich mag deine Denkweise. Ich frage mich, warum jemand es anders machen würde? Ich musste wirklich darüber nachdenken, was du gesagt hast, aber ja, ich werde die Münze einfach innerhalb des Crowdsale erstellen und boom, ich habe das Eigentum an allem, ohne etwas übertragen zu müssen! Sobald der zeitgesteuerte Crowdsale vorbei ist, wird diese Funktion veraltet. Danke! Werde es ausprobieren und berichten wie es geklappt hat. Sollte aber gut funktionieren.
Ja, und wenn der Crowdsale abgeschlossen ist, können die Leute immer noch mit dem Token ohne den Corwdsale interagieren :)
Bei dieser Methode ist ein Problem aufgetreten. Es ist die gleiche Situation wie zuvor. Um Token zu prägen, benötigt dieser Vertrag das Eigentum an sich selbst. Also muss ich noch Eigentum von dem Konto, das diesen Vertrag erstellt hat, auf diesen Vertrag übertragen. Also nach dem Verkauf kann ich nichts machen. Das ist eigentlich schlimmer als vorher, weil ich wenigstens Rückerstattungen schicken konnte. Dies sperrt und friert einfach alles ein, also muss ich noch herausfinden, wie ich den Besitz zurückübertragen kann.