Я запускаю пример CrowdFunding из документации Solidity и задаюсь вопросом, почему баланс эфира не увеличивается правильно после выполнения checkGoalReached
кода ниже:
function checkGoalReached(uint campaignID) returns (bool reached) {
Campaign storage c = campaigns[campaignID];
if (c.amount < c.fundingGoal)
return false;
uint amount = c.amount;
c.amount = 0;
c.beneficiary.transfer(amount);
return true;
}
Прежде чем запускать эту функцию, я проверил баланс 2-й учетной записи в моем testrpc через, web3.eth.getBalance(web3.eth.accounts[1])
и результат
{ [String: '100000000000000000000'] s: 1, e: 20, c: [ 1000000 ] }
После запуска checkGoalReached
транзакции в testrpc, но после getBalance
повторного запуска, это результат:
{ [String: '100000000000000016000'] s: 1, e: 20, c: [ 1000000, 16000 ] }
Почему исходные 1 000 000 эфира не увеличиваются до 1 016 000, а создают второй элемент в балансе?
Вам нужно преобразовать его из BigNumber. Web3 включает это автоматически.
resultOfgetBalance.toNumber();
И у вас будет правильная сумма. BigNumber хранится в виде массива для вычисления исключительно больших чисел.
УВД
web3.eth.getBalance(accounts[1]).toNumber()
в консоли, я получаю в результате 100000000000000020000'. Я ожидал 1 016 000, все еще не имеет смысла для меня.Диабет Джонс
web3.fromWei(result, 'ether');
и он решит проблему с множеством нулей для вас. Что касается результата 20000 против 16000, я бы предположил, что вы переводите неправильную сумму. Вам было бы полезно немного глубже изучить документацию Solidty относительно десятичной дроби и того, как хранятся значения эфира/токенов.