Funktion im Smart Contract, damit der Besitzer alle Token verbrennen kann

Ich habe dies versucht:

function burn(uint256 tokens) public returns(bool){
    require(balances[msg.sender] >= tokens);
    balances[msg.sender] = balances[msg.sender].sub(tokens);
    _totalSupply = _totalSupply.sub(tokens);
    Burn(msg.sender, tokens);
}

Dieser Code brennt jedoch nur die Token des Adressbesitzers. Ich möchte, dass der Vertragsinhaber in der Lage ist, alle Token zu brennen und totalSupply auf 0 zu setzen.

Antworten (4)

Wie in den vorherigen Antworten zu sehen ist, wird es unpraktisch und fast unmöglich, alle ihre Guthaben auf 0 zu setzen, wenn Ihr Token an Zehntausende von Inhabern verteilt wird.

Sie können dasselbe erreichen, indem Sie:

  1. setze den _totalSupplyauf 0
  2. Erstellen Sie eine boolesche Variable mit dem Namen allBurnedund setzen Sie sie auf truein der burnA()Funktion
  3. Ändern Sie alle Funktionen, die Gelder verwalten und setzen require(!allBurned)(oder komplexeren Code, der das tut, was Sie wollen)

Dies ist mit einer typischen erc20-Implementierung nicht möglich. Wenn Sie wirklich alles brennen wollten, müssten Sie ein Array aller Adressen behalten, die einen Saldo ungleich Null haben, und dieses Array durchlaufen, burnum sie alle auf Null zu setzen.

Ja, ich stimme zu, dass es nicht möglich ist, es in erc20 zu implementieren, aber das war nur ein Anwendungsfall, den ich zu implementieren versuchte, um das Konzept der Implementierung zu überprüfen. Vielen Dank für Ihre Zeit und Hilfe.

Sie müssen das balancesArray leeren und _totalSupplyauf setzen 0. Um das Array zu leeren, siehe: https://ethereum.stackexchange.com/a/3377/31933

Eine andere Geschichte ist, welche Art von Ereignis Sie auslösen sollten. Ich denke, Sie sollten feuern:

Burn(msg.sender, _totalSupply);

(obwohl Sie den Wert von nicht verwenden können, _totalSupplyda er bereits auf Null gesetzt ist, speichern Sie den Wert also temporär in einer anderen Variablen, bevor Sie ihn auf Null setzen.)

Salden ist kein Array, sondern eine Karte.

Um alle Token auf einmal zu verbrennen, müssten Sie über alle Elemente in Salden iterieren, was ohne Änderungen am Code nicht möglich ist, aber selbst mit diesen Änderungen würde eine solche Transaktion sehr schnell größer als das Blockgaslimit sein Das Token wird von einigen tausend Adressen verwendet.

Hier ist eine Möglichkeit, dies zu tun, ich würde es jedoch nicht empfehlen:

mapping (address => uint) accountBalances;
mapping (uint => address) accountIndex;

uint accountCount;
function burnAllTokens()
{
    for(uint i=0;i<accountCount;i++)
    {
        accountBalances[accountIndex[i]] = 0;
        _totalSupply = 0;
    }
}

Sie müssen natürlich alle Konten speichern, accountIndexwenn jemand an sie sendet.

@Grunzwanling, das hat funktioniert, danke für die Hilfe, Kumpel!