Fichas de Ethereum y decimales

¿Cuál es la mejor manera de manejar los decimales cuando creo una moneda?

Usemos un ejemplo. Tengo KARLCOIN (KARL), y tengo 1,000,000 de ellos, y el token tiene 6 decimales. Este token también tendrá un crowdfund donde 100 KARL = 1 ETH (0.01 ETH/KARL).

Cuando creo este contrato, debo hacer algo como:

// Constructor
 function token() {
    owner = msg.sender;
   totalSupply = 1000000;
  balances[owner] = totalSupply;
  decimals = 6;
  symbol = "KARL";
  }    

Y luego ese token también tiene una función para transferir.

Ahora, ¿cómo estoy calculando, transfiriendo y mostrando estas cantidades? Por ejemplo, 1.000.000 KARL es 1.000.000.000.000 de la unidad más pequeña de mi moneda. Llamémoslo microKarl, o mk.

¿Eso significa que el suministro total en mi constructor debería ser 1,000,000,000,000? Cuando transfiero cantidades a personas, ¿lo estoy transfiriendo en mK? ¿Básicamente la cantidad de Karl * 1,000,000 para ponerlo en su forma de microKarl? ¿Cómo sabrán MyEtherWallet y MetMask y demás cómo mostrar la cantidad correcta?

Si estuviera usando web3 para mostrarlo, podría hacer los cálculos y mostrarlo yo mismo. Obtenga la cantidad en mK, multiplíquela por 0.000001 y luego siga mi camino. ¿Derecha? ¿O estoy fuera de pista aquí?

Hice un token e hice algo como esto (ha sido una noche larga) y me envié los tokens y en MetaMask dice la cantidad correcta. En Etherscan no lo hace, muestra una cantidad mucho menor y también dice que los decimales son "18" cuando MetaMask los tomó como 6 simplemente pegando la dirección del contrato.

Estoy un poco confundido sobre la decimalización de tokens y siento que no tengo la base de lo que estoy haciendo para depurar esto. Cualquier claridad sería apreciada.

Respuestas (2)

Si su token sigue el estándar ERC20 (y debería hacerlo si desea que lo manejen billeteras o aplicaciones de clientes), puede incluir (no es obligatorio pero lo manejan la mayoría de los clientes) información de decimales .

Entonces su contrato debe contener algo como:

uint8 public constant decimals = 6;

Y su código debe asumir que las cantidades están en las unidades más pequeñas posibles.

Sí, tengo los decimales. Pero en MetaMask, si coloco mi ID de contrato de Token, carga los decimales automáticamente como "6". En Etherscan, dice "18" y, por lo tanto, muestra un saldo incorrecto de las fichas. Creo que hice el resto correctamente... ¿Necesito verificar el contrato en Etherscan para que lea los decimales correctamente?
¿Puede mostrar la declaración de decimales en su contrato?
uint8 decimales públicos = 0; token de función () a pagar { propietario = msg.sender; _suministrototal = 1000000000000; saldos[propietario] = _totalSupply; decimales = 6; símbolo = "KARL"; } Y MetaMask puede leer esto muy bien y muestra el valor correctamente.
el contrato se implementa aquí con 18 decimales en etherscan y 6 en metamask: ropsten.etherscan.io/token/…
Bueno... Hice clic en el enlace que me proporcionó y me muestra Token Decimals: 6.
Hm. Parece que se ha actualizado ahora. Tal vez solo tome 24 horas más o menos... mis otras implementaciones de este mismo contrato ahora también se han actualizado, pero las nuevas no. ¡Gracias!

Úselo de la siguiente manera:

uint256 public constant decimals = 6;
uint256 public constant totalSupply = 1000000*10**decimals;
bienvenido a la comunidad :), asegúrese de explicar un poco su respuesta, para una mayor legibilidad y capacidad de comprensión :)
en ethereum blockchain, el suministro total se multiplicó por 10 ^ -nbr de decimal, por eso en su contrato inteligente debe multiplicarlo por 10 ^ 6 para obtener su número exacto de token