¿Qué significan las claves 'balance', 'extraBalance' y 'extraBalanceAccount' en el dao-hardfork?

La lista de 58 cuentas afectadas durante el hardfork de DAO está disponible aquí: https://github.com/ethereum/go-ethereum/blob/5f55d95aea433ef97c48ae927835d833772350de/params/dao.go#L67

La lista tiene cuatro claves: [dirección, saldo, saldo extra, cuenta de saldo extra], cuál es el significado de las claves 'saldo', 'saldo extra' y 'cuenta de saldo extra'.

Una posible explicación es que la tecla 'saldo' significa el saldo en la cuenta antes de la bifurcación. Esto no es cierto para las siguientes cuentas:

0x2c19c7f9ae8b751e37aeb2d93a699722395ae18f,
0x319f70bab6845585f412ec7724b744fec6095c85, 
0x779543a0491a837ca36ce8c635d6154e3c4911a6,
0x5c6e67ccd5849c0d29219c4f95f1a7a93b3f5dc5, 
0x6b0c4d41ba9ab8d8cfb5d379c69a612f2ced8ecb,  
0xd1ac8b1ef1b69ff51d1d401a476e7e612414f091,  
0xf0b1aa0eb660754448a7937c022e30aa692fe0c5, 
0xe308bd1ac5fda103967359b2712dd89deffb7973, 
0xac1ecab32727358dba8962a0f3b261731aad9723, 
0x304a554a310c7e546dfe434669c62820b7d83490, 
0x84ef4b2357079cd7a7c69fd7a37cd0609a679106, 
0xbb9bc244d798123fde783fcc1c72d3bb8c189413, 

Como ejemplo: el saldo en la dirección 0x2c19c7f9ae8b751e37aeb2d93a699722395ae18fantes de la bifurcación no coincide con el saldo mencionado en la lista JSON

>>> w3.eth.getBalance(to_checksum_address('0x2c19c7f9ae8b751e37aeb2d93a699722395ae18f'), 1920000-1)
8519214441755701
>>> hex_to_integer('b14e8feab1ff435')
798519214441755701

Respuestas (1)

El único campo utilizado de esa lista es address, todos los demás campos probablemente sean solo informativos.

Puedes comprobar esto en consensus/misc/dao.go:

// ApplyDAOHardFork modifies the state database according to the DAO hard-fork
// rules, transferring all balances of a set of DAO accounts to a single refund
// contract.
func ApplyDAOHardFork(statedb *state.StateDB) {
    // Retrieve the contract to refund balances into
    if !statedb.Exist(params.DAORefundContract) {
        statedb.CreateAccount(params.DAORefundContract)
    }

    // Move every DAO account and extra-balance account funds into the refund contract
    for _, addr := range params.DAODrainList() {
        statedb.AddBalance(params.DAORefundContract, statedb.GetBalance(addr))
        statedb.SetBalance(addr, new(big.Int))
    }
}

Como puede ver, solo addrse utiliza la dirección. Obtiene el saldo (cualquier saldo que tenga) usando statedb.GetBalance(addr)y lo agrega al contrato de reembolso DAO constatedb.AddBalance(params.DAORefundContract,....)

Y hay una cosa, el código de la bifurcación no puede saber cuánto saldo tendrá una cuenta en el bloque 1920000, por lo que no podría haber ningún cálculo previo de los saldos de las cuentas. Porque para aplicar el tenedor hay que distribuir el código fuente a los mineros y esto no se hace en unos minutos.

Si desea verificar que la bifurcación se aplicó correctamente, simplemente verifique el hash de bloque o el hash de raíz de estado.