¿Cómo .transfer obtiene ether en una cuenta de testrpc?

Estoy ejecutando el ejemplo de CrowdFunding de los documentos de Solidity y me pregunto por qué el saldo de éter no aumenta correctamente después de ejecutar checkGoalReachedel siguiente código:

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;
    }

Antes de ejecutar esta función, verifiqué el saldo de la segunda cuenta en mi testrpc vía web3.eth.getBalance(web3.eth.accounts[1])y el resultado es

{ [String: '100000000000000000000'] s: 1, e: 20, c: [ 1000000 ] }

Después de ejecutar checkGoalReacheduna publicación de transacción en testrpc pero después de ejecutarla getBalancenuevamente, este es el resultado:

{ [String: '100000000000000016000'] s: 1, e: 20, c: [ 1000000, 16000 ] }

¿Por qué el éter original de 1,000,000 no aumenta a 1,016,000 sino que crea un segundo elemento en el balance?

Respuestas (1)

Necesitas convertirlo de BigNumber. Web3 incluye esto automáticamente.

resultOfgetBalance.toNumber();

Y tendrás tu cantidad correcta. BigNumber se almacena como una matriz para calcular números excepcionalmente grandes.

Al ejecutar web3.eth.getBalance(accounts[1]).toNumber()en la consola, obtengo 100000000000000020000' como resultado. Esperaba 1.016.000, todavía no tiene sentido para mí.
Obtienes la cantidad en wei, no en éter. son 18 decimales delineados. Pase el resultado a web3.fromWei(result, 'ether');y solucionará el problema de muchos ceros. En cuanto al resultado de 20000 vs 16000, supongo que se está transfiriendo la cantidad incorrecta. Le beneficiaría profundizar un poco más en la documentación de Solidty con respecto a la decimalización y cómo se almacenan los valores de Ether/tokens.