Wie viele Token werden tatsächlich übertragen, wenn wir Dezimalzahlen verwenden?

Ich habe einen Code unten und wenn ich 1.695.000.000 an eine bestimmte Adresse überweise, werden tatsächlich 0,000000001695 übertragen. Wieso ist es so? Heißt das, um 1,695 Milliarden Token zu übertragen, muss ich 18 führende Nullen setzen. Hier ist der Code:

function transfer(address _to, uint256 _amount) public returns (bool success) {
    require(_to != address(0));
    require(balances[msg.sender] >= _amount && _amount > 0
        && balances[_to].add(_amount) > balances[_to]);

    // SafeMath.sub will throw if there is not enough balance.
    balances[msg.sender] = balances[msg.sender].sub(_amount);
    balances[_to] = balances[_to].add(_amount);
    Transfer(msg.sender, _to, _amount);
    return true;
  }


contract SomeToken is MintableToken, BurnableToken {
     string public name ;
     string public symbol ;
     uint8 public decimals = 18 ;

     /**
     *@dev users sending ether to this contract will be reverted. Any ether sent to the contract will be sent back to the caller
     */
     function ()public payable {
         revert();
     }

     /**
     * @dev Constructor function to initialize the initial supply of token to the creator of the contract
     * @param initialSupply The initial supply of tokens which will be fixed through out
     * @param tokenName The name of the token
     * @param tokenSymbol The symbol of the token
     */
     function SomeToken(
            uint256 initialSupply,
            string tokenName,
            string tokenSymbol
         ) public {
         totalSupply = initialSupply.mul( 10 ** uint256(decimals)); //Update total supply with the decimal amount
         name = tokenName;
         symbol = tokenSymbol;
         balances[msg.sender] = totalSupply;

         //Emitting transfer event since assigning all tokens to the creator also corresponds to the transfer of tokens to the creator
         Transfer(address(0), msg.sender, totalSupply);
     }
}
Aber das wirft einen Fehler. Angenommen, mein Gesamtvorrat beträgt 5.000.000.000, und wenn ich versuche, auf 2 Milliarden mit 18 führenden Nullen zu übertragen, wird im Remix ein Fehler angezeigt: "SomeToken.transfer errored: Error encoding arguments: Error: Assertion failed ".
Sie müssen diese Zeile hinzufügentokenCount ** uint256(decimals)
Anstatt führende Nullen hinzuzufügen, aktualisieren Sie Ihren Vertrag mit der obigen Zeile für den TokenCount
Können Sie bitte kurz erläutern, wo diese Zeile hinzugefügt wird.
Aktualisieren Sie den Code mit Übertragungsfunktion in Ihrem Vertrag
Erwägen Sie, die Antworten positiv zu bewerten, wenn Sie sie nützlich finden.

Antworten (2)

Ihre Token sind in X Dezimalstellen unterteilt (18 in Ihrem Fall). Standardmäßig (und per Konvention) basieren Überweisungen auf dem kleinstmöglichen Betrag, damit Überweisungen keine Dezimalzahlen enthalten. Daher bedeutet die Übertragung eines Mounts von 1 die Übertragung von 0,000000000000000001 (17 Nullen) Token.

Ich würde mir vorstellen, dass dies hauptsächlich so ist, dass wir uns nicht mit Bruchzahlen befassen müssen, die mehr Speicherplatz erfordern würden und für Programme schwieriger zu verstehen sind. Äther funktioniert genauso.

Wenn Sie die Funktion zum Übertragen der Coins (Überweisung) aufrufen, müssen Sie den Parameter „amount“ mit 10**uint(decimals) multiplizieren. Das wird reichen.

Dies ist schwierig, da dies nur erforderlich ist, wenn Sie die Übertragungsfunktion direkt aufrufen. Wenn Sie eine Transaktion von Ihrer Brieftasche zu einer anderen Adresse durchführen, müssen Sie dies nicht tun, da die Brieftasche "weiß", dass Sie in Ihrem Vertrag eine bestimmte Anzahl von Dezimalstellen verwenden. Die Funktion 'Übertragen' allein kennt dies nicht.

Hinweis: Die Übertragungsfunktion sollte sich im Vertragstext befinden.