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.
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:
_totalSupply
auf 0allBurned
und setzen Sie sie auf true
in der burnA()
Funktionrequire(!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, burn
um sie alle auf Null zu setzen.
Sie müssen das balances
Array leeren und _totalSupply
auf 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, _totalSupply
da er bereits auf Null gesetzt ist, speichern Sie den Wert also temporär in einer anderen Variablen, bevor Sie ihn auf Null setzen.)
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, accountIndex
wenn jemand an sie sendet.
Prateek Singhania