Токены Ethereum и десятичные знаки

Как лучше всего работать с десятичными знаками при создании валюты?

Давайте использовать пример. У меня есть KARLCOIN (KARL), и у меня их 1 000 000, а токен имеет 6 знаков после запятой. У этого токена также будет краудфандинг, где 100 KARL = 1 ETH (0,01 ETH/KARL).

Когда я создаю этот контракт, я должен сделать что-то вроде:

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

И затем этот токен также имеет функцию передачи.

Теперь, как я вычисляю, перевожу и отображаю эти суммы? Например, 1 000 000 KARL — это 1 000 000 000 000 наименьшей единицы моей монеты. Назовем его микроКарл, или мк.

Означает ли это, что totalSupply в моем конструкторе должен быть на самом деле 1 000 000 000 000? Когда я перечисляю суммы людям, я перевожу их в mK? По сути, количество Карл * 1 000 000, чтобы привести его в форму микроКарла? Как MyEtherWallet и MetMask узнают, как отображать правильную сумму?

Если бы я использовал web3 для его отображения, я мог бы просто посчитать и отобразить его самостоятельно. Получите сумму в mK, умножьте на 0,000001, а затем отправляйтесь в путь. Верно? Или я тут не в теме?

Я сделал токен и сделал что-то вроде этого (это была долгая ночь) и отправил себе токены, а в MetaMask написано правильное количество. На Etherscan это не так, он показывает гораздо меньшую сумму, а также говорит, что десятичные знаки равны «18», когда MetaMask захватил их как 6, просто вставив адрес контракта.

Я просто немного запутался в десятичном представлении токенов и чувствую, что у меня нет основы того, что я делаю для отладки этого. Любая ясность будет оценена.

Ответы (2)

Если ваш токен соответствует стандарту ERC20 (а так и должно быть, если вы хотите, чтобы он обрабатывался кошельками или клиентскими приложениями), вы можете включить (это не обязательно, но обрабатывается большинством клиентов) информацию о десятичных знаках .

Таким образом, ваш контракт должен содержать что-то вроде:

uint8 public constant decimals = 6;

И ваш код должен предполагать, что суммы указаны в наименьших возможных единицах.

Да, у меня есть десятичные дроби. Но в MetaMask, если я укажу свой идентификатор контракта Token, он автоматически загрузит десятичные числа как «6». На Etherscan написано «18», поэтому отображается неверный баланс токенов. Я считаю, что все остальное я сделал правильно... нужно ли мне проверять контракт на Etherscan, чтобы он правильно считывал десятичные знаки?
Можете ли вы показать объявление десятичных знаков в вашем контракте?
uint8 общедоступные десятичные знаки = 0; функция token() оплачиваемая { владелец = msg.sender; _totalSupply = 1000000000000; балансы[владелец] = _totalSupply; десятичные знаки = 6; символ = "КАРЛ"; } И MetaMask прекрасно это читает и правильно показывает значение.
контракт развернут здесь с 18 десятичными знаками в etherscan и 6 в метамаске: ropsten.etherscan.io/token/…
Что ж... Я нажал на ссылку, которую вы предоставили, и она показывает Token Decimals: 6 для меня.
Хм. Сейчас вроде обновился. Может быть, это занимает 24 часа или около того... Мои другие развертывания этого же контракта также обновились, но новые - нет. Благодарю вас!

Используйте его следующим образом:

uint256 public constant decimals = 6;
uint256 public constant totalSupply = 1000000*10**decimals;
добро пожаловать в сообщество :), убедитесь, что вы немного объяснили свой ответ, для большей читабельности и понятности :)
в блокчейне ethereum общее количество было умножено на 10^-nbr десятичного знака, поэтому в вашем смарт-контракте вы должны умножить его на 10^6, чтобы получить точное число токена.