Как .transfer получает эфир на счет testrpc?

Я запускаю пример 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, а создают второй элемент в балансе?

Ответы (1)

Вам нужно преобразовать его из BigNumber. Web3 включает это автоматически.

resultOfgetBalance.toNumber();

И у вас будет правильная сумма. BigNumber хранится в виде массива для вычисления исключительно больших чисел.

Запустив web3.eth.getBalance(accounts[1]).toNumber()в консоли, я получаю в результате 100000000000000020000'. Я ожидал 1 016 000, все еще не имеет смысла для меня.
Вы получаете сумму в вей, а не в эфире. это 18 знаков после запятой. Передайте результат, web3.fromWei(result, 'ether');и он решит проблему с множеством нулей для вас. Что касается результата 20000 против 16000, я бы предположил, что вы переводите неправильную сумму. Вам было бы полезно немного глубже изучить документацию Solidty относительно десятичной дроби и того, как хранятся значения эфира/токенов.