Solidity
當我們使用小數時,實際轉移了多少代幣
我在下面有一個程式碼,當我將 1,695,000,000 轉移到特定地址時,實際上正在轉移 0.000000001695。為什麼會這樣?這是否意味著要轉移 16.95 億個代幣,我需要放 18 個前導 0。這是程式碼:
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); } }
您的代幣以 X 位小數(在您的情況下為 18)除。預設情況下(並且按照慣例)轉賬基於可能的最低金額,因此轉賬中不會有十進制數字。因此,轉移數量 1 意味著轉移 0.000000000000000001(17 個零)令牌。
我想這主要是為了讓我們不需要處理需要更多儲存空間並且程序更難理解的小數。乙太幣的工作方式相同。
呼叫函式轉賬(transfer)時,需要將參數’amount’乘以10**uint(decimals)。那會做的。
這很棘手,因為僅當您直接呼叫傳輸函式時才需要這樣做。如果你從你的錢包到任何其他地址進行交易,你不需要這樣做,因為錢包會“知道”你在合約中使用了特定的小數位數。單獨的“轉移”功能不知道這一點。
注意:傳輸函式應該在合約主體內。